Your name on it
Every listing carries its maker’s name. Share what you made in the Marketplace, free, once it passes a review.
For builders
The best thing in your space may not exist yet. Someone will make it.
The Studio
You don’t have to write code to make something that fits.
Week 45 · 6 jobs · 3 machines
CNC 2: J-119 and J-120 overlap on Wednesday morning
J-120 Oak trays · 9 parts, grain along
After this week's jobs
Your extension appears here
Describe it in the chat, or start from one of these:
Building your extension…
It appears here as soon as it's made.
The preview shows the last build that worked once this one is fixed.
1import { defineExtension } from "@spacemix/sdk";2import { checkStock, rescheduleJob } from "./actions";3import { events } from "./lib/events";4import { jobs, machines, sheets, stock } from "./lib/types";56export const manifest = defineExtension({7 id: "maija.workshop-planner",8 name: "Workshop Planner",9 version: "0.1.0",10 description: "Jobs, machines, cut lists and stock for the workshop.",11 icon: "factory",12 permissions: ["storage", "events"],13 collections: [jobs, machines, stock, sheets],14 actions: [rescheduleJob, checkStock],15 events,16 notifications: [17 { name: "job_late", title: "Late jobs", description: "When a job runs past its date." },18 ],19});
Install Workshop Planner 0.1.0 on this server without publishing it, for everyone who has access to it.
Mixing
Add it once, and everyone with access has it.
Find extensions for your servers, or sell your own.
Browse and edit the people, companies, opportunities and custom objects in your Twenty CRM.
v0.1.7·by SpaceMIX Team·0 servers
Can send data to any host it asks for. · 5 risks under Technical details
Free. Install it on any server where you can manage extensions.
Browse and edit the records in a Twenty workspace: people, companies, opportunities, notes, tasks and any custom objects. The assistant can read and change the same records.
twenty/
index.ts Entry point: manifest + view + action handlers
manifest.ts Id, permissions and the actions offered to the assistant
actions.ts Action handlers, written against lib/client.ts
lib/types.ts Settings, object/field metadata, records, list parameters
lib/client.ts The REST client (auth, envelopes, errors, metadata, search) and display helpers
lib/events.ts Declared events; the client emits them after each create and update
lib/settings.ts Connection settings, shared by the view and the actions
lib/mcp.ts The connection to Twenty's own MCP server (`mcpServerFor`), and which of its tools ask first
lib/hooks.ts Live data hooks for the view
lib/route.ts The view's route (Back/Forward, links): parse and format
lib/viewState.ts Saved view per object (columns, sorts, filters, layout) → Twenty filter/order_by strings
lib/related.ts Hooks for a record's timeline, tasks, notes, files and links
view/ The view, laid out like Twenty itself (see below)
It copies Twenty's placement of things, not its styling:
ObjectRail: Twenty's navigation drawer: workspace menu, Settings, then the "Workspace" objects (People, Companies, Opportunities, Tasks, Notes, then the rest) and custom ones.IndexPage: header with the object name, "New record" and "⋯"; ViewBar under it (view picker, Filter, Sort, Options, and a chips row for what's applied); then RecordTable or Kanban. Selecting rows brings up the floating action bar (Delete, Export).RecordTable: checkbox column, sticky name column with avatar and an "Open" button on hover, field icons in headers, a "+" header for hidden fields, inline cell editing (CellEditor), "+ Add New" row and a "Count all" footer. More rows load on scroll.Kanban: one column per option of a select field (Stage for opportunities), drag cards between columns.RecordPanel: the side panel next to the table, or the full show page when "Open" is pressed. Summary card, fields as label/value rows, relation sections, and the Timeline / Tasks / Notes / Files tabs (view/record/). Notes and tasks show their body and what they're linked to.chips.tsx and icons.tsx: Twenty's value chips, select tags, avatars, and object/field icons (Tabler names mapped to Lucide).The listed object, the open record and how it's shown are the view's route (lib/route.ts), so Back and Forward step through them and a reload reopens the same place:
| Route | Opens |
|---|---|
"" | People (or the first standard object) |
<list> | That object's index, by plural name: companies |
<list>/<object>/<id> | A record in the side panel beside <list>'s index. <object> can differ from <list> after following a relation |
<list>/<object>/<id>/page | The same record's full show page |
…/<id>[/page]/<tab> | With the tasks, notes or files tab open instead of the first |
The connection dialog, menus, the view's filters/sorts (saved per object instead) and which pane a phone shows are not in the route. A route naming an object the workspace doesn't have falls back to the nearest page with replace; deleting the open record does the same. Notification targets (<object>/<id>) open the record over the current list as a new step.
Twenty is remote and is the source of truth. Nothing is cached on disk except the connection settings (server URL and API key, under host storage key settings), so the view and the assistant always see what's in Twenty.
createClient(settings) in lib/client.ts, a wrapper over host.net.fetch that sends the key as a Bearer token and turns failures into a TwentyError that says how to fix them (bad key, unreachable server, Twenty's own validation messages).net:* because the user names the server; the app asks once per new host./rest/metadata/objects, fetched once per client and kept in memory. Only active, non-system objects and active fields are used. The actions keep one client per server + key; the view builds its own./rest/{namePlural}. Writes made through any client fire changes, so the view refetches after the assistant edits something.summarize turns a record into the compact form the assistant sees: composites flattened to text where nothing is lost, related records as { id, label }, long text cut off.Twenty's metadata format differs between versions (paginated data: [...] now, data: { objects } before; relation targets under relation, fromRelationMetadata/toRelationMetadata, or only settings.joinColumnName). The client reads all of them; see relationOf.
Links in the view (web links, attachments) open through host.shell.openUrl; email addresses and phone numbers are copied, since the frame can't open them.
Twenty has no collections, so these are all its events. lib/client.ts emits them after every successful create and update made through SpaceMIX (view and assistant alike); changes made in Twenty itself, or through its own MCP tools, aren't seen. Twenty's system records (the links between tasks or notes and records) are left out. Both target <object>/<id>, which opens the record.
| Event | When | Payload |
|---|---|---|
record_created | A record was created: a new row or card, a note or task on a record, twenty_create | object (plural name), objectLabel, id, title |
record_updated | A record was changed: a cell or field edit, a board drag, a relation, a task ticked, twenty_update | object, objectLabel, id, title, changed (field names sent) |
twenty_objects, twenty_fields, twenty_list, twenty_get, and, with the user's approval, twenty_create, twenty_update, twenty_delete. They need the extension to be connected; until then they return an error asking the user to paste an API key.
The assistant also gets every tool of Twenty's MCP server ({serverUrl}/mcp, same API key), prefixed twenty_. They're listed when a chat turn starts (cached for five minutes) and only while the extension is connected. Read-only tools run directly; anything else asks for approval (see "MCP servers" in EXTENSIONS.md). A server tool whose name matches one of the actions above (objects, fields, list, get, create, update, delete) is left out, since the action is tuned for this extension, and the chat shows a notice. If the server can't be reached or rejects the key, the chat shows that too and the actions above keep working.
No ratings yet.
To rate it, sign in to SpaceMIX ID on a server that has it installed.
Can send data to any host it asks for. Once it's installed on Studio Kaarna, it can send what it reads there. The requests it makes through SpaceMIX (host.net and git) are logged by host, and its network can be turned off, in Settings → Extensions → Data leaving.
Can ask to reach any host
It may connect to any address. The first time it reaches a new one, someone on this server is asked; once allowed, that address is allowed for everyone.
May use MCP servers on those hosts (any port)
MCP calls are made by the app directly, not through this server, so they are not in the network log.
Can load images, media and pages from any address
Its view may load pictures, audio, video and embedded pages from anywhere without a network permission, and could put data in those addresses. These aren't logged.
WebRTC isn't blocked
Browser peer-to-peer connections aren't covered by the frame's restrictions, so data could leave that way. These aren't logged.
Can open any web address in your browser
Every extension can open a link in a new browser tab, with data in the address, without asking for a permission. These aren't logged.
The big idea
A space you own, and a community building everything it can be.
That community is still to come. People will build things here that we can’t picture yet. One person’s need becomes everyone’s tool.
Then it starts again, with someone new.
Open source
SpaceMIX’s core is open source under the AGPL-3.0; extensions are licensed separately. Run it yourself, for free, and change what you need.
Credit
Every listing carries its maker’s name. Share what you made in the Marketplace, free, once it passes a review.
Made something people want? Soon you’ll be able to set a price and earn from it. Free is just as welcome. You’d be the seller, so tax and refunds would be yours.
Connections
Start with the one you need.
Picture someone
Picture it. These are scenes from a SpaceMIX that’s still growing. The people are made up. Some of what they use works today. Much of it is waiting for someone to build it, and we think someone will.
A builder
She did other people’s books for thirty-one years, and then she stopped, and then she got bored. Her allotment society kept its accounts in a shoebox. So she described what they needed, in the words she’d use with a junior: what comes in, what goes out, what the members need to see at the annual meeting. By the evening it worked. She fixed three things and shared it.
A bowling club found it. Then a choir. Someone she’s never met asked for a version for a small church. Her name is on it. Clubs that want it can pay a little, and some months that covers the coffee at her Thursday help session. Some months it doesn’t. That isn’t why she does it.
Run SpaceMIX, open the Studio and describe what you need. You’ll want a SpaceMIX ID when you share it in the Marketplace.