check_view
ChatGPTTest-renders a view in a real headless browser, reviews it, and reports render errors, console errors, which datasets it loaded, and what a reader would still be missing. The review sends a screenshot and the page's text to OpenAI, unless the workspace turned checks off. Set screenshot=true to also get an image so you can judge the layout yourself. create_view and update_view already run this automatically; use this tool when you want the screenshot, after changing a dataset, or to confirm the review is clean before you tell the user it is done.
create_dataset
ChatGPTCreates a named table that views read with useDataset(name). Define typed columns and a key: the column(s) that uniquely identify a row (e.g. ["month"], or ["date","campaign"]). The key makes updates idempotent: pushing a row with an existing key updates it instead of duplicating it. You can pass initial rows in the same call. Prefer tidy, raw-ish data (one row per month/day/entity with numeric columns) over pre-aggregated text; views compute totals and deltas themselves. Check get_workspace first: if a dataset with this data already exists, add to it with upsert_rows.
create_view
ChatGPTCreates a new view: a live page at a stable URL in the user's dashboard app. source is ONE file of React (JSX/TSX) that default-exports a component and reads its data with useDataset("dataset_name") from "quillm". Do not embed data in the source; create the dataset first (create_dataset), then the view. Pass the brief: the user's request in their words, and what you asked them and what they answered. If the request does not say who reads the page, what for, and which number matters most, ask the user first; when the brief is thin, the response suggests the questions to ask. Decide the questions next: what the user asked for is the scope, and a small request gets a small page. The view is compiled, test-rendered in a real browser and reviewed immediately: the response tells you whether it rendered, lists errors, and lists what a reader would still be missing, so read it and fix problems with update_view. The checks use two outside services unless the workspace turned them off: TypeSafe reads the brief, and OpenAI reads a screenshot and the page's text. Call get_guide first for the template and available libraries. Check get_workspace first: if a suitable view already exists, use update_view instead.
delete_dataset
ChatGPTPermanently deletes a dataset and all its rows. Refuses if any view still reads it, unless force=true. Only do this when the user asked for it.
delete_rows
ChatGPTDeletes rows from a dataset by key, e.g. keys: [{"month": "2026-01"}], or every row with all=true (use before re-loading a dataset from scratch).
delete_view
ChatGPTPermanently removes a view from the user's workspace. Only do this when the user asked for it.
get_guide
ChatGPTReturns the complete how-to for Quillm: the view code contract, a working template, the libraries you can import, styling rules, and dataset conventions. Read this once per session before you call create_view or update_view. It is short.
get_view
ChatGPTReturns one view in full: metadata, agent notes, revision history, the schema of every dataset it reads, and its React source code. Always call this before update_view so your edits match the current source exactly.
get_workspace
ChatGPTSTART HERE. Returns everything that exists in the user's Quillm workspace in one compact overview: every view (slug, purpose, datasets it reads, URL, who last changed it), every dataset (columns, key, row count, freshness), workspace notes left by agents, and recent changes. Call this at the start of every task so you extend what exists instead of duplicating it.
open_page
ChatGPTShows the user a page inside the chat, live, with today's data, in apps that display pages (ChatGPT); elsewhere it returns the page's link. Call it once, last, when you have finished creating or changing a page or its data (after the review is clean), and when the user asks to see, open or show a page. create_view, update_view and upsert_rows show nothing in the chat themselves. Without a slug, lists every page.
query_dataset
ChatGPTReads rows from a dataset so you can inspect or analyse what is stored (e.g. to see the latest month before adding the next one). Supports simple filters, ordering and paging. The response includes the total row count.
report_feedback
ChatGPTFiles a note for Quillm's maintainer that Quillm itself fell short, so it can be improved. The note goes to Quillm's maintainer, a person outside the user's workspace, so include nothing private from the user's data. Call it when: you could not do what the user asked because Quillm lacks a capability; you had to use a workaround (if you changed a column type, reshaped data, or dropped something the user asked for to get past an error, that is a workaround); an error message or the guide was confusing or wrong; or a library/feature you needed is missing. One call per distinct problem, filed as soon as you recognise it (before asking the user a follow-up question, not at the end: the conversation may never get there). Still finish the task as well as you can and tell the user about the limitation. Do NOT use it for problems with the user's data or request, for your own coding mistakes that the render check caught, or for praise.
share_view
ChatGPTChanges who can open a page: "collection" (people with access to its collection, the default), "workspace" (everyone in the workspace) or "link" (anyone with the link, no account needed, read-only; embeddable in Notion or a wiki). Use it when the user asks you to share a page or to give them a link to send. Returns the link. Only when the user asked: a link makes the page and the data it shows readable by whoever has it.
update_dataset
ChatGPTChanges a dataset's schema or metadata: add columns, remove columns, fix a column's description or type (update_columns), change the description or update cadence. Keep descriptions true: when you start storing a new category or scenario, update the column description that lists them. Existing rows keep their values; new columns are null until you upsert values. The key cannot be changed; create a new dataset for that.
update_view
ChatGPTChanges an existing view's code or metadata. Pass expected_revision (the revision get_view showed you) so you never overwrite a change another agent made in the meantime. Prefer edits (exact string replacements, like a find-and-replace; each old_string must match the current source exactly and be unique) for targeted changes such as adding a chart. Use source only for a full rewrite, or restore_revision to roll back. Every call creates a new revision, is test-rendered and reviewed; a revision that fails its render check is NOT published (readers keep the last working one) and your next edits apply to it. The review sends a screenshot and the page's text to OpenAI, unless the workspace turned checks off. When a follow-up request replaces an earlier approach (a better burn figure, a new default), replace the old blocks instead of keeping both: revisions make removal safe. Call get_view first to get the current source. To change only the numbers a view shows, do NOT use this tool: use upsert_rows on the dataset.
upsert_rows
ChatGPTAdds or updates rows in a dataset. This is how you "add new data" or "correct a number": every view reading the dataset shows the change immediately, with no view edit needed. Rows are matched on the dataset's key columns: a new key inserts, an existing key is merged (only the columns you send are overwritten). Safe to re-run. Values must match the column types (number columns take JSON numbers, not strings like "$1,200"; date columns take ISO strings like "2026-03-01" or "2026-03"). Unknown or not applicable is null, never "" or 0. It writes only to this Quillm workspace and calls no other service.
write_notes
ChatGPTSaves durable notes for future agents (including yourself in a later session, with no memory of this one). Use it to record what is NOT obvious from the code: where the data comes from and how to refresh it (queries, API calls, file paths), definitions ("MRR excludes one-off invoices"), and user preferences ("Kev wants EUR, weekly granularity"). Notes attach to a view, a dataset, or the whole workspace, and are shown in get_workspace / get_view. Replaces the previous notes for that target, so include what should be kept.