Views and schedules
Put what your team goes through together on one page: a few headline numbers, charts under tabs, the rows of a table, a form that adds to it, and one period for all of them. Your AI writes a view as a short file, and Alcoven draws it for each person; a link you send opens the same tab and period for a teammate. A schedule, another short file, emails a view or adds a row on a timetable.
A view is a file ending in .view.md, in any folder of an Alcoven project. It holds a title, a few lines, and blocks on a 12-column grid, with tabs when you want them. A block draws one of these: a widget file; a number, a line, bars, a table, a list or a funnel from its own lines; the rows of a table in the project; a form that adds a row to a table; or a few words. Alcoven checks every line, draws the page for each person with the numbers and rows they can see, and names the line to fix when one can’t be read. People change a view the way they change any file, and every change is a new version.
A schedule is a file ending in .schedule.md. Alcoven runs it on its timetable, as the person who keeps it, to email a view to the people who can open it, add a row to a table, write the numbers in a document or refresh a view’s sources. Schedules has every line.
For example, Corvid, an imagined studio relaunching a bank’s app, keeps the page its account lead goes through with the bank every other Tuesday in reports/client.view.md. Where the app shows a person’s name, this page says who they are to you:
# Bank launch: client report
- Period: 28 days
- On home: yes
Why it's here: the page we go through with the bank every other Tuesday.
### Sign-ups
- Widget: app/sign-ups.widget.md
- Span: 3
### Spend
- Show: number
- Measure: spend
- From: ads/campaign.source.md
- Compare: the period before
- Span: 3
### Store rating
- Show: number
- Measure: rating
- From: app/store.source.md
- Span: 3
### Questions open with the bank
- Show: number
- Measure: open notes
- From: this project
- Span: 3
## Campaign
### Sign-ups by channel
- Show: bars
- Measure: sign-ups
- From: ads/campaign.source.md
- By: channel
- Span: 8
### What we changed
- Show: text
- Span: 4
Budget moved from display to search on 14 Oct.
### Spend and sign-ups by week
- Show: line
- Measure: spend, sign-ups
- From: ads/campaign.source.md
- By: week
- Span: 12
## App
### Getting started in the pilot
- Widget: app/getting-started.widget.md
- Span: 6
### Store rating over time
- Show: line
- Measure: rating
- From: app/store.source.md
- Since: 90 days
- Period: own
- Span: 6The four numbers above the tabs show on both tabs, Campaign and App. When the file is checked, Alcoven answers “reports/client.view.md: 2 tabs, 9 blocks; Alcoven reads every line.”, then what each block shows now.
Ask your AI for one
Ask the AI you work with, in your words, for example:
- “Make a view of sign-ups by week and the getting-started funnel, with a tab for the app.”
- “Put the four numbers the bank asks about at the top of one page, with a period I can change during the call.”
- “Make a page for Monday’s stand-up: open tasks by person, changes by day, and what is waiting for agreement.”
- “Add a tab to the client report with the store rating over 90 days.”
- “Make a page for the pilot: the branches with no first payment yet, and a form to note a call in pilot/calls.csv.”
- “Every Monday at 08:00, add the week’s numbers to ops/weekly.csv and email the weekly numbers page to everyone who can open it.”
Claude, Claude Code, Codex or another AI app with Alcoven added (how to add it) asks Alcoven for the format, checks its draft, shows it to you and writes it when you say yes, for a view and for a schedule alike. In Alcoven, ask the project at the foot of its home, or, on a project with no views yet, press Start one in the chat on All views: the project’s agent proposes the file, and you put it on record. To change a view later, choose Change it in its ⋯ menu, say what, like “add a tab for the app”, and press Ask the project.
A view, line by line
The title, then the view’s own lines, then one line on why the view is there, shown under the title on the page and in every list. Every line in the table below is optional, and so is the Why line.
| Line | What it takes |
|---|---|
Period | Where the period picker starts: 7 days, 28 days, 90 days, this month, last month, this quarter or this year. none leaves the picker out. With no Period line there is no picker, and each block keeps its own Since. |
Filter | One or two fields or columns, like Filter: manager, channel. Each gets a menu at the top of the page, which keeps every block whose source has that field or column to the value you choose (below). |
On home | yes, to list the view on the project’s home. Home lists six at most. |
Owner | The member id of who keeps the view, like m-4f2k9a. Whoever wrote the file if left out. |
Tabs and blocks
- A
###heading starts a block, and the heading is its title. A##heading starts a tab, in file order, up to 8 tabs. With no##heading, the view is one page with no tabs. - Blocks before the first tab show above the tabs, on every tab. A tab holds up to 24 blocks, and so does the space above the tabs.
- Each block and each tab has a § address, its heading’s slug:
reports/client.view.md#spendfor a block,#campaignfor a tab. When two blocks share a title, the second one’s address ends-2, and the check suggests another title.
Blocks
A block draws a widget file (a Widget line) or its own lines (a Show line), never both.
| Line | What it takes |
|---|---|
Widget | A .widget.md path. The block draws that widget file as it is, with the view’s period in place of its Since. |
Show | number, line, bars, table, list, funnel, rows, form or text, for a block that draws its own lines. Or phase, next, focus, missing, done or built, for a block that draws part of the project’s home from its focus file (the focus guide says what each shows). |
Period | own: the block keeps its own Since, and a rows block all its rows, whatever the picker says. A text block and a form take no Period line. |
Span | The block’s width on the grid, from 1 to 12 columns (below). |
A chart block, one with a Show line of number, line, bars, table, list or funnel, reads a widget’s own lines as well: Measure, From, By, Since, Compare, Mark, Steps and Within, each as in a widget file (every widget line). Lines only a widget file takes, such as On home or Size, aren’t read in a block, and the check says so. Use a Widget line for a number you also show on home or in a document, so it has one file. A list from this project with Measure: open notes or Measure: open tasks lists them as they stand now, each linking to its place.
A rows block and a form have lines of their own, under Tables and forms.
A text block shows its words: write them after a blank line under its lines, as Markdown (links, lists, #### headings). HTML in it shows as text and never runs. Any other block may have a line of words under it too, shown under its drawing.
Six blocks draw parts of the project’s home from its focus file: phase, next, focus, missing, done and built. The focus guide says what each shows and the lines it takes.
Tables and forms
A rows block shows the rows of a table in the project, and a form adds a row to one. The table is a CSV or TSV file in the project, named by its path or by the .source.md that reads it, or a sheet in Google Sheets, named by its .source.md (tables as sources).
For example, Corvid keeps the pilot’s branches in pilot/branches.csv, one row a branch with its manager and the day it reached each step, and the team’s calls in pilot/calls.csv. The table’s source, pilot/branches.source.md, names the invited column as its days and the steps invited, trained, first login and first payment (steps in a source). Its developer keeps the page the team works from in pilot/console.view.md:
# Pilot console
- Period: 90 days
- Filter: manager
Why it's here: which pilot branches stopped before their first payment, and the calls about them.
### Getting started
- Show: funnel
- Measure: getting started
- From: pilot/branches.source.md
- Within: 90 days
- Span: 8
### Note a call
- Show: form
- Adds to: pilot/calls.csv
- Fields: date (today), branch (from pilot/branches.csv), what (call, email, visit), note (long), by (me)
- Button: Note the call
- Span: 4
### Not paid yet
- Show: rows
- From: pilot/branches.csv
- Columns: branch, manager, first login
- Where: first login is not empty and first payment is empty
- Sort: first login, oldest first
- Span: 6
### Where each branch got to
- Show: rows
- From: pilot/branches.source.md
- Columns: branch, manager
- Group: step
- Period: own
- Span: 6Alcoven answers “pilot/console.view.md: one page, 4 blocks; Alcoven reads every line.”, then what each block shows now. The picker’s 90 days keep the funnel and Not paid yet to the branches invited in them, and Where each branch got to keeps every branch. The Filter line puts a Manager menu at the top, which the funnel and both rows blocks follow, since the table has a manager column.
A table’s rows
A block with Show: rows shows a table’s rows, after the view’s period and filters and its own lines:
| Line | What it takes |
|---|---|
From | The table: a CSV or TSV file in the project, or the .source.md of one or of a sheet. Needed. |
Columns | The columns to show, in order, like Columns: branch, manager, first login. Every column when left out. |
Where | Up to 3 conditions joined by “and”, like Where: first login is not empty and first payment is empty (below). |
Sort | A column, then largest first, smallest first, newest first, oldest first, A to Z or Z to A, like Sort: first login, oldest first. With the column alone, Alcoven goes by what it holds: numbers largest first, days newest first, words A to Z. Empty cells go last. With no Sort line, the rows keep the table’s order. |
Group | One column, like Group: stage. The rows show in sections, one under another, each headed by its value and how many rows it has, in the order the values first appear. Or name the values in order: Group: stage (invited, trained, live). Up to 12 sections. Group: step puts each row under the furthest step it reached, by the steps its source names. |
Per page | How many rows a page shows, from 1 to 100. 25 when left out. |
Search | yes, for a Find in these rows box. With no Search line, the box shows when there are more rows than one page holds. no leaves it out. |
Period | own: every row, whatever the picker says. |
Span | As for any block. A rows block takes the full width when left out. |
A condition on the Where line names a column, then one of these, with letter case ignored:
isoris nota value:status is open,stage is not live.is emptyoris not empty:first payment is empty.is below,is above,is at leastoris at mosta number or another column:spend is above 500,level is below reorder level.- For a column of days,
is today,is this week(Monday to Sunday),is last weekoris next 7 days(today and the six days after it):date is this week.
Write them in words: the check answers =, < and > with the words to use.
On the page:
- Above the rows: how many there are, like “14 rows”, and the find box when there is one, which matches any cell shown. Show 25 more adds the next page.
- A row opens in the pane on the right, as “Row 12 of pilot/branches.csv”, with every column of the table and Open the table. Rows are numbered as a spreadsheet numbers them, the header being row 1.
- With no rows to show, the block says so with its conditions: “No rows where first payment is empty.”
- Up to 2,000 rows reach the page. Past that, the block says how many there are and asks for a Where line to narrow them.
- On a narrow view, the table scrolls sideways, with its first column held in place.
A form
A block with Show: form adds one row to a table, from fields people fill in:
| Line | What it takes |
|---|---|
Adds to | The table: a CSV or TSV file in the project, its .source.md, or the .source.md of a sheet that lets the project add rows. Needed. |
Fields | The table’s columns to fill in, each with what it takes in brackets (below), like Fields: date (today), what (call, email, visit), note (long). Up to 20. Every column of the table when left out, with its Days column a day that starts on today. |
Button | The button’s words, 40 characters at most, like Button: Note the call. With no Button line, it reads Add a row. |
Span | As for any block. A form takes 4 columns when left out. |
Each field on the Fields line is a column of the table, with what it takes in brackets:
| In brackets | The field |
|---|---|
(today) | A day, filled in with today, which the person can change. |
(day) | A day. (date) does the same. |
(number) | A number. |
(long) | A box for longer words. |
(call, email, visit) | One of these, from a list. |
(from pilot/branches.csv) | One of the values of the same column in that table, from a list. |
(default normal) | Where the field starts, which the person can change. One value alone, like (normal), does the same. With a list, it is one of the list: priority (low, normal, high, default normal). |
(= open) | Always this value, shown and not changeable. |
(me) | The name of the person adding the row, shown and not changeable. |
A field with no brackets takes any words. When someone presses the button:
- The row goes on at once, as the person who pressed, and the form says where: “Added to pilot/calls.csv, row 52.” with Undo for 10 seconds. Undo takes the row back while nobody has changed the table since: “Taken back: row 52 is gone from pilot/calls.csv.” The form clears and the cursor goes back to its first field.
- On a sheet: “Added to the sheet Pilot calls, row 52. To take it back, delete the row in Google Sheets.”
- A value a field can’t take is said under the field: “Date needs a day, like 2026-10-26.”, “What: choose call, email or visit.” or “Amount needs a number.”
- The same row from the same person within ten minutes adds nothing: “You added this row to pilot/calls.csv 2 minutes ago (row 52), so nothing was added.”, with Add it again.
- Each row goes on record under the name of the person who added it, and Changes says “added 1 row to pilot/calls.csv”.
The grid
Span is a block’s width in the grid’s 12 columns. Write one number, and Alcoven lays out the narrower widths:
- From 1024 px of the view’s own width: the number you wrote.
- From 640 px: blocks of 4 or less take half the width, two a row, and wider ones the full width.
- Under 640 px: every block takes the full width, in file order.
Or write it Tailwind’s way, mobile first: Span: 12 md:6 lg:4, or Span: col-span-12 md:col-span-6 lg:col-span-4, is 12 columns on every width, 6 from md and 4 from lg. The breakpoints are Tailwind’s: sm 640, md 768, lg 1024, xl 1280 and 2xl 1536 px. col-span-full is all 12, and a lone col-span-4 reads as Span: 4. row-span-2 makes a block two rows tall where it sits beside others; where blocks stack, it is left out.
Widths are measured on the view’s own width, never the window’s, so opening something in the pane on the right narrows the view and the grid takes its narrower layout. So write md:6 for a container’s breakpoint too: Alcoven already measures it on the view.
With no Span line, each kind takes its own width: number 3, list and form 4, line, bars, table and funnel 6, and rows and text 12. A Widget block takes the width of its widget’s shape.
Blocks flow left to right in file order, onto the next row when the next one doesn’t fit, and blocks in a row share the height of the tallest. To leave a gap, add a text block with no words. The check answers col-start with the same fix.
One period for the page
With a Period line, the page has a period picker: Last 7 days, Last 28 days, Last 90 days, This month, Last month, This quarter and This year. The period you pick replaces the Since of every chart on the page, widget files included, and keeps each rows block to the rows dated in it, when a source that reads its table names a Days column. Blocks with Period: own keep their own, and a funnel’s Within line stays as written. With Period: none, or no Period line, there is no picker, and each block keeps its own Since.
The address keeps the tab and the period you picked:
https://app.alcoven.co/p/<project>/views/reports/client.view.md?tab=campaign&period=90dso a link you paste to a teammate opens the same tab and period. Copy link in the ⋯ menu copies it.
Filters
A Filter line puts a menu at the top of the page for each field or column it names: All, then the values found in the rows and numbers you can see, the 50 most common, with a find box when there are many. The value you choose keeps every block to it, and the menu says it, like Manager: Ayla, with Clear. A filter reaches:
- a table’s rows and numbers, by the source’s field of that name or the table’s column of that name;
- numbers your product sends, by a field they are sent with;
- Google Analytics, by the source’s field;
- this project’s own counts, by person or folder.
A block whose source has no such field says so under its title while the filter is set: “Shows every manager: its source has no manager.” The filter goes in the address too, like &manager=Ayla, so a link keeps it.
On a line, bars or table block, a click, a tap or Enter on a bar, a point or a row of numbers shows what it is under the drawing, with up to two links:
- Show only Ayla, when the view’s Filter names the field the block is split by: it sets that filter for the whole page.
- See the 12 rows, when the block’s one measure counts the rows of a table you can open, or adds up one of its columns: the pane on the right lists the rows behind that bar or period, with Open the table.
Escape puts them away.
On the page
- At the top: the title, the Why line, and As of with the time of the oldest numbers on the page, so the page never looks newer than it is. When the blocks’ times are more than an hour apart, it adds “Each block says its own time.” When a schedule sends the view, a line says so: “Sent Mondays at 08:00 by the schedule Monday numbers”.
- Beside the title: the period picker, a menu for each filter, and the ⋯ menu: Edit and Change it for people who write, then Notes, History, Copy link and Who sees this.
- The tabs sit under the blocks above them. With the keyboard, Left and Right move between tabs, and Home and End go to the first and the last.
- A block’s title opens it in the pane on the right. A Widget block opens its widget. A block with its own lines opens its drawing, every number in a table, where the numbers come from and its lines in the view, with Change it for people who write. A chart reads as on any widget: point at a period, tap it, or use the arrow keys (reading a chart).
- A note on a block’s § address, such as one your AI adds with Add a note, shows under the block in the margin with its day. The newest open note is the one shown.
- Each block draws as soon as its own numbers are there, and none waits for another. A block Alcoven can’t draw says why in its place, and the rest of the page draws.
- People who write also see a line at the top when some lines can’t be read, such as “Alcoven can’t read 2 lines of this view, so their blocks aren’t drawn.”, with Show them.
- People who read the project open every view they can see and change its tab, period and filters like anyone. A form shows them its title and who can add rows.
Where you find a view
- Its own page in Alcoven, at
app.alcoven.co/p/<project>/views/<path>, with the pane on the right for what a block opens. - The project’s home: under the widgets, a Views line lists the views with
On home: yesthat you can open, six at most, each with its Why line, then All views with how many there are. The top of home says what to do next, from the project’s focus file. - All views: every view you can open, those on home first, each with its Why line, its folder, its tabs and, for a view a schedule sends, when it goes out. The project’s schedules are listed under them.
- Files and ⌘K: a
.view.mdhas a grid mark and opens the view’s page. People who write open its text with Edit in the page’s ⋯ menu. - The switcher: the view’s title is a menu of the project’s views, then All views and schedules, so moving from one view to another never needs home.
- Documents: a line that is only a link to a view draws a card with its title, its Why line and Open the view. Anywhere else, on GitHub, in an editor or in a clone, it stays a link.
For example, this line in a document draws the client report’s card:
We go through the numbers on the client report:
[Client report](reports/client.view.md)Who sees which numbers
A view is a file, so it follows its folder: someone who can’t open the folder doesn’t find the view in any list, and its address opens nothing for them. On a view they can open, each block shows its numbers only to people who can also open the widget file and the source it reads, and for a CSV, the data file. Anyone else sees one line in the block’s place, such as “Spend: uses a file you can’t open here.”, and their AI is told the same when it reads the view. This project’s own counts follow each person’s view, so two people on the same page can see different numbers.
Rows follow the table’s file: a rows block shows a table’s rows, and a form adds to it, only for people who can open the table’s file, and its .source.md too when the block names the table by it. Anyone else sees the block’s title and “uses a file you can’t open here”. A sheet’s rows show only once the project shows them, which whoever added the sheet, or someone who manages the project, sets on the sheet’s pane. In a form, a field’s list of values from another table shows to people who can open that table, and anyone else types the value.
People who only read the project, like your client, see a form’s title and, in place of its fields, who can add: “You read this project, so adding rows is for the people who write to it. Ask someone who manages it (Corvid’s account lead or its developer) to let you write.”
When a view is checked, Alcoven adds a note for the people who see the view but not a block’s files, such as this one for the client report: “Line 12: your client sees this view but not ads/, so on your client’s page this block says “uses a file you can’t open here”.” A note stops nothing.
A schedule follows its folder too. It runs as its owner, so it adds rows and writes numbers only where its owner can, and each email it sends shows each reader only the numbers they can see (the email a send makes).
Schedules
A schedule is a file ending in .schedule.md, in any folder: a title, a few lines, then one line on why it is there. Alcoven runs it on its timetable as the person who keeps it, with no AI on Alcoven’s side: each run does what its lines say. For example, your colleague who runs operations at Corvid keeps this one in ops/monday.schedule.md, where m-9n3q1x is their member id:
# Monday numbers
- When: Mondays at 08:00
- Time zone: Europe/Istanbul
- Do: add a row to ops/weekly.csv with {"week": "this week", "hours": "ops/hours.widget.md", "invoiced": "ops/invoiced.widget.md"}
- Do: send ops/weekly-numbers.view.md to everyone who sees it
- Owner: m-9n3q1x
Why it's here: the week's numbers go on record before the 10:00 stand-up, so weeks can be compared.Every Monday at 08:00 in Istanbul, it adds the week’s row to ops/weekly.csv, with two widgets’ numbers as its owner sees them, then emails the view Weekly numbers to everyone who can open it. Checked on a Thursday in October, Alcoven answers with its next run and what it does: “ops/monday.schedule.md: Mondays at 08:00 in Europe/Istanbul, next on Mon 26 Oct. Adds a row to ops/weekly.csv, then sends Weekly numbers to you and 3 colleagues.”
A schedule, line by line
The title, then these lines, then one line on why the schedule is there, shown on its pane.
| Line | What it takes |
|---|---|
When | When it runs, in whole hours (below), like Mondays at 08:00. Needed. |
Time zone | An IANA name, like Europe/Istanbul. With no Time zone line, the schedule runs in the time zone Alcoven has for its owner, or in UTC when it has none, and the check names the one it uses. |
Do | One thing it does (below). Do lines run in order, up to 10 of them. At least one is needed. |
Owner | The member id of the person it runs as, like m-9n3q1x. Whoever wrote the file if left out. |
Until | The last day it runs, like 2026-12-31. |
When
Schedules run on the hour. A When line reads:
every hourevery day at 07:00, or at several hours:every day at 09:00 and 17:00weekdays at 09:00Mondays at 08:00,Mondays and Thursdays at 09:00the 1st of each month at 09:00,the 1st and 15th of each month at 09:00the last day of each month at 18:00- a cron line with minute 0:
0 8 * * 1is Mondays at 08:00
8am, noon and midnight read too. The check answers a time with minutes, like 08:30, with the whole hours either side of it, and reads a cron line back in words. A schedule that sends a view runs at most once a day. When the clocks change, an hour that is skipped runs at the next hour, and an hour that comes twice runs once.
What a schedule can do
Each Do line is one of four acts. Paths start at the project’s top.
send ops/weekly-numbers.view.md to everyone who sees itemails the view to each person on the project who can open it, as they see it: the blocks above the tabs and the first tab, or one tab named after a#, likesend reports/client.view.md#campaign to everyone who sees it. End it withto everyone on the project, or with member ids, liketo m-4f2k9a, m-9n3q1x; either way, people who can’t open the view don’t get it.add a row to ops/weekly.csv with {"week": "this week"}adds one row at the end of a CSV or TSV file in the project, or of a sheet that lets the project add rows, as a form does.write the numbers in ops/weekly-report.mdmakes a new version of the document in which each line that is only a link to a widget becomes that widget’s numbers as text, as of the run, as Write the numbers in does.refresh ops/weekly-numbers.view.mdfetches the numbers behind a view again, or, for a.source.md, that source’s numbers for every widget and block that reads it, so they are new when people open them.
In with {...}, the values are JSON: each column of the row takes text or a number, or one of these:
"today": the day of the run, in the schedule’s time zone;"this week": the Monday of the run’s week;"me": the owner’s name;- a widget’s path, like
"ops/hours.widget.md": that widget’s number at the time of the run, as the owner sees it.
How it runs
- On the hour. Alcoven looks for due schedules a couple of minutes after each hour, so one at 08:00 runs at about 08:02, and now and then some minutes later.
- As its owner. Each Do line runs in order as the person the schedule runs as, through the same checks as when they act from their own AI: it reads what they can open and changes what they can change. A step that fails stops the steps after it.
- Once for each time. Each time on its timetable runs once, never twice. A run 30 minutes or more after its time says it was late. A time Alcoven couldn’t run within 6 hours is recorded as missed, nothing is added or sent for it, and the next time stands.
- On record. A run that added a row, sent a view or wrote numbers in is one line on Changes, under its owner’s name: “Monday numbers, for your colleague: added 1 row to ops/weekly.csv and sent Weekly numbers to 4 people.” What it wrote stays in each file’s versions. A run that only refreshed sources shows on the schedule’s pane and stays off Changes.
- Three failed runs in a row pause it, with the reason: “Paused on 9 Nov after 3 runs in a row failed: …” Its owner finds it in Waiting on you on the project’s home, with Open it. No email goes out about it.
- When its owner leaves. A schedule pauses when its owner leaves the project, can only read it, or can no longer write in its folder: “Paused on 3 Nov: your colleague left the project. Anyone who writes in ops/ can take it over.” People who manage the project find it in Waiting on you. Take it over, for anyone who writes in its folder, sets its Owner line to them in a new version, and it runs as them from its next time.
- Run it now, for people who write in its folder, runs it once, straight away, as its owner, whatever its timetable. A schedule that sends asks first: “Send Weekly numbers to 4 people now? Each gets the numbers they can see.”
- Pause and Resume are for its owner and the people who manage the project, and each shows on Changes. Times that pass while it is paused aren’t run later: a resumed schedule runs at its next time.
- A schedule with a line Alcoven can’t read doesn’t run until that line is fixed, and its pane names the line. After its Until day it stops: “Ended: 31 Dec 2026, the day on its Until line, has passed.”
- Alcoven runs a project’s first 20 schedules, in the order of their paths, and the check says so on any after them.
The email a send makes
A send makes one email for each person who can open the view, with the numbers that person can see:
- The subject is the view’s title and the day, like “Weekly numbers, Mon 26 Oct”.
- Inside: the Why line, then each block of the tab sent: a chart’s title, its reading and a small table of its numbers as of the run, a text block’s words, and a rows block’s count. Forms are left out.
- A block that reads a file they can’t open says so in its place: “Spend: uses a file you can’t open here.”
- Open the view opens the page on the tab sent.
- The foot says why it came: “You get this because your colleague’s schedule Monday numbers sends this view to people on Bank app relaunch.”, with Stop these emails, which stops this schedule’s emails for that person alone, as an email app’s own unsubscribe does. The schedule’s pane then says “You stopped these emails.”, with Get them again.
- People who can’t open the view don’t get it, and nor does someone invited who hasn’t joined yet. The run says how many were left out, such as “2 of the 6 people named can’t open the view, so it doesn’t go to them.”
Where you find a schedule
- All views lists the schedules you can open under the views, such as “Monday numbers: Mondays at 08:00. Adds a row to ops/weekly.csv, then sends Weekly numbers to 4 people. Next: Mon 26 Oct, 08:00.”, with the paused line when one is paused. Its title opens its pane.
- Its pane on the right, from All views, the Files tree or ⌘K, where a
.schedule.mdhas a clock mark: Run it now, Pause or Resume; when it runs, in its time zone, and what it does; Next and Kept by; its Why line; the paused line with Take it over; the lines Alcoven can’t read; its last runs and what each did; then the file. Edit and Notes work as on any document. - Waiting on you, on the project’s home, for a schedule that stopped running (how it runs).
- Changes, for each run that changed something, and each Pause, Resume and Take it over.
For AI apps and agents
- Over MCP, Check a widget, view or schedule before writing it (
check_widget) takes apath. Given only a path ending.view.mdor.schedule.md, it answers the format and this guide’s address. Given the draft’s text too, it names each line Alcoven can’t read, with its number and the fix, or reads the file back: what each block of a view shows now for the person asking, or when a schedule runs next and what it does. For a funnel over a table with no Within line, the read-back says it counts 14 days from the first step. It writes nothing. - Read from the project (
read) on a.view.mdgives the view as the person sees it: its tabs and filters, each block’s reading with its § address, a rows block’s count, columns and first five rows, the lines Alcoven can’t read, then the file. Under “Acts on this view”, each form says which table it adds a row to and with which columns, and Add rows to a table (add_rows) does the same. A tab’s § address reads that tab alone, and a block’s that block. - On a
.schedule.md,readgives when it runs in words, its next run, what it does, who it runs as, whether it is paused, its last five runs, then the file. - Open the project (
open_project) lists up to ten views, those on home first, then how many schedules there are and the next to run, such as “Schedules: 2; next: Monday numbers, Mon 26 Oct 08:00.” - When your AI adds a view or a schedule with Add a document or changes one with Change documents, Alcoven’s answer reads it back with the address it opens at, a schedule with its next run, or names the lines to fix.
- In a project’s folder, AGENTS.md describes views and schedules for Claude Code, Codex and other coding agents. After a
git push, Alcoven’s answer has a line for each view or schedule it wrote, or the lines to fix. A push is never turned down for either. - Run it now, Pause, Resume and Take it over are pressed on the schedule’s pane in Alcoven.
- All of these run without any AI on Alcoven’s side, and give an AI the same readings the page shows the person it works for.
For the client report, the line reads:
remote: Alcoven: reports/client.view.md: 2 tabs, 9 blocks; Alcoven reads every line. It opens at https://app.alcoven.co/p/<project>/views/reports/client.view.mdIf a view says something is wrong
Alcoven says each line it can’t read with its number and the fix: “Line 12: …” on the page and to check_widget, and “reports/client.view.md line 12: …” with the file’s path in a push’s answer and when an AI writes the file. A view with problems still draws every block that reads. A block’s chart lines are checked as a widget’s, so their answers are in the widgets guide.
| What it says | What to do |
|---|---|
| “Start the file with a title on its first line, like “# Bank launch: client report”.” | Write the view’s title as a “# ” heading on the file’s first line. |
| “Line …: a view has one “# ” title. …” | Keep one “# ” heading. Make the others tabs (“## ”) or blocks (“### ”). |
| “Add a block under a “### ” heading.” | The view has a title and nothing to draw yet. Add a block: a “### ” heading, then its lines. |
| “Line …: “…” is not a block Alcoven draws. Blocks: …” | Change the Show line to one of the blocks the answer lists. |
| “Line …: “…” blocks are not available yet. …” or “Line …: “…” is not available yet in a view. …” | Views don’t take that block or line. Use one the answer lists. |
| “Line …: “…” is not a line a block reads. Lines: …”, “… is not a line a view reads under its title. …”, “… is not a line a rows block reads. …” or “… is not a line a form reads. …” | Use one of the lines listed, or take the line out. |
| “Line …: “…” is a line of a rows block, which shows a table’s rows. …” or “… is a line of a form, which adds a row to a table. …” | A chart block doesn’t take that line. Take it out, or make the block Show: rows or Show: form. |
| “Line …: Group puts a rows block’s rows in sections. To split a chart by a field, use “By: stage”.” | On a chart, write By: in place of Group:. |
| “Line …: “…” is here twice. Keep one.” | Take out one of the two lines. |
| “Line …: “…” comes after the line on why the view is here, so it isn’t read. …” | Move the line up, under the title, with the view’s other lines. |
| “Line …: words here show nowhere on the page. …” | Words after the Why line and before the first block, or under a tab’s heading, aren’t shown. Put them in a text block. |
| “Line …: a view takes one or two filters, and this line names …. …” or “Line …: name a field or a column to filter by, like “Filter: channel”.” | Name one or two fields or columns on the Filter line. |
| “Line …: a block draws a widget file (Widget) or its own lines (Show, Measure, From). Keep one.” | Keep the Widget line, or the Show line and the lines after it. |
| “Line …: “…” has no Show or Widget line. …” | Add the line that says what the block draws. |
| “Line …: “…” is not a widget file: a widget’s path ends .widget.md.” or “… is not a widget you can open on this project.” | Check the Widget line’s path: it ends .widget.md and names a widget in a folder you can open. |
| “Line …: … has lines Alcoven can’t read, so this block isn’t drawn. …” | Open the widget file: its own check names the lines to fix. |
| “Line …: a text block shows only its words, so its … line isn’t read. …”, “Line …: a text block has no period. …” or “Line …: a form has no period. …” | Take the chart lines or the Period line out of the text block, or the Period line out of the form. |
| “Line …: a block’s Period line can only be “Period: own”, …” | Write Period: own, or take the line out. The period for the whole page goes under the view’s title. |
| “Line …: “…” is not a period the picker has. …” | Use one of the periods listed, or none to leave the picker out. |
| “Line …: “…” is not yes or no. …” | Write yes or no, like On home: yes or Search: no, or take the line out. |
| “Line …: “…” is not a member id. …” or “… is not on …. members/ has everyone’s id.” | Name the owner by a member id from the project’s members/ folder, like m-4f2k9a. |
| “Line …: a rows block shows the rows of a table. Add a line like “- From: pilot/branches.csv”, …” or “Line …: a form adds a row to a table. Add a line like “- Adds to: pilot/calls.csv”, …” | Add the line that names the table. |
| “Line …: “…” is not a table you can open on this project. …” or “Line …: … has no rows to show. …” | Name a CSV or TSV file in a folder you can open, or the .source.md of one or of a sheet. A source of numbers alone, such as Google Analytics, has no rows. |
| “Line …: … reads …, and there is no file there.”, “… names no file yet. …”, “… is not a text file. …” or “… reads nothing, since nobody added it as a source. …” | Point the source’s File line at a CSV or TSV file in the project, or add the sheet as a source on the Sources page. |
| “Line …: Alcoven only reads the sheet behind …. Someone who manages the project can let Alcoven add rows to it on the Sources page.” | Ask someone who manages the project to let Alcoven add rows to the sheet. |
| “Line …: “…” is not a column of …. Its columns: ….” | Use one of the columns listed, in any letter case. |
| “Line …: Alcoven can’t read “…” as a condition. …” or “Line …: write “…” in words: “is”, “is not”, …” | Write each condition as a column, then is, is not, is empty, is below and the others (A table’s rows). |
| “Line …: Where takes up to 3 conditions joined by “and”, and this one has …. …” | Keep 3, or split the rows into two blocks. |
| “Line …: “…” is not a number or a column of …. …” | Compare with a number, or with one of the columns listed. |
| “Line …: “…” in … holds no days Alcoven can read, so “this week” matches no row. …” | Use a column of days for today, this week, last week and next 7 days. |
| “Line …: Alcoven can’t read “Sort: …”. …” | Write a column, then a comma and largest first, smallest first, newest first, oldest first, A to Z or Z to A. |
| “Line …: Alcoven can’t read “Per page: …”. …” | Write a number from 1 to 100. |
| “Line …: Alcoven can’t read “Group: …”. …” or “Line …: The Group line names … values, and a rows block groups into 12 sections at most. …” | Name one column, and 12 values at most in brackets. |
| “Line …: … has … values in …, and a rows block groups into 12 sections at most. …” | Group by a column with fewer values, or name the 12 to show in brackets, as the answer suggests. |
| “Line …: Alcoven can’t read “…” as a field. …” or “Line …: Alcoven can’t read “…” in the brackets after ….” | Write each field as a column, then what it takes in brackets (A form). |
| “Line …: “…” is not one of …’s choices: ….” | Make the default one of the field’s choices. |
| “Line …: this form has … fields, and a form holds 20. …” or “Line …: “…” is a field twice. Keep one.” | Keep the fields people fill in, each once. |
| “Line …: a form’s button takes 40 characters at most, like “Note the call”.” | Shorten the Button line. |
| “Line …: “Span: 14” is wider than the grid. …” or “Alcoven can’t read “Span: …”. …” | Write 1 to 12, like Span: 6, or Tailwind’s way, like Span: 12 md:6 lg:4. |
| “Line …: blocks flow in the file’s order, so col-start isn’t read. …” | Take col-start out. To leave a gap, add a text block with no words. |
| “Line …: write md:6, without the @. …” | Alcoven already measures md: and the other breakpoints on the view’s own width. Write the span without the @. |
| “Line …: a block is one or two rows tall: “row-span-2”.” | Write row-span-2, or take it out. |
| “Line …: this view has … tabs, and a view holds 8. …” | Join two tabs, or move one to a view of its own. |
| “The tab “…” has … blocks, and a tab holds 24. …”, and the same for a page or for the blocks above the tabs | Move some blocks to another tab: a new “## ” heading starts one. |
| “Line …: the tab “…” has no blocks. …” | Add a block under the tab’s heading, or take the tab out. |
| “…: Alcoven can’t draw this block. Line …: …” | Said on the page, in the block’s place: the line after it says what to fix. People who write get Fix it in the chat and Edit beside it. |
| “…: uses a file you can’t open here.” | Said on the page, in the block’s place: the block reads a widget, a source or a table in a folder you can’t open. Ask someone who manages the project if you need it. |
| “Shows every manager: its source has no manager.” | Said under a block while a filter is set, when the block’s source has no such field or column. Nothing to fix if that is how it should be. |
| “The rows of the sheet behind … aren’t shown on the project, so this block shows none. …” | Said in a rows block’s place. Whoever added the sheet, or someone who manages the project, can show its rows on the sheet’s pane. |
Two answers are notes: the view draws, and they stop nothing.
| What it says | What to do |
|---|---|
| “Line …: “…” is the title of another block too, so this one’s § address ends #…-2. …” | Both blocks draw. Give the second a title of its own, so a note or a link reaches the block you mean. |
| “Line …: … sees this view but not …/, so on …’s page this block says “uses a file you can’t open here”.” | Nothing to fix if that is how it should be. Otherwise, point the block at a file everyone who sees the view can open. |
If a schedule says something is wrong
The check says each line it can’t read the same way: “Line 3: …” on the pane and to check_widget, and “ops/monday.schedule.md line 3: …” in a push’s answer and when an AI writes the file.
| What it says | What to do |
|---|---|
| “Start the file with a title on its first line, like “# Monday numbers”.” | Write the schedule’s title as a “# ” heading on the file’s first line. |
| “Line …: a schedule is a title, its lines and a line on why it is here, so this heading isn’t read.” | Take the heading out: a schedule has no blocks or tabs. |
| “Line …: “…” is not a line a schedule reads. Lines: When, Time zone, Do, Owner, Until.” | Use one of those lines, or take the line out. |
| “Line …: “…” is here twice. Keep one.” | Take out one of the two. Do is the one line a schedule may have more than once. |
| “Line …: “…” comes after the line on why the schedule is here, so it isn’t read. …” | Move the line up, under the title, with the other lines. |
| “Add a When line, like “- When: Mondays at 08:00”.” or “Add what it does on a Do line, like …” | Add the line. |
| “Line …: Alcoven can’t read “…”. Write “Mondays at 08:00”, “every day at 07:00”, …” | Write the timetable one of the ways under When. |
| “Line …: schedules run on the hour, so they can’t run at 08:30. Write “Mondays at 08:00” or “Mondays at 09:00”.” | Take one of the two whole hours the answer gives. |
| “Line …: a schedule runs at most once an hour, on the hour, and … asks for more. …” | Write every hour, or a cron line with minute 0. |
| “Line …: a schedule that sends runs at most once a day. …” | Run it once a day or less often, or move the send to a schedule of its own. |
| “Line …: Alcoven doesn’t know the time zone “…”. …” | Write an IANA name, like Europe/Istanbul, or the one the answer suggests. |
| “Line …: “…” is not a member id. …”, “… is not on …. members/ has everyone’s id.” or “… is an agent, and a schedule runs as a person. …” | Name a person on the project by their member id, from the project’s members/ folder. |
| “Line …: “…” is not a day. Write it as year-month-day, like 2026-12-31.” | Write the Until day as year-month-day. |
| “Line …: a schedule has at most 10 Do lines. …” | Move the rest to a second schedule. |
| “Line …: Alcoven can’t read “…”. A schedule can send a view, add a row to a table, write the numbers in a document or refresh a view or source, …” | Write the Do line as one of the four acts under What a schedule can do. |
| “Line …: a schedule doesn’t add tasks, since a person asks for work. …” | Take the line out, and add the task on the project. |
| “Line …: a schedule can’t run another schedule. …” | Take the line out. Run it now on the other schedule’s pane runs that one once. |
| “Line …: running an outside agent’s tool on a timetable is not available yet. …” or “Line …: “answer.…” reads the answer of an outside agent’s tool, which is not available yet. …” | Not available yet. Take the line out, or write the value itself. |
| “Line …: say who gets it: …” | End the send line with to everyone who sees it, to everyone on the project, or member ids. |
| “Line …: “…” is not a view. A send line names a file ending .view.md, …” or “… is not a view you can open on this project.” | Name a view’s path, in a folder you can open. |
| “Line …: … has no tab “…”. Its tabs: ….” or “… has no tabs, so it is sent whole. …” | Name one of the tabs listed after the #, or take the # and the tab out. |
| “Line …: … is an agent, and a schedule sends to people. …” | Name people only. |
| “Line …: paths start at the project’s top, so “…” names nothing. Write “…”.” | Write the path the answer gives. |
| “Line …: write the row’s values after “with”, …”, “Line …: Alcoven can’t read the values after “with”. …” or “Line …: the value of “…” is not text or a number. …” | Write the values as JSON, like {"week": "this week", "hours": 31}. |
| “Line …: there is no table at … you can open. …” or “Line …: “…” is not a table: …” | Name a CSV or TSV file in a folder you can open, or the .source.md of a sheet that adds rows. |
| “Line …: “…” is not a column of …. Its columns: ….” | Use the columns listed, in any letter case. |
| “Line …: Alcoven only reads the sheet behind …. …” | Ask someone who manages the project to let Alcoven add rows to the sheet. |
| “Line …: “{…}” takes a value from a row, and a schedule adds its row on its own. …” | Write the value itself. |
| “Line …: “…” is not a widget you can open on this project.”, “… is not a document you can open on this project.” or “… is not a view or source you can open on this project.” | Check the path: it names a file in a folder you can open. |
| “Line …: “…” is not a view or a source: refresh reads a file ending .view.md or .source.md again.” | Refresh a view or a source. |
Three answers are notes: Alcoven keeps the file as written, and each note says what that means for its runs.
| What it says | What to do |
|---|---|
| “No Time zone line, so it runs in your colleague’s time zone, Europe/Istanbul now. Add “- Time zone: Europe/Istanbul” to keep it there.” | Add the Time zone line, with the zone you mean. |
| “Line …: Until 31 Dec 2026 has passed, so it doesn’t run any more.” | Change the Until day, or let the schedule stay ended. |
| “This project has 21 schedules, and Alcoven runs the first 20, in the order of their paths. This one comes after them, so it doesn’t run.” | Join two schedules into one, or remove one the team no longer needs. |
A run says what it did on the schedule’s pane, under Last runs. When one didn’t go as planned:
| What it says | What to do |
|---|---|
| “Late: ran 41 minutes after its time. …” | It ran, 30 minutes or more after its time. Nothing to fix. |
| “Missed: it couldn’t run within 6 hours of 08:00, so nothing was added or sent.” | Nothing to fix: the next time stands. |
| “Your colleague can’t open finance/, so the row wasn’t added.”, and the same with “so nothing was sent”, “so the numbers weren’t written in” or “so nothing was refreshed” | The owner can’t open that folder. Ask someone who manages the project to open it to them, or change the Owner line to someone who can. |
| “Alcoven can’t add rows to ops/weekly.csv: …” | The reason follows. Fix the table or the value it names, then press Run it now. |
| “ops/weekly-numbers.view.md isn’t there any more.” | Point the Do line at the file’s new path. |
| “Weekly numbers wasn’t refreshed: …” | A source behind it didn’t answer. Its pane says why. |
| “Alcoven couldn’t send Weekly numbers: 2 emails didn’t go out.” | Run it now sends it again, and runs every other Do line again too: a row the run added goes on a second time, so take the extra one out of the table. |
| “It stopped before it finished, so some of its steps may not have run.” | Open the files it names to see which steps ran before you run it again. |
Help
For anything else, write to info@alcoven.co.