Give agents a local database for project work.
4
stars
96
commits
TypeScript
primary language
Sep 10, 2026
updated
Give agents a local database for project work.
Keep findings, plans, and progress available across agent sessions without adding working data to Git.
Agents write through Silo's CLI, which checks each write against the table's rules. They can query the data with SQL, so one agent can analyze or continue another agent's work.
You define what the tables hold. Agents decide how to use them; Silo does not assign or schedule their work.
Each Git repository selects a local SQLite database stored outside the repository. Git does not commit the database, and cloning a repository does not copy its data. Sharing between machines is optional and uses explicit push and pull commands.
pnpm add --global @silo-ai/silo
You need:
Run these commands from the repository you are migrating. This example uses one row per component, so an agent can see which components still need work.
Save this table definition as migration-table.json. It is an input file for the command below; you do not need to commit it.
{
"name": "migration",
"comment": "One component to migrate. Read before assigning work and update as work proceeds.",
"columns": [
{
"name": "component",
"type": "text",
"nullable": false,
"comment": "Unique component name."
},
{
"name": "state",
"type": "text/enum",
"type_options": {
"values": ["planned", "in_progress", "completed"]
},
"nullable": false,
"comment": "Current migration progress."
}
],
"primary_key": ["component"]
}
Create the table:
silo table create --file migration-table.json
The first table creation also creates the local database. The rules above require a unique component name and one of the three listed states.
printf '%s\n' '{"component":"settings","state":"planned"}' | silo row add migration
The command prints the saved row. It remains available after the agent session ends.
printf '%s\n' '{"state":"in_progress"}' | silo row update migration settings
The settings row now has the state in_progress. A value such as "started" would be rejected because it is not one of the allowed states.
silo sql "SELECT component, state FROM migration WHERE state <> 'completed' ORDER BY component"
The result includes settings with its updated state. A coordinating agent can read this table before deciding what to do next.
SQL is read-only. Use Silo's row commands to change data so writes are checked against the schema.
This small table records progress; it does not prevent two agents from choosing the same work. For concurrent updates, Silo supports a revision policy that rejects writes based on an outdated row. See Work with rows.
See Design a schema to add fields and rules for your workflow, or Getting started for a walkthrough that also tests a rejected write.
Silo includes guidance that agents can read from the CLI. Add this rule to your global AGENTS.md:
When told to “use Silo” or do something with Silo, run
silo skilland follow its instructions. Read any referenced task guide or JSON Schema withsilo skill <relative-path>.
The guidance covers table design, commands, and JSON inputs. Agents can read it from any directory:
silo skill
silo skill tasks/create-table.md
Use silo --help to explore commands. Each command also has its own help, such as silo row update --help.
If you need task tracking, you can import a bundled schema instead of designing one:
silo schema import tasks
This adds the template's tables, agent instructions, and default reports to the local database. It is separate from the migration example above.
The import copies the template. Later changes to the bundled template do not update your database. Imports must not conflict with existing table names or default report names.
Saved queries let you name a SQL query and run it as a command. Query parameters become command-line arguments with declared types, so callers can reuse the query without rewriting SQL.
See Run saved queries to define one.
Reports turn database results into Markdown you can open in your browser. For a migration, a report could show how many components are complete and which still need work.
Reports refresh when opened or when the page regains focus. If a refresh fails, the viewer keeps the last successful result visible.
Report scripts are trusted JavaScript with access to your machine through Node.js. Only run scripts you trust. The viewer runs locally; it does not provide remote hosting or scheduled refreshes.
See Publish a refreshable report to create and open one.
Local work needs no remote service. To share a database, you need:
Configure synchronization and publish your local changes. Replace the example bucket and path with your own:
silo sync init s3://my-bucket/silo/project
silo push
On another machine, run the same silo sync init command to restore the remote database. After setup:
silo pull before work to get shared changes.silo push when local changes are ready to share.Silo combines changes that do not conflict and stops when they do. It does not silently choose the last writer. Nothing pushes or pulls in the background.
See Synchronize a database for setup and recovery.
See How Silo works for the database, schema, and synchronization model, or browse the documentation.
76 commits
20 commits
TypeScript
97.5%
CSS
2.5%
Give agents a local database for project work.
4
stars
96
commits
TypeScript
primary language
Sep 10, 2026
updated
Give agents a local database for project work.
Keep findings, plans, and progress available across agent sessions without adding working data to Git.
Agents write through Silo's CLI, which checks each write against the table's rules. They can query the data with SQL, so one agent can analyze or continue another agent's work.
You define what the tables hold. Agents decide how to use them; Silo does not assign or schedule their work.
Each Git repository selects a local SQLite database stored outside the repository. Git does not commit the database, and cloning a repository does not copy its data. Sharing between machines is optional and uses explicit push and pull commands.
pnpm add --global @silo-ai/silo
You need:
Run these commands from the repository you are migrating. This example uses one row per component, so an agent can see which components still need work.
Save this table definition as migration-table.json. It is an input file for the command below; you do not need to commit it.
{
"name": "migration",
"comment": "One component to migrate. Read before assigning work and update as work proceeds.",
"columns": [
{
"name": "component",
"type": "text",
"nullable": false,
"comment": "Unique component name."
},
{
"name": "state",
"type": "text/enum",
"type_options": {
"values": ["planned", "in_progress", "completed"]
},
"nullable": false,
"comment": "Current migration progress."
}
],
"primary_key": ["component"]
}
Create the table:
silo table create --file migration-table.json
The first table creation also creates the local database. The rules above require a unique component name and one of the three listed states.
printf '%s\n' '{"component":"settings","state":"planned"}' | silo row add migration
The command prints the saved row. It remains available after the agent session ends.
printf '%s\n' '{"state":"in_progress"}' | silo row update migration settings
The settings row now has the state in_progress. A value such as "started" would be rejected because it is not one of the allowed states.
silo sql "SELECT component, state FROM migration WHERE state <> 'completed' ORDER BY component"
The result includes settings with its updated state. A coordinating agent can read this table before deciding what to do next.
SQL is read-only. Use Silo's row commands to change data so writes are checked against the schema.
This small table records progress; it does not prevent two agents from choosing the same work. For concurrent updates, Silo supports a revision policy that rejects writes based on an outdated row. See Work with rows.
See Design a schema to add fields and rules for your workflow, or Getting started for a walkthrough that also tests a rejected write.
Silo includes guidance that agents can read from the CLI. Add this rule to your global AGENTS.md:
When told to “use Silo” or do something with Silo, run
silo skilland follow its instructions. Read any referenced task guide or JSON Schema withsilo skill <relative-path>.
The guidance covers table design, commands, and JSON inputs. Agents can read it from any directory:
silo skill
silo skill tasks/create-table.md
Use silo --help to explore commands. Each command also has its own help, such as silo row update --help.
If you need task tracking, you can import a bundled schema instead of designing one:
silo schema import tasks
This adds the template's tables, agent instructions, and default reports to the local database. It is separate from the migration example above.
The import copies the template. Later changes to the bundled template do not update your database. Imports must not conflict with existing table names or default report names.
Saved queries let you name a SQL query and run it as a command. Query parameters become command-line arguments with declared types, so callers can reuse the query without rewriting SQL.
See Run saved queries to define one.
Reports turn database results into Markdown you can open in your browser. For a migration, a report could show how many components are complete and which still need work.
Reports refresh when opened or when the page regains focus. If a refresh fails, the viewer keeps the last successful result visible.
Report scripts are trusted JavaScript with access to your machine through Node.js. Only run scripts you trust. The viewer runs locally; it does not provide remote hosting or scheduled refreshes.
See Publish a refreshable report to create and open one.
Local work needs no remote service. To share a database, you need:
Configure synchronization and publish your local changes. Replace the example bucket and path with your own:
silo sync init s3://my-bucket/silo/project
silo push
On another machine, run the same silo sync init command to restore the remote database. After setup:
silo pull before work to get shared changes.silo push when local changes are ready to share.Silo combines changes that do not conflict and stops when they do. It does not silently choose the last writer. Nothing pushes or pulls in the background.
See Synchronize a database for setup and recovery.
See How Silo works for the database, schema, and synchronization model, or browse the documentation.
76 commits
20 commits
TypeScript
97.5%
CSS
2.5%