Shift+Enter for new line · @N loads community #N

What do you want to build?

Describe it in the chat on the left. You get a working tool back in seconds, and everything after that is editing — in chat, on the canvas, or in the JSON.

1
Describe “A stocktake tool with an item input, a quantity counter and a running total.”
2
Refine “Make it dark.” “Add a Clear button.” Chat, Simulator and the JSON tab all edit the same document.
3
Use Open the Simulator and it runs. Download the JSON to keep it or take it elsewhere.

Or start from one that already works — these open running, and you can change anything about them.

{ } Tool JSON

This is the whole tool. Edit it here and press Apply to update the preview — it is checked against the CobbleIT contract as you type, so you find out what is wrong before you apply it. See the for what each field means.

📖 Guide

How to describe a tool, refine it, and edit the JSON by hand.

You never write code. The code is already here — CobbleIT knows how to draw a counter, run a button, poll an API and lay out a grid. A tool is a JSON document that says which of those pieces you want and how they connect. Describing it in chat writes that JSON for you; the Simulator and the JSON tab let you change it. There is nothing to install, compile or deploy.

How it works

1
Describe it Say what the tool is for in plain English. Mention the numbers you want to see and the buttons you want to press.
2
Refine it Ask for changes in chat, drag boxes around in the Simulator, or edit the JSON directly. All three edit the same document.
3
Use it It already runs. Open the Simulator and press the buttons — the tool works here, in the browser. Download the JSON to keep a copy or run it on another device.

Writing a good first prompt

The generator does better with concrete nouns than adjectives. Say what goes on the screen, not how it should feel.

Instead ofTry
"a nice fitness app""A workout tracker with a counter for each of squats, press-ups and pull-ups, a reset button, and a checkbox list for today's session"
"something for work""A stocktake tool: an input for the item name, a counter for quantity, a running total, and a Save button that appends the item to a list"
"make it good""Use one accent colour, group the counters into a single row, and give the whole thing a dark background"

What you can put on a tool

These are the box types the generator can produce. Ask for them by name and you will get them.

What buttons can do

Buttons and inputs trigger actions against other boxes. Ask for behaviour and the generator wires it up.

ActionWhat it does

Refining an existing tool

Every refinement rebuilds the whole tool with your change applied, so you can keep going in one conversation. Things that work well:

  • “Make it dark” · “Use green as the accent” · “Give it more breathing room”
  • “Add a notes section at the bottom”
  • “Split the detail boxes onto a second tab”
  • “Make the counters bigger and put them in one row”
  • “Add a Clear button that resets every counter”

Chat commands

CommandEffect
@3Load community tool #3 into the preview, ready to modify
… @3 …Mention a community tool inside a sentence to use it as a starting point, e.g. “make @3 dark and add a notes box”
Shift + EnterNew line instead of sending

Editing the JSON by hand

The holds the whole tool — there is no other file, and no code behind it. Every box you see is one entry in this document, and changing an entry changes the tool. It is validated as you type, so a mistake shows up before you apply it. The shape is:


        
FieldMeaning
gridCols / gridRowsSize of the canvas. Cells are square. Default 16 × 256.
tabs[].idA name, up to 64 characters of letters, numbers, hyphen and underscore: today, week, goals. This is what SWITCH_TAB targets. Older tools using a single letter still load.
boxes[].idUnique across the whole document. Actions and formulas refer to boxes by this id.
position / sizex,y is the top-left cell; w,h is the span. x + w must not exceed gridCols, and boxes must not overlap.
configDepends on the box type — a TEXT box takes value, a BUTTON takes text, a COUNTER takes a numeric value.
actions[]event is ON_CLICK or ON_TEXT_CHANGE; targetBoxId must name a box that exists (or a tab id, for SWITCH_TAB).
boxes[].compute{ "formula": "SUM({log.kg})" } — the box shows the result and recalculates it whenever anything it reads changes, on any tab.
boxes[].sharedMirror this box to everyone in the same room. Needs sharing.enabled on the document.
state{ "persist": "local" } keeps entries and ticks in this browser between visits. Add "lock": true to put the tool behind a passcode and encrypt what it stores.
sharing{ "enabled": true, "label": "Route board" } turns on the room bar above the tool.
requestBlocks[]Named HTTP requests for live data, each able to carry a credential. See Integrations.

Formulas — the one thing that is not just layout

A box can carry a compute formula instead of a fixed value. The formula reads other boxes by id — {weight}, {log.kg} — and the tool recalculates it every time anything it reads changes. That includes boxes on other tabs, which is what makes a multi-tab tool behave like one thing: log a set on the first tab and the totals on the third are already right when you get there.

This is a fixed expression grammar, not a scripting language. There is no way to write a loop, read a property, or name a web address in a formula, so a tool someone else published can compute a wrong number and nothing worse.

Write thisAnd you get
{kg} * {reps}Arithmetic over two boxes. + - * / % and brackets.
SUM({log.volume})The total of one column of an entry log, table or list.
AVG · MIN · MAX · COUNTThe rest of the column arithmetic. COUNT({log}) counts rows.
DONE({tasks}) · TODO({tasks})How many are ticked, and how many are not.
ROUND(x, 2) · FLOOR · CEIL · ABS · SQRT · POW · CLAMPNumber shaping.
IF({a} > {b}, 'over', 'under')A readout in words. AND, OR, NOT and == != < > <= >= all work.
CONCAT('€', ROUND({total}, 2))A sentence built from live values. LEN and WORDS measure text.
TODAY() · NOW() · DAYS_BETWEEN(a, b)Dates.

Select the box in the Simulator’s edit mode and there is a Formula field in the properties panel; it tells you straight away if you name a box that is not there.

Tools that remember

Add "state": { "persist": "local" } to the document and everything the person using the tool changes — ticks, entries, notes, slider positions — is still there next time they open it. It is kept in their own browser; nothing is uploaded, and it never reaches us.

Add "lock": true alongside it and the tool asks for a passcode before it will show anything, and encrypts what it stores with a key derived from that passcode (AES-GCM, PBKDF2). The passcode is never stored and never sent, which also means nobody can reset it — lose it and the entries are gone. That is the honest trade for a diary that is actually private.

Boards several people share

Set "sharing": { "enabled": true, "label": "Route board" } on the document and "shared": true on the boxes that everyone should see the same way. A bar appears above the tool: press New room to get a code, or type one someone gave you. Everyone signed in and on that code sees the same values in those boxes, live, and can see who else is on the board.

  • A shared box holds one value for the whole room. Per-person state belongs in a shared entry log with keyField set to the person's name — then answering twice replaces your row instead of adding another.
  • The room code is the invitation. Anyone signed in who has it can join; nobody who does not can find it, read it or write to it — that check guards the live channel as well as the stored board. Treat the contents as being as private as the code, and do not put anything in a room that would matter if it leaked.
  • A room is live state, not an archive. Rooms nobody has touched for 30 days are cleared out.
  • Sharing needs an account. Everything else on this page works signed out.

Live data

A tool can pull from a real API. Connect the service on the first, then ask for it by name — “show the Bitcoin price from CoinGecko”. Your credentials stay in this browser: they are never sent to the generator and are stripped from anything you download or publish.

There are two paths, and the difference matters. A box dataSource with a URL fetches one public endpoint with no key attached. A requestBlock is a named request that can carry a credential — that is what a tool needs for GitHub, Todoist or anything behind a token. When you open a tool whose requests need a key you do not have, a Keys needed strip appears above it; what you type there is saved in this browser against that tool and nowhere else.

Google is different, and better. A tool that reads your Google Analytics, Search Console or Sheets data shows a Connect button instead of a key box. The sign-in happens directly between your browser and Google, which hands the page a token — there is no secret to paste and nothing to store. That token lives in memory until you close the tab: it is in nothing you download, nothing you publish, and it never reaches us. Google shows you exactly what a tool is asking to read before you agree, and you can withdraw it from your Google account at any time. Other OAuth services (Spotify, Google Calendar) are not wired up here yet and work in the Android app; the tool says so rather than failing silently.

Both paths are limited to the same thing: a service that lets a web page read its answers. Plenty do not — Notion and most self-hosted admin APIs among them — and no amount of configuration changes that from inside a browser. The marks each service accordingly rather than letting you find out by connecting one.

Anything else, through a spreadsheet

A Google Sheet published with File → Share → Publish to web → Comma-separated values serves its contents from docs.google.com to any page that asks — no key, no sign-in, nothing in between. That makes it the way in for every source that will not answer a browser directly: get the numbers into a sheet, by hand, by formula, by IMPORTDATA, or by a script that calls the API on a timer, and a tool can read them.

Point a box at the published URL with "type": "csv", a rowIndex and a column, both counting from zero and both skipping blank lines. Quoted cells, embedded commas and line breaks inside a field are all read properly, which matters because every analytics export uses them. A value that arrives this way is an ordinary number: formulas elsewhere in the tool can divide it, total it and compare it exactly as if you had typed it. The Marketing board from a Google Sheet template in is a worked version, with the sheet layout it expects.

Where a tool runs

A tool is one JSON document, and it opens either here or in the Android app. The two are not at parity, and pretending otherwise would mean a tool that quietly does nothing on the other side. Downloading a tool tells you which of its features are web-only.

RuntimeWhere it stands

Accounts

You do not need one. Describing, generating, refining, the Simulator, the JSON tab and downloading all work signed out. An account adds three things:

  • My Tools — saves to the cloud so your work follows you between devices, rather than living only in this browser.
  • Publishing to the community gallery, under a display name you choose.
  • Liking other people's tools.

Sign-in is a link emailed to you — no password. Your email address is never shown publicly: published tools carry the display name you set in , or “anonymous” if you leave it empty.

Limits

    🔌 Integrations

    Connect a service once, then ask for it by name in chat — “show my open GitHub issues”, “add the Bitcoin price”.

    Your keys stay in this browser. They are saved to local storage on this device only. They are never sent to the AI, never included in the JSON you download, and are stripped from anything you publish to the community gallery.
    Your own Google Analytics, Search Console and Sheets need nothing here. A tool that reads them shows a Connect button when you open it: you sign in to Google directly, and the token it hands back lives in the page until you close the tab — there is no key to paste and nothing to store. Start from or in Samples. A spreadsheet published to the web needs no sign-in at all.
    Connected
    Available services

    Click a service to connect it. Tools may only call these hosts — the generator will not invent an endpoint, and a tool that tries to reach anywhere else is rejected before it reaches you.

    ⚙️ Settings

    Generation is included — there is no API key to set up. Requests run through the CobbleIT service, which is rate-limited per user.

    Layout Defaults

    Cloud connected
    No dashboard loaded