activate_automation
ChatGPTbase_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.Moonwalk is where you write boards: pages that hold text alongside live tables, charts and interactive widgets, which you can keep private or publish as a public page. This connector lets Claude write and maintain those boards with you, and build the data and machinery behind them. What Claude can do with it: - Boards: read, search and write pages, reorganize them, and publish a board as a public page. - Data for your boards: create tables, read and write rows, and run read-only SQL queries whose results show live on a board. - Widgets: build interactive screens (charts, forms, dashboards) that sit on a board, and see a picture of what it built. - Automations: create workflows in Python that keep a board's data current, running on a schedule, from a webhook or by hand, and read each run's results. - Files: browse, search, read and edit the files in your base, and upload new ones. - Connections: see which third-party accounts and keys your base holds, and ask you to add one. Claude never sees or types a secret; you enter it in Moonwalk. Safe to hand to an agent: - Everything Claude changes is recorded as yours, with Claude noted as the agent. - Deleted boards, tables, widgets, automations and files go to a 30-day trash and can be restored. - Edits are versioned, and a batch of row changes can be undone in one step. - Tools are labeled read-only or destructive, so Claude asks before it changes anything. Requires a Moonwalk account (sign up at moonwalk.now). You sign in and approve access on Moonwalk's own screen, and can revoke it at any time from Moonwalk's Agents page.
base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.description is required: one line a person would understand, saying what it does. It is the line its card shows, and an automation made without one is refused (422 description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.after. Every board is at the top level; one board links to another with a mention, never by holding it. It starts members only. The id is yours to mint. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.export function <Name>(props), built from primitives, and may export types beside it: import { Card, Stat } from '@base/primitives' import { won } from '@base/utils' export function StatTiles({ items = [{ label: 'Total', value: 1200 }] }: { items?: { label: string; value: number }[] }) { return <Card>{items.map((i) => <Stat key={i.label} label={i.label} value={won(i.value)} />)}</Card> } A widget is built from the base's parts, three kinds in layers: primitives (Card, Button) → components built of them (StatTiles) → widgets, with utils (formatters, constants) beside them, usable by all three. A screen imports them as @base/primitives, @base/components and @base/utils, always by name: import { Card } from '@base/primitives'. A primitive may import primitives and utils, and usePalette and useTheme from @moonwalk/widget; a component, those and other components; a util, other utils and types from react. Everything a part exports is reached through its kind's module, so a name — Props, say — is exported by one part of a kind only. Build in order: utils and primitives first, then components, the widget last. Each part appears on the person's screen as it is saved, drawn, so the build is watched rather than arriving whole at the end. Props only. A part never imports useQuery, useRun or useRunResult: the widget reads and runs, and hands its parts rows and callbacks. Every prop has a default — a component or a primitive is drawn alone as <Name /> for its preview, so a prop without one does not compile. It must not position itself either: the widget places it. Names are one capitalised word, unique across all three kinds. A save is compiled against the parts it uses and refused with every error by line (422 contract_violation). Then everything standing on it is rebuilt; what no longer compiles keeps its last good build and is behind — behind on the answer lists it, error on a part and behind on a widget say why. Renaming a part leaves what imports the old name behind until you fix it. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.export function <Name>(props), from react, @moonwalk/widget (its palette: usePalette()) and other primitives and utils — never a component: import { usePalette } from '@moonwalk/widget' export function Pill({ text = 'New' }: { text?: string }) { const p = usePalette() return <span style={{ color: p.sub }}>{text}</span> } A widget is built from the base's parts, three kinds in layers: primitives (Card, Button) → components built of them (StatTiles) → widgets, with utils (formatters, constants) beside them, usable by all three. A screen imports them as @base/primitives, @base/components and @base/utils, always by name: import { Card } from '@base/primitives'. A primitive may import primitives and utils, and usePalette and useTheme from @moonwalk/widget; a component, those and other components; a util, other utils and types from react. Everything a part exports is reached through its kind's module, so a name — Props, say — is exported by one part of a kind only. Build in order: utils and primitives first, then components, the widget last. Each part appears on the person's screen as it is saved, drawn, so the build is watched rather than arriving whole at the end. Props only. A part never imports useQuery, useRun or useRunResult: the widget reads and runs, and hands its parts rows and callbacks. Every prop has a default — a component or a primitive is drawn alone as <Name /> for its preview, so a prop without one does not compile. It must not position itself either: the widget places it. Names are one capitalised word, unique across all three kinds. A save is compiled against the parts it uses and refused with every error by line (422 contract_violation). Then everything standing on it is rebuilt; what no longer compiles keeps its last good build and is behind — behind on the answer lists it, error on a part and behind on a widget say why. Renaming a part leaves what imports the old name behind until you fix it. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.run(...) and, for a code step, a ReturnType model it returns. Say why in change_description — one line a person would understand: "Skips weekends". It is the line the automation's history shows, and code saved without one is refused (422 change_description_required). A positional parameter of run(...) is an input, filled from the step's inputs list in order. {"step": "trigger", "path": [...]} reads what fired the run; {"step": "<hash>", "path": [...]} reads an earlier step's output. def run(title, file) -> ReturnType: ... inputs=[{"step": "trigger", "path": ["title"]}, {"step": "trigger", "path": ["file"]}] A count that does not match, or the same names in a different order, is refused at save (422 invalid_step). A step reaches the base's own tables through the SDK — no connection needed, and tables and columns are named by id, never by name: from mw_sdk import BaseModel, Config, Annotated, Literal, Ge, Le, Gt, Lt, MinLen, MaxLen, MultipleOf, connection_type, SecretConnection, BasicConnection, HmacConnection, AccountConnection, tables, files import uuid class ReturnType(BaseModel): written: int def run() -> ReturnType: tables.write(table_id, [ {"op": "insert", "row": str(uuid.uuid4()), "values": {column_id: value}}, ]) return ReturnType(written=1) tables.sql, tables.columns and tables.rows read; tables.write writes, and every write a run makes lands in one transaction, the run's. Undo never takes it back; on each table it touches it is a version of its own. discard_latest_version takes it back while it is still the newest, revert_version to the version before it once something is on top. An op is one of insert, set, delete, restore; row is a UUID the caller mints; values is keyed by column id. A new row lands last; rows are in order and cannot be placed. tables.sql is read-only Postgres over the base's views: a table is "v_<hex>" and a column "c_<hex>", the uuid without its dashes, so a rename never breaks a step. tables.columns(table_id) is how a step gets from a name to an id at run time rather than pasting one in. A step reads and writes files under /files, its working directory, with plain open. Pass any file name that came from outside — a trigger's input, a cell — through files.inside(folder, name) before opening it: it answers the absolute path, /files/<folder>/<name>, and raises ValueError for a name that climbs out of folder. A file field ("format": "file" on a manual trigger) hands the step the path the file was saved at, /files/Uploads/<name>. To delete a file, files.trash(path): it answers nothing, and the file waits in the base's trash for 30 days, so a mistake can be taken back. os.remove cannot be. A config (Config[T] on run) is a setting and never a credential. A key, password or token is a connection, asked for with request_connection. Each step gets 1 hour of wall time and 120 CPU-seconds, counted across every process it starts. Past either it is killed, and its step run's error_type says which: wall_time or cpu_time. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.export function won(n: number) { … }, export const GREEN = '#2f8f6b' — importing other utils and types from react and nothing else. Two utils may not export one name. It draws nothing, so it has no preview. A widget is built from the base's parts, three kinds in layers: primitives (Card, Button) → components built of them (StatTiles) → widgets, with utils (formatters, constants) beside them, usable by all three. A screen imports them as @base/primitives, @base/components and @base/utils, always by name: import { Card } from '@base/primitives'. A primitive may import primitives and utils, and usePalette and useTheme from @moonwalk/widget; a component, those and other components; a util, other utils and types from react. Everything a part exports is reached through its kind's module, so a name — Props, say — is exported by one part of a kind only. Build in order: utils and primitives first, then components, the widget last. Each part appears on the person's screen as it is saved, drawn, so the build is watched rather than arriving whole at the end. Props only. A part never imports useQuery, useRun or useRunResult: the widget reads and runs, and hands its parts rows and callbacks. Every prop has a default — a component or a primitive is drawn alone as <Name /> for its preview, so a prop without one does not compile. It must not position itself either: the widget places it. Names are one capitalised word, unique across all three kinds. A save is compiled against the parts it uses and refused with every error by line (422 contract_violation). Then everything standing on it is rebuilt; what no longer compiles keeps its last good build and is behind — behind on the answer lists it, error on a part and behind on a widget say why. Renaming a part leaves what imports the old name behind until you fix it. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.change_description — one line, in words the person would use: "Shows the week's total above the chart". It is the line the widget's history shows for this version, and a source saved without one is refused (422 change_description_required). A screen may import react, @moonwalk/widget, @base/primitives, @base/components and @base/utils and nothing else — a part by its name — and exports its component as the default export: import { publicUrl, useFocus, usePalette, useQuery, useRun, useRunResult, useScroll, useTheme } from '@moonwalk/widget' export default function Tasks() { const tasks = useQuery('tasks') // a key of declaration.data const move = useRun('move') // a key of declaration.runs const collect = useRunResult() // a run answered strt, asked again by its id const theme = useTheme() // 'light' or 'dark' const palette = usePalette() // the kit's colours, in that theme const scroll = useScroll() // 0 → 1 as the page scrolls this block past const focus = useFocus() // false while the reader is in another window if (!tasks.rows) return <p>Loading…</p> return ( <> <audio src={publicUrl('theme.mp3')} controls /> {/ /files/Public/theme.mp3 /} <ul style={{ color: palette.text }}>{tasks.rows.map((t) => <li key={t.id}>{String(t.title)}</li>)}</ul> </> ) } The <Screen> provider is mounted around it for you; a screen never renders one. useQuery gives {rows, broken} and nothing that writes. There is no fetch, no token and no storage — the broker is the only way in or out. Build a widget from parts. Save utils and primitives first, then the components made of them, and the widget last, importing them — import { StatTiles } from '@base/components'. Each part appears on the person's screen as it is saved, so the build is watched; and the widget's own source stays short. Parts take props only: the widget reads and runs, and hands them rows and callbacks. create_component, create_primitive and create_util say the rest. A widget whose parts changed under it and no longer compiles keeps its last good build, with behind naming why. useRun gives a function resolving to {run_id, status, returncode, output}. status is fin (it ended) or strt (still going past the server's 3-second wait — not a failure). fin does not mean it worked: check status === 'fin' && returncode === 0. rej never reaches a screen — a refused run rejects the promise instead. output is the JSON object the automation's last step returned — its ReturnType — so read the field you want: run.output.message. It is null while strt and when the last step failed, and past 16 KB it is {"$over": <bytes>}: a run answers, it does not hand over a dataset. get_widget reports each run's output_schema. A run answered strt can be collected later: useRunResult()(run.run_id) resolves the same shape. A run may take a file. A trigger property marked {"type": "string", "format": "file"} takes one, and a screen passes a File at the top level of input — useRun('import')({ book: file, language: 'en' }). It goes as bytes in the one request, is saved into /files/Uploads/, and the step is handed the path it was saved at. Nothing in the SDK is new for it: an <input type="file"> and the File it yields. This is the one thing you cannot do yourself — fire_automation names a path because MCP carries no bytes, and the browser is the caller that sends them. A file past 100 MB is refused, 413 too_large. A screen loads a file from the base's Public/ folder by naming it: <audio src={publicUrl('theme.mp3')} controls /> plays /files/Public/theme.mp3. Images and fonts load the same way. Only files in Public/ can be named like that, and anybody can open them, signed in or not, so moving a file in is publishing it. The screenshot a save answers with does not load them. A declaration is data and runs. A widget reads and runs, and does nothing else — there is no way…base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.restore_automation brings it back with its trigger live. Refused while a widget binds it, naming the widgets. One with no steps that nothing but your own open sitting ever touched is deleted outright instead, and has no way back. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.restore_board brings it back; list_trash with board shows it. While it is in the trash its view link answers not-found. One with nothing in it that nothing but your own open sitting ever touched is deleted outright instead, and has no way back. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.restore_column takes it back, with its values — and so do undo, to the place it held, and reverting the table to a version from before the drop. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.in_use, naming what does). restore_component brings it back. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.list_trash with kind="file" is where it is now, and restore_file takes the id from there and puts it back where it was. Never the root, /files/Uploads or /files/Public. Nothing you do deletes a file for good. Documented at https://docs.moonwalk.now/tools.html#files. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.in_use, naming what does). restore_primitive brings it back. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.if takes both branches. Refused while a step left behind reads one that goes; rewire or delete that step first. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.restore_table brings it back — unless the table held no rows and nothing but your own open sitting ever touched it, which is deleted outright and has no way back. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.in_use, naming what does). restore_util brings it back. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.restore_widget brings it back. Refused while a board still draws it, naming the blocks. One with no source that nothing but your own open sitting ever touched is deleted outright instead, and has no way back. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.heading block: its text, and level 1, 2 or 3 in props. A set at ["type"] turns a paragraph into a heading or back and keeps the block's id — send the level with it. A value box is a text chunk {"value": {"sql": …, "description": …}}: one cell of a query, drawn live inside a sentence. Always both fields, the description one line. Rows on a board are a widget's job: make one with create_widget and put a widget block on the board. A text chunk may instead be {"mention": "<board id>"}: a live board of this base, drawn as its current title. It stores no title, and anything else it names is refused with mention_invalid. A board is never a block of another board. Marks sit flat on a chunk: bold, italic, underline, code, strike, link, and color for the ink and background for a wash behind it. A colour is a name, never a hex — grey, brown, orange, yellow, green, blue, purple, pink or red — and the two are independent. An image block's props are exactly one of {"path": "/files/…"}, a picture in the base's files, or {"url": "https://…"}, one on the web. A path is copied into the block and shrunk to 4000 px, so moving or deleting the file later changes nothing; it is stored as image, width and height, and the answer's stored says so. A URL is drawn live and breaks when its site does. PNG, JPEG, GIF and WebP only. To put a local file on a board, request_upload it and name the path you get back. The description is for the person, not for you: what the query asks, in the words someone would use to ask for it — "Tasks still open, newest first". The SQL is physical names in hex and nobody can read it, so this is the only readable record of what the block draws, and a block saved without one is refused. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.options is the full list: keep an option by its id, relabel it under the same id, add one with a label only, leave one out to remove it. Ids never change, so nothing naming them breaks. An option a row still holds cannot be removed. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.old with new in a component's source, leaving the rest byte for byte, and save it. old must appear exactly once — include enough of the lines around it — unless replace_all. A refused edit saves nothing. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.old with new in a text file, leaving the rest of it byte for byte. old must appear exactly once — include enough of the lines around it to make it unique — unless replace_all. Nothing changes when the edit is refused, and the answer says why. To write a whole file, use write_file. Documented at https://docs.moonwalk.now/tools.html#files. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.old with new in a primitive's source, leaving the rest byte for byte, and save it. old must appear exactly once — include enough of the lines around it — unless replace_all. A refused edit saves nothing. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.old with new in a util's source, leaving the rest byte for byte, and save it. old must appear exactly once — include enough of the lines around it — unless replace_all. A refused edit saves nothing. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.old with new in a widget's screen source, leaving the rest byte for byte, and save it — answered as update_widget is, with the picture. old must appear exactly once — include enough of the lines around it — unless replace_all. A refused edit saves nothing. Say why in change_description — one line, in words the person would use: "Shows the week's total above the chart". It is the line the widget's history shows for this version, and a source saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.dependencies are pip requirements installed into a fresh venv; the first call for a given set takes about a minute. A snippet gets the same limits as a step: 1 hour of wall time and 120 CPU-seconds, counted across every process it starts. Past either it is killed, and killed_by says which: wall_time or cpu_time. cpu_ms and wall_ms are what the CPU and wall-time limits count: every process it started, from the moment it was sent. Installing its dependencies comes first and is in neither, so a first run can take a minute and report a few hundred ms. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview."format": "file") takes the path of a file already in the base — /files/Uploads/book.pdf; request_upload is how a file from your own machine gets there. You are the one caller that names a path; every other sender of a run, a widget's screen included, sends the file itself. 422 file_not_found for a path that is not a file. Each step gets 1 hour of wall time and 120 CPU-seconds, counted across every process it starts. Past either it is killed, and its step run's error_type says which: wall_time or cpu_time. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.input_parameters, plus its output shape and its scopes. Read it before writing the call rather than guessing at argument names. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.pending or filled, and — once filled — the connection that was actually made, which may not be the name you asked for. 404 no_such_request once the person declined it, expired once the hour is up. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.input) and what it returned (output). Either is {"$over": <bytes>} past 16 KB. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.cpu_ms and wall_ms are what the CPU and wall-time limits count: every process it started, from the moment it was sent. Installing its dependencies comes first and is in neither, so a first run can take a minute and report a few hundred ms. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.url: on that screen they press the eye on the trigger and copy the secret to paste upstream. secret_set is false while an upstream secret has not been pasted in. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.source is a stub — a name waiting for you to write its screen with update_widget. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.re) inside the base's files, dotfiles included, and answer each hit's path, line number and text. Case-sensitive unless case_insensitive. path is the folder to search under; glob narrows which files are read, matched the way search_files matches. Binary files, files too large to preview and lines over 10,000 characters are skipped. At most 100 hits; truncated says there were more. Documented at https://docs.moonwalk.now/tools.html#files. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.search. 409 not_an_account for a connection that was typed rather than clicked — only an account has a catalogue. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.{id, name}, oldest first. Every other tool acts on one of them and takes its id as base_id, read_overview optionally. More than one base means the person's words may fit either.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview./api/mcp — with its name, kind, who asked, why, and when it runs out (expires_at). The list the Connections dot reads. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview./files, the root — /files/notes/todo.md — and every answer spells it that way. Documented at https://docs.moonwalk.now/tools.html#files. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.run_sql. The database screen's own filter is the UI's and adds nothing an agent holding SQL does not already have. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.request_connection with account rather than guessing it. 503 not_configured means no account can be linked on this stack at all. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.purge_at, 30 days after it was deleted). file lists a deleted folder and not what was in it, and each row carries the path it came from — which is what tells two files of one name apart. Restore with restore_board, restore_widget, restore_automation, restore_table or restore_file — or restore_component, restore_primitive, restore_util — each of which takes the id of a row here. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.actor_kind and via say whose: you, the person, or a run. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.kind: undeclared_data and undeclared_run for a read or run its declaration never named, automation_gone for a declared run whose automation has left, render for a screen that threw, compile for a save the compiler refused. A run's own failure is not here — get_run has it. limit is capped at 200. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.after in the list, or first when after is null. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.to is the whole new path. Never /files/Uploads itself, and never in or out of the trash. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.undo would take back, without taking it: the transaction, how many rows, and how many changes of each kind — drop or add for a column. undo takes the newest write of the member you act for — theirs in the browser as much as yours — so read this first when that matters. {"ok": true} when there is nothing to undo. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.encoding image, and the picture, shrunk to 2000 px. Any other file that is not UTF-8, or is too large, comes back as binary with no text. Documented at https://docs.moonwalk.now/tools.html#files. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id to also get what that base holds.section (boards, database, widgets, …), the id and name of what was open, and line, one sentence saying so. seconds_ago is how long since the tab reported it — it reports on moving and on coming back into view, so an old one most likely means the person has moved on to another window. {"screen": null} means this person has never had the base open. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.secret, basic or hmac for a key they type, or account for a service they connect by clicking — then provider is the service's slug, like gmail. Never ask for an API key, password or token in the conversation, and never accept one there. In the chat panel a box asks them under your message, and their answer comes back to you as the next message: stop and wait for it. Anywhere else, show them the URL this answers and stop; then poll get_connection_request. The name is a proposal — bind steps to the name the answer gives, not the one you asked for. For a key, how_to_get is required: the path to it from where the person starts, as site > page > button, like platform.openai.com > API keys > Create new secret key. Add how_to_get_url, like https://platform.openai.com/api-keys, when you know the page. It shows in the box where they type the key, so write it for someone who has never done it. When you're not sure of the path, say so in it rather than inventing one. An account takes neither. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.command it answers with your file's path in place of the placeholder; the upload answers {"path": "/files/Uploads/…"}, which is what a file field in fire_automation takes. The link works once, for 5 minutes. If the upload cannot connect, do what the note says. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.list_trash names what is there. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.id is a row's from list_trash, not a path. Refused when something is at that path now. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.locked). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview."v_<hex>" (get_table gives the ids; the hex is the uuid without dashes) and a column is "c_<hex>". Select id when you want the rows to be writable or numbered. A select/multi_select value is an option id, not its label. Writes are refused by the database itself, not by a check here: there is one role per base, granted SELECT on its views and nothing else. Use write_rows to change anything. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.page of pages, and page: 2 is the next 1200 pixels, and so on to the end. Each call draws the board afresh. A page past the last is refused, naming how many there are. theme picks light (the default) or dark. thrown is anything a widget threw while it drew. When it cannot be drawn the answer is {"screenshot": {"unavailable": <reason>}}. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.thrown a save answers with, without saving. For a widget whose rows may have changed since it was last saved; a save already answers with one. Nothing is written and no run is fired: while it draws, every run is refused not while previewing. theme picks light (the default) or dark. A stub answers {"screenshot": null}, and one that cannot be drawn {"unavailable": <reason>}. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.q — the sidebar's filter. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview./ matches a name at any depth (*.md); one with a / matches the path from path, ** descending (notes/**/*.md), or from the root when it starts /files/. Dotfiles are included. At most 100 answers. Documented at https://docs.moonwalk.now/tools.html#files. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.edit_board answers board_locked — for everyone, until somebody unlocks it. Moving, trashing and its visibility still work. Unlock only when the person asked you to change that board. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview./b/<name>-<token>: members of this base, signed in, or anybody with the link, signed in or not — public. Every board has the link from the moment it is made, and it never changes: only the token is read, so a rename never breaks a link already handed out. The answer's path is that link. Make a board public only when the person asked for it to be public. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.Config[T] on run) is a setting and never a credential. A key, password or token is a connection, asked for with request_connection. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.url: on that screen they paste it into the trigger; never ask for it in the conversation. Refused (409 system_generated) when Moonwalk made the secret; that one is copied, with get_webhook_secret. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.next_undo says which before you call it. A row write, or a column dropped or added: a dropped column comes back where it was, with its values. Cells another write has since changed are skipped and reported, never overwritten. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.description_required); leave it out to keep the one there. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.edit_component sends less. A widget is built from the base's parts, three kinds in layers: primitives (Card, Button) → components built of them (StatTiles) → widgets, with utils (formatters, constants) beside them, usable by all three. A screen imports them as @base/primitives, @base/components and @base/utils, always by name: import { Card } from '@base/primitives'. A primitive may import primitives and utils, and usePalette and useTheme from @moonwalk/widget; a component, those and other components; a util, other utils and types from react. Everything a part exports is reached through its kind's module, so a name — Props, say — is exported by one part of a kind only. Build in order: utils and primitives first, then components, the widget last. Each part appears on the person's screen as it is saved, drawn, so the build is watched rather than arriving whole at the end. Props only. A part never imports useQuery, useRun or useRunResult: the widget reads and runs, and hands its parts rows and callbacks. Every prop has a default — a component or a primitive is drawn alone as <Name /> for its preview, so a prop without one does not compile. It must not position itself either: the widget places it. Names are one capitalised word, unique across all three kinds. A save is compiled against the parts it uses and refused with every error by line (422 contract_violation). Then everything standing on it is rebuilt; what no longer compiles keeps its last good build and is behind — behind on the answer lists it, error on a part and behind on a widget say why. Renaming a part leaves what imports the old name behind until you fix it. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.edit_primitive sends less. A widget is built from the base's parts, three kinds in layers: primitives (Card, Button) → components built of them (StatTiles) → widgets, with utils (formatters, constants) beside them, usable by all three. A screen imports them as @base/primitives, @base/components and @base/utils, always by name: import { Card } from '@base/primitives'. A primitive may import primitives and utils, and usePalette and useTheme from @moonwalk/widget; a component, those and other components; a util, other utils and types from react. Everything a part exports is reached through its kind's module, so a name — Props, say — is exported by one part of a kind only. Build in order: utils and primitives first, then components, the widget last. Each part appears on the person's screen as it is saved, drawn, so the build is watched rather than arriving whole at the end. Props only. A part never imports useQuery, useRun or useRunResult: the widget reads and runs, and hands its parts rows and callbacks. Every prop has a default — a component or a primitive is drawn alone as <Name /> for its preview, so a prop without one does not compile. It must not position itself either: the widget places it. Names are one capitalised word, unique across all three kinds. A save is compiled against the parts it uses and refused with every error by line (422 contract_violation). Then everything standing on it is rebuilt; what no longer compiles keeps its last good build and is behind — behind on the answer lists it, error on a part and behind on a widget say why. Renaming a part leaves what imports the old name behind until you fix it. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.change_description — one line a person would understand: "Skips weekends". It is the line the automation's history shows, and code saved without one is refused (422 change_description_required). Each step gets 1 hour of wall time and 120 CPU-seconds, counted across every process it starts. Past either it is killed, and its step run's error_type says which: wall_time or cpu_time. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.edit_util sends less. A widget is built from the base's parts, three kinds in layers: primitives (Card, Button) → components built of them (StatTiles) → widgets, with utils (formatters, constants) beside them, usable by all three. A screen imports them as @base/primitives, @base/components and @base/utils, always by name: import { Card } from '@base/primitives'. A primitive may import primitives and utils, and usePalette and useTheme from @moonwalk/widget; a component, those and other components; a util, other utils and types from react. Everything a part exports is reached through its kind's module, so a name — Props, say — is exported by one part of a kind only. Build in order: utils and primitives first, then components, the widget last. Each part appears on the person's screen as it is saved, drawn, so the build is watched rather than arriving whole at the end. Props only. A part never imports useQuery, useRun or useRunResult: the widget reads and runs, and hands its parts rows and callbacks. Every prop has a default — a component or a primitive is drawn alone as <Name /> for its preview, so a prop without one does not compile. It must not position itself either: the widget places it. Names are one capitalised word, unique across all three kinds. A save is compiled against the parts it uses and refused with every error by line (422 contract_violation). Then everything standing on it is rebuilt; what no longer compiles keeps its last good build and is behind — behind on the answer lists it, error on a part and behind on a widget say why. Renaming a part leaves what imports the old name behind until you fix it. Say why in change_description, one line in the person's words: it is the line the part's history shows, and code saved without one is refused (422 change_description_required). This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.edit_widget sends less. Say why in change_description — one line, in words the person would use: "Shows the week's total above the chart". It is the line the widget's history shows for this version, and a source saved without one is refused (422 change_description_required). Build a widget from parts. Save utils and primitives first, then the components made of them, and the widget last, importing them — import { StatTiles } from '@base/components'. Each part appears on the person's screen as it is saved, so the build is watched; and the widget's own source stays short. Parts take props only: the widget reads and runs, and hands them rows and callbacks. create_component, create_primitive and create_util say the rest. A widget whose parts changed under it and no longer compiles keeps its last good build, with behind naming why. useRun gives a function resolving to {run_id, status, returncode, output}. status is fin (it ended) or strt (still going past the server's 3-second wait — not a failure). fin does not mean it worked: check status === 'fin' && returncode === 0. rej never reaches a screen — a refused run rejects the promise instead. output is the JSON object the automation's last step returned — its ReturnType — so read the field you want: run.output.message. It is null while strt and when the last step failed, and past 16 KB it is {"$over": <bytes>}: a run answers, it does not hand over a dataset. get_widget reports each run's output_schema. A run answered strt can be collected later: useRunResult()(run.run_id) resolves the same shape. A run may take a file. A trigger property marked {"type": "string", "format": "file"} takes one, and a screen passes a File at the top level of input — useRun('import')({ book: file, language: 'en' }). It goes as bytes in the one request, is saved into /files/Uploads/, and the step is handed the path it was saved at. Nothing in the SDK is new for it: an <input type="file"> and the File it yields. This is the one thing you cannot do yourself — fire_automation names a path because MCP carries no bytes, and the browser is the caller that sends them. A file past 100 MB is refused, 413 too_large. A screen loads a file from the base's Public/ folder by naming it: <audio src={publicUrl('theme.mp3')} controls /> plays /files/Public/theme.mp3. Images and fonts load the same way. Only files in Public/ can be named like that, and anybody can open them, signed in or not, so moving a file in is publishing it. The screenshot a save answers with does not load them. A declaration is data and runs. A widget reads and runs, and does nothing else — there is no way to write a row through a query, so a data entry has no mode and a declaration carrying one is refused. Each declaration.data entry is two fields: sql and description. The SQL is read-only Postgres over this base's views — "v_<hex>" for a table and "c_<hex>" for a column, both derived from ids, so a rename never breaks one. Alias every column to the key the screen reads, and select id when the screen needs a row to name in a run. The description is for the person, not for you: what the query asks, in the words someone would use to ask for it. The SQL is hex and nobody can read it, so this is the only readable record, and an entry without one is refused. Each declaration.runs entry is the screen's name for it → the id of an automation that already exists in this base. Its trigger must be manual: a cron or webhook trigger fills its own payload, so a screen has nothing to supply. useRun('move')(input) fires it with input as the trigger's output, so input has to fit that trigger's output_schema — read it back off get_widget, which reports each run as {automation_id, automation_name, input_schema, output_schema}, the last being what the run's output holds. Build the a…list_connection_requests says who asked. Nothing is woken, not even the chat that asked: it learns from get_connection_request's 404, the way it learns of an expiry. 409 already_answered once filled. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview./files/.agent/memory/, whose folders are made. This is Moonwalk. base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.base_id is an id from list_bases. The rules of a Moonwalk base that no single tool states are in read_overview.Click any prompt to copy it.
App Stats
204
Tools
3
Prompts
ChatGPT, Claude
Platforms
Category
Data ExplorationWorks with
Data refreshed daily