Skip to content

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).

  1. Copy the prompt — On the AI Import page, copy the system prompt (“Copy prompt” button) and give it to your AI.
  2. 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.
  3. 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.

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.

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.

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.

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.

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 mistakeWhat 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 linesColumns 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 cellsPadded instead of shifted
::: inside a code blockDoes not close the section
Answer wrapped in ```markdownUnwrapped
Title heading repeated below the page titleRemoved once instead of shown twice

Page text itself is standard Markdown (CommonMark + GFM) — the full list is under All Block Types.

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 text column 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.
TypeDescription / syntax
text, longtextShort / long text
numberNumber — optional (currency EUR) or (percent)
date, timeDate / time
checkboxYes/No
url, email, phoneWeb address / email / phone
ratingStar rating
select (A, B, C)Single choice with options
multiselect (A, B, C)Multiple choice
relation → TargetTableLink to another table
assigneeAssign a person — cell = name or email of a member
locationPlace / 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.

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 Tasks
type: kanban
group: Status
sort: Due desc
filter: Status is Open
columns: Title, Status
:::
  • type: table, kanban, calendar, gallery, list, timeline, chart
  • group: column for Kanban grouping · calendar: date column for the calendar
  • filter: <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

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.

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 Tasks
type: table
filter: 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 note
Body text with **bold**, *italic*, `code` and [links](https://example.com).
- Bullet
1. Numbered list
- [ ] open task
- [x] done task
> Quote
---
:::
:::collapsible More details
Expandable section.
:::
:::columns2
Left column
---col---
Right column
:::
:::callout 💡
Highlighted note.
:::
:::toc
:::
:::equation
E = mc^2
:::

:::columns3 creates three columns (each separated by ---col---).

At the very top of the ::: page block (before the content):

::: page Detailed concept
parent: Project note (nests the page under "Project note")
project: Website Relaunch (assigns it to a project)
# Detailed concept
...
:::

Inside page text, link with [[…]]:

[[Tasks/Concept]] → links a table row
[[Project note]] → links a page

Give a table row a full page that opens when you click the row — with body text, lists and even embedded views:

::: row Tasks / Concept
project: Website Relaunch (optional — assigns the record page to a project)
# Concept details
Detailed description, checklists, embedded views (@embed) …
:::

::: row <Table> / <Row title> — the row is found by its title.

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 Meetings
default: true
Status: To Do
## Decisions
-
## Action Items
@embed Tasks / Tasks of this Meeting
## Discussion
-
:::
  • Leading key: value lines are either default: true or property defaults (e.g. Status: To Do pre-sets the “Status” column on creation).
  • Placeholders: {{title}} (row title) and {{today}} (today’s date) are resolved on creation.
  • Any @current embeds inside resolve to the new row automatically.

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)
  • @filter sets 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.
  • @button creates a new row on click (optionally from a row template) and opens it.
  • Put each @filter/@button on its own line (separated by a blank line).

One big number from a table — as its own block inside page text:

:::metric Open tasks
table: Tasks
agg: count
filter: Status is Open
form: none
:::
KeyMeaning
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)
  • form: none — just the number. This is also the default when form: is missing.
  • form: line · area · bars — a trend. Add axis: <date column>; without it the row’s creation date counts, and imported rows all land in the same month. Optional: range: 12m | 6m | 12w | 30d and cumulative: yes (each point shows everything up to then).
  • form: progress · ringshare of a goal. Needs goal: <number> or goal: metric <name of another metric on the page>.
  • form: delta — arrow with the gap: compare: previous (previous period, needs axis) or compare: goal.

Several metric: <title> groups in one block; grid: sets the tiles per row:

:::metric
grid: 3
metric: Total budget
table: Funding
agg: sum Amount
form: area
axis: Date
cumulative: yes
metric: Drawn down
table: Funding
agg: sum Amount
filter: Type is Drawdown
form: progress
goal: metric Total budget
emphasis: strong
:::

Named building blocks and a formula on top — this is how row sets are combined:

:::metric Remaining budget
term Budget: table Funding, agg sum Amount, filter Type is Budget
term Drawn: table Funding, agg sum Amount, filter Type is Drawdown
formula: {Budget} - {Drawn}
:::

A building block may also point at another metric on the page: term Plan: metric Total budget.

A project groups tables, pages, sessions and boards:

::: project Website Relaunch 🚀
status: Active
color: #3b82f6
Rebuild 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:.

::: session Kickoff
type: Meeting
date: 2026-07-05
time: 14:00
location: Zurich
project: Website Relaunch
Description (optional).
:::

Each line becomes a sticky note on the board:

::: board Ideas
project: Website Relaunch
- First note
- Second note
:::

Creates real entries in the Tasks module:

::: tasks
project: 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.

::: project Website Relaunch 🚀
status: Active
Rebuild 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 Tasks
type: kanban
group: Status
:::
::: session Kickoff
type: Meeting
date: 2026-07-05
location: Zurich
project: Website Relaunch
:::
::: page Dashboard 📊
project: Website Relaunch
# Overview
Current tasks — see [[Tasks/Concept]].
@embed Tasks / By Status
:::
::: tasks
project: Website Relaunch
- [ ] Prepare kickoff | due 2026-07-04
:::

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.