AI Import — Set Up a Workspace with AI
With AI Import you set up complete workspaces by having an AI (e.g. ChatGPT, Gemini, Claude) describe them in a simple text format — Pachurros Markup. You paste the result, check the preview, and import with one click.
Find it in the left sidebar under AI Import (route /w/<workspace>/ki-import).
In three steps
Section titled “In three steps”- Copy the prompt — On the AI Import page, copy the system prompt (“Copy prompt” button) and give it to your AI.
- Describe what you need — Tell the AI what to build, e.g. “Set up a workspace for a video project: a project, a tasks table with status and assignees, a Kanban view, a dashboard page, and a few to-dos.” The AI replies with Pachurros Markup.
- Paste & import — Paste the markup into the input field → Preview (shows what will be created) → Import. You land directly on the first created item.
References (relations, project assignments, mentions, embedded views) are resolved automatically on import.
Two texts for your AI
Section titled “Two texts for your AI”The AI import page offers two blocks to copy — they do different things:
- System prompt — an instruction: “produce Pachurros markup, output only the markup”. The short route: copy it, hand it to your AI, say what you need.
- Full format reference — an explanation: the whole of Pachurros Markdown in one text. Prose, every block, the frame (tables, pages, views, metrics), linking, a complete example and a checklist. Meant for when your AI should actually understand the format: paste it once, then simply describe what you want. Also useful for models that get sloppy with terse instructions.
Both come with a copy button and a .md download. When the format changes, both change with it — copy them again when needed.
Export & round-trip
Section titled “Export & round-trip”You can also export your existing workspace as Pachurros Markup — on the AI Import page via “Export workspace as markup”. This lets you hand existing content to an AI, have it extend or revise it, and import the result again.
The export covers: projects, tables (incl. relations, formulas, views with filter/sort/group, subtasks), pages (with mentions & embedded views), rich rows, sessions, boards and tasks. Computed columns (formula/lookup/rollup/count) are recalculated automatically on re-import rather than transferred as values.
Add or replace?
Section titled “Add or replace?”Import always creates content anew — re-importing the same export into the same workspace creates everything twice. To put the edited state in place of the old one instead, enable the “Empty workspace before import” option before importing: the workspace is emptied (with a warning and confirmation) and then repopulated — without duplicates. Alternatively, import into a fresh, empty workspace.
Basic principle
Section titled “Basic principle”Every piece of content lives in a block that starts with ::: and ends with ::::
::: table Tasks...:::Block types: table, page, project, session, board, view, tasks, row, template. An optional emoji may follow the name (::: table Tasks ✅).
The German names work just as well: tabelle/datenbank, seite/notiz, projekt, termin, tafel, ansicht, aufgaben, zeile/eintrag, vorlage. Indentation before the ::: and four instead of three colons are fine too.
When the AI is sloppy
Section titled “When the AI is sloppy”AI output is rarely formally perfect. The importer is built so that no content disappears silently — worst case it lands as readable page text. Anything noticed is listed after the preview under “Beim Lesen aufgefallen”:
| The AI’s mistake | What happens |
|---|---|
Section without a closing ::: | The rest is still read and assigned to that section — with a notice |
Unknown section (::: calendar …) | Content lands as page text — with a notice |
Table without - Name: type lines | Columns are derived from the header row, the type guessed from the column name (first column is always the title) |
Table without outer | | Read the same as with them |
| Row with too few cells | Padded instead of shifted |
::: inside a code block | Does not close the section |
Answer wrapped in ```markdown | Unwrapped |
| Title heading repeated below the page title | Removed once instead of shown twice |
Page text itself is standard Markdown (CommonMark + GFM) — the full list is under All Block Types.
Tables
Section titled “Tables”Columns are declared with a type, then after --- a Markdown table holds the data. The header row must contain the column names.
::: table Tasks ✅- Title: text- Status: select (Open, In progress, Done)- Due: date- Project: relation → Projects---| Title | Status | Due | Project || Concept | In progress | 2026-07-10 | Website Relaunch |:::- The first
textcolumn is the row’s title — relations and mentions point to it. - Cell formats:
date=YYYY-MM-DD,checkbox=true/false,relation/multiselect= multiple values separated by commas.
Column types
Section titled “Column types”| Type | Description / syntax |
|---|---|
text, longtext | Short / long text |
number | Number — optional (currency EUR) or (percent) |
date, time | Date / time |
checkbox | Yes/No |
url, email, phone | Web address / email / phone |
rating | Star rating |
select (A, B, C) | Single choice with options |
multiselect (A, B, C) | Multiple choice |
relation → TargetTable | Link to another table |
assignee | Assign a person — cell = name or email of a member |
location | Place / address |
formula (expression) | Computed field, e.g. formula (Budget - Spend) |
lookup (via <relation> → <field>) | Pull a value from a linked table |
rollup (via <relation> <agg> <field>) | Aggregate from a linked table (agg: sum, avg, min, max, count) |
Examples of computed columns:
::: table Tasks- Title: text- Project: relation → Projects- Owner: assignee- Remaining: formula (Budget - Spend)- Project budget: lookup (via Project → Budget)- Total effort: rollup (via Project sum Budget)---| Title | Project | Owner || Concept | Website Relaunch | anna@firm.com |:::lookup and rollup reference a relation column in the same table (via) pointing to a column of the target table.
Subtasks (nested rows)
Section titled “Subtasks (nested rows)”A row becomes a subtask of the previous top-level row when its title starts with ↳ :
::: table Tasks- Title: text- Status: select (Open, Done)---| Title | Status || Main task | Open || ↳ Step 1 | Open || ↳ Step 2 | Done |:::A custom view of a table — with grouping, filter, sort and visible columns:
::: view By Status on Taskstype: kanbangroup: Statussort: Due descfilter: Status is Opencolumns: Title, Status:::type:table,kanban,calendar,gallery,list,timeline,chartgroup: column for Kanban grouping ·calendar: date column for the calendarfilter: <column> <op> <value>—op:is,is not,contains,not contains,empty,not empty,gt,lt,gte,lte·sort: <column> <asc | desc>columns:— visible columns (comma-separated)
Timeline (Gantt): type: timeline + start: <date column> + end: <date column>
Chart: type: chart + chart: bar | donut | line + group: <column> (X axis) + value: <number column> (optional) + agg: count | sum | avg | min | max
Embed a table or view on a page
Section titled “Embed a table or view on a page”A line of its own in page text embeds a table or a specific view:
@embed Tasks (whole table, default view)@embed Tasks / By Status (specific view)@embed Tasks / Board | List | Calendar (several views as tabs)Separate multiple @embed lines with a blank line each.
Scope to the current row (@current)
Section titled “Scope to the current row (@current)”In a view with filter: <Relation> is @current, the placeholder resolves at render time to the row whose record page the embed lives on. So one generic view automatically shows the linked entries on every row (e.g. “Tasks of this meeting”) — and a row created inside it gets the relation set automatically.
::: view Tasks of this Meeting on Taskstype: tablefilter: Meeting is @current:::On ordinary pages (no record context) such an embed is greyed out.
A rich-text page with headings, lists, tasks, quotes and code:
::: page Project note 📝# Project noteBody text with **bold**, *italic*, `code` and [links](https://example.com).
- Bullet1. Numbered list- [ ] open task- [x] done task> Quote---:::Special blocks
Section titled “Special blocks”:::collapsible More detailsExpandable section.:::
:::columns2Left column---col---Right column:::
:::callout 💡Highlighted note.:::
:::toc:::
:::equationE = mc^2::::::columns3 creates three columns (each separated by ---col---).
Nesting pages & assigning a project
Section titled “Nesting pages & assigning a project”At the very top of the ::: page block (before the content):
::: page Detailed conceptparent: Project note (nests the page under "Project note")project: Website Relaunch (assigns it to a project)# Detailed concept...:::Mentions
Section titled “Mentions”Inside page text, link with [[…]]:
[[Tasks/Concept]] → links a table row[[Project note]] → links a pageRich rows (record pages)
Section titled “Rich rows (record pages)”Give a table row a full page that opens when you click the row — with body text, lists and even embedded views:
::: row Tasks / Conceptproject: Website Relaunch (optional — assigns the record page to a project)# Concept detailsDetailed description, checklists, embedded views (@embed) …:::::: row <Table> / <Row title> — the row is found by its title.
Row templates
Section titled “Row templates”A named template per table: new rows start with a predefined page structure and field values. Exactly one template can be default: true — it applies on the table’s “New row” button.
::: template Standard on Meetingsdefault: trueStatus: To Do## Decisions-
## Action Items@embed Tasks / Tasks of this Meeting
## Discussion-:::- Leading
key: valuelines are eitherdefault: trueor property defaults (e.g.Status: To Dopre-sets the “Status” column on creation). - Placeholders:
{{title}}(row title) and{{today}}(today’s date) are resolved on creation. - Any
@currentembeds inside resolve to the new row automatically.
Dashboard controls
Section titled “Dashboard controls”On a page with several embedded views (overview/dashboard):
@filter Projects (one button per row of the "Projects" table)@filter Tasks / Status (one button per option of the "Status" column)@filter Tasks / Status (multi) (allow multiple selection)@button Tasks (button: create a new empty row + open it)@button Tasks / Standard (create a new row from the "Standard" template)@filtersets a page-wide filter. Every matching embed filters along automatically: in relation mode all embeds with a relation to the target table (e.g. “one button per project filters all views”), in select mode all embeds with a same-named select column.@buttoncreates a new row on click (optionally from a row template) and opens it.- Put each
@filter/@buttonon its own line (separated by a blank line).
Metrics (dashboards)
Section titled “Metrics (dashboards)”One big number from a table — as its own block inside page text:
:::metric Open taskstable: Tasksagg: countfilter: Status is Openform: none:::| Key | Meaning |
|---|---|
table: | the table the number comes from |
agg: | count, sum, avg, min, max — short form agg: sum Amount |
value: | number column (for everything except count) |
filter: | <column> <is|is not|contains|not contains|empty|not empty|gt|lt|gte|lte> <value>, repeatable |
form: | the picture above the number (see below). Without it, only the number is shown. |
prefix: / suffix: | unit before or after |
format: | plain, thousands, currency CHF, percent · decimals: auto|0|1|2|3 |
emphasis: | strong (lead number) or quiet (secondary number) |
The picture above the number
Section titled “The picture above the number”form: none— just the number. This is also the default whenform:is missing.form: line·area·bars— a trend. Addaxis: <date column>; without it the row’s creation date counts, and imported rows all land in the same month. Optional:range: 12m | 6m | 12w | 30dandcumulative: yes(each point shows everything up to then).form: progress·ring— share of a goal. Needsgoal: <number>orgoal: metric <name of another metric on the page>.form: delta— arrow with the gap:compare: previous(previous period, needsaxis) orcompare: goal.
Several tiles (grid)
Section titled “Several tiles (grid)”Several metric: <title> groups in one block; grid: sets the tiles per row:
:::metricgrid: 3
metric: Total budgettable: Fundingagg: sum Amountform: areaaxis: Datecumulative: yes
metric: Drawn downtable: Fundingagg: sum Amountfilter: Type is Drawdownform: progressgoal: metric Total budgetemphasis: strong:::Calculated metric
Section titled “Calculated metric”Named building blocks and a formula on top — this is how row sets are combined:
:::metric Remaining budgetterm Budget: table Funding, agg sum Amount, filter Type is Budgetterm Drawn: table Funding, agg sum Amount, filter Type is Drawdownformula: {Budget} - {Drawn}:::A building block may also point at another metric on the page: term Plan: metric Total budget.
Projects
Section titled “Projects”A project groups tables, pages, sessions and boards:
::: project Website Relaunch 🚀status: Activecolor: #3b82f6Rebuild of the company website (optional description, multi-line).:::Assignment: project: <ProjectName> as the first line of a table, page, session, board or row block.
The assignment decides where an item lives
Section titled “The assignment decides where an item lives”In the sidebar every item has exactly one place — it never appears twice:
| Where it shows up | |
|---|---|
with project: | inside the project only, under Projects |
without project: | under Workspace only, as a general item |
So assign consistently: anything that belongs to a piece of work gets project:. Without it, the item ends up in the general area and looks unsorted there. Only genuinely cross-project things (contacts, templates, personal notes) are left unassigned on purpose.
Child items inherit the project from their parent — a subpage (parent:) does not need project:.
Sessions
Section titled “Sessions”::: session Kickofftype: Meetingdate: 2026-07-05time: 14:00location: Zurichproject: Website RelaunchDescription (optional).:::Boards
Section titled “Boards”Each line becomes a sticky note on the board:
::: board Ideasproject: Website Relaunch- First note- Second note:::Tasks (to-do module)
Section titled “Tasks (to-do module)”Creates real entries in the Tasks module:
::: tasksproject: Website Relaunch- [ ] Write proposal | due 2026-07-10 | @anna@firm.com- [x] Send invoice:::- [ ] open, - [x] done. Optional per line: | due YYYY-MM-DD | @name/email.
Full example
Section titled “Full example”::: project Website Relaunch 🚀status: ActiveRebuild of the company website.:::
::: table Tasks ✅project: Website Relaunch- Title: text- Status: select (Open, In progress, Done)- Due: date- Owner: assignee---| Title | Status | Due | Owner || Concept | In progress | 2026-07-10 | anna@firm.com |:::
::: view By Status on Taskstype: kanbangroup: Status:::
::: session Kickofftype: Meetingdate: 2026-07-05location: Zurichproject: Website Relaunch:::
::: page Dashboard 📊project: Website Relaunch# OverviewCurrent tasks — see [[Tasks/Concept]].@embed Tasks / By Status:::
::: tasksproject: Website Relaunch- [ ] Prepare kickoff | due 2026-07-04:::Limits
Section titled “Limits”Some things can’t sensibly be created from text and are intentionally not included:
- Image, file and video uploads and media library content
- Board elements beyond sticky notes (shapes, frames, connection lines)
- Column description / required flag
- Use the preview: Before importing, the preview shows how many projects, tables, pages, sessions, boards and tasks will be created.
- Keep names consistent: Relations, project and view assignments work via exact names/titles — the AI should use them consistently.
- Work in stages: Build large setups across several imports; existing items can be referenced further by name.
- Keep the prompt current: The system prompt on the AI Import page always contains the full, up-to-date format reference — copy it again when needed.