Manages tasks and persistent storage for AI agents — assigns work, tracks completion, and provides a shared key-value store with full-text search across agent sessions
Zig
38
59 commits
updated Sep 29, 2026
Headless task tracker for autonomous AI agents.
nullTickets is a single Zig binary backed by SQLite. It exposes a REST API for
pipeline-driven task tracking and execution coordination: claim work by role, report progress, transition
stages, and attach artifacts.
nullTickets should be treated as the task tracker and source of truth for AI-agent execution.
nullTickets (this repository) is responsible for durable task state:
nullTickets is intentionally orchestration-light:
nullboiler is the orchestrator layer:
nullclaw is the agent runtime/executor layer:
Practical architecture:
nullTickets stores the work graph and execution history.nullboiler orchestrates who should do what and when.nullclaw agents do the actual work and publish evidence/results.You do not have to use all three components.
nullclaw + nullTickets is a valid setup for sequential execution.nullTickets can be used with other agent runtimes as long as they implement the tracker contract (claim -> events -> transition/fail).nullboiler is optional and is mainly needed for advanced multi-agent orchestration.nullclaw only for one-off tasks.nullTickets when you need a durable backlog (for example 100 tasks) and sequential execution with one agent loop.nullboiler when you need multi-agent scheduling, balancing, and policy automation.0.16.0zig build
zig build run -- --port 7700 --db tracker.db
Default values:
--port: 7700--db: nulltickets.dbConfig location:
~/.nulltickets/config.jsonNULLTICKETS_HOME=/path/to/dir--config /path/to/config.jsonWhen NULLTICKETS_HOME is set, nulltickets reads config.json from that directory and
resolves relative db paths relative to that config file.
zig build test
bash tests/test_e2e.sh
src/main.zig - process entrypoint, argument parsing, socket accept loopsrc/api.zig - HTTP routing, request validation, response serializationsrc/store.zig - SQLite queries, transactions, migrations, ownership/free helperssrc/domain.zig - pipeline FSM parsing and validationsrc/ids.zig - UUID/token/hash/time helperssrc/config.zig - config loading and resolutionsrc/export_manifest.zig - nullhub manifest exportsrc/from_json.zig - JSON config bootstrapsrc/migrations/001_init.sql - database schemasrc/migrations/003_store.sql - KV store tablesrc/migrations/004_store_fts.sql - FTS5 full-text search indextests/test_e2e.sh - end-to-end API flow| Method | Path | Description |
|---|---|---|
GET | /openapi.json | Full OpenAPI 3.1 schema for agent integration |
GET | /.well-known/openapi.json | Well-known OpenAPI discovery endpoint |
POST | /v1/traces | OTLP traces ingest (application/json or application/x-protobuf) |
POST | /otlp/v1/traces | OTLP collector-compatible traces ingest path |
GET | /health | Service and queue health |
POST | /pipelines | Create pipeline definition |
GET | /pipelines | List pipelines |
GET | /pipelines/{id} | Get pipeline by id |
POST | /tasks | Create task |
POST | /tasks/bulk | Bulk create tasks |
GET | /tasks?stage=&pipeline_id=&limit=&cursor= | List tasks (cursor paginated) |
GET | /tasks/{id} | Get task details |
POST | /tasks/{id}/dependencies | Add dependency |
GET | /tasks/{id}/dependencies | List dependencies |
POST | /tasks/{id}/assignments | Assign task to agent |
GET | /tasks/{id}/assignments | List assignments |
DELETE | /tasks/{id}/assignments/{agent_id} | Unassign task |
POST | /leases/claim | Claim next task by role |
POST | /leases/{id}/heartbeat | Extend lease |
GET | /tasks/{id}/run-state | Get task run_id |
POST | /runs/{id}/events | Append run event |
GET | /runs/{id}/events?limit=&cursor= | List run events (cursor paginated) |
POST | /runs/{id}/transition | Move task to next stage |
POST | /runs/{id}/fail | Mark run as failed |
POST | /artifacts | Attach artifact |
GET | /artifacts?task_id=&run_id=&limit=&cursor= | List artifacts (cursor paginated) |
GET | /ops/queue | Per-role queue stats for orchestrator |
PUT | /store/{namespace}/{key} | Put KV store entry |
GET | /store/{namespace}/{key} | Get KV store entry |
DELETE | /store/{namespace}/{key} | Delete KV store entry |
GET | /store/{namespace} | List entries in namespace |
DELETE | /store/{namespace} | Delete all entries in namespace |
GET | /store/search?q=&namespace=&limit=&filter_path=&filter_value= | Full-text search store |
namespace and key (for example spaces or /).search is reserved for GET /store/search and cannot be listed via GET /store/{namespace}.GET /store/search also supports exact JSON filtering with filter_path and filter_value in addition to FTS search.POST /leases/claim { agent_id, agent_role, lease_ttl_ms? }
-> 200 { task, run, lease_id, lease_token, expires_at_ms }
-> 204 (no work)
POST /runs/{run_id}/events (Bearer <lease_token>)
POST /runs/{run_id}/transition (Bearer <lease_token>)
POST /runs/{run_id}/fail (Bearer <lease_token>)
GET /tasks?limit=&cursor=
GET /runs/{run_id}/events?limit=&cursor=
GET /artifacts?limit=&cursor=
For practical nullclaw integration patterns (single-agent first, multi-agent optional), see nullclaw.md.
Agent bootstrap endpoint:
GET /openapi.jsonnullTickets accepts OTLP traces on:
POST /v1/tracesPOST /otlp/v1/tracesBehavior:
application/json: parses OTLP ExportTraceServiceRequest and stores normalized spans in otlp_spans.application/x-protobuf): stores raw payload in otlp_batches.payload_blob.To link telemetry to tracker entities, include span/resource attributes:
nulltickets.run_idnulltickets.task_id21 followers · starred Mar 2026
Zig
89.0%
Shell
10.1%
Manages tasks and persistent storage for AI agents — assigns work, tracks completion, and provides a shared key-value store with full-text search across agent sessions
Zig
38
59 commits
updated Sep 29, 2026
Headless task tracker for autonomous AI agents.
nullTickets is a single Zig binary backed by SQLite. It exposes a REST API for
pipeline-driven task tracking and execution coordination: claim work by role, report progress, transition
stages, and attach artifacts.
nullTickets should be treated as the task tracker and source of truth for AI-agent execution.
nullTickets (this repository) is responsible for durable task state:
nullTickets is intentionally orchestration-light:
nullboiler is the orchestrator layer:
nullclaw is the agent runtime/executor layer:
Practical architecture:
nullTickets stores the work graph and execution history.nullboiler orchestrates who should do what and when.nullclaw agents do the actual work and publish evidence/results.You do not have to use all three components.
nullclaw + nullTickets is a valid setup for sequential execution.nullTickets can be used with other agent runtimes as long as they implement the tracker contract (claim -> events -> transition/fail).nullboiler is optional and is mainly needed for advanced multi-agent orchestration.nullclaw only for one-off tasks.nullTickets when you need a durable backlog (for example 100 tasks) and sequential execution with one agent loop.nullboiler when you need multi-agent scheduling, balancing, and policy automation.0.16.0zig build
zig build run -- --port 7700 --db tracker.db
Default values:
--port: 7700--db: nulltickets.dbConfig location:
~/.nulltickets/config.jsonNULLTICKETS_HOME=/path/to/dir--config /path/to/config.jsonWhen NULLTICKETS_HOME is set, nulltickets reads config.json from that directory and
resolves relative db paths relative to that config file.
zig build test
bash tests/test_e2e.sh
src/main.zig - process entrypoint, argument parsing, socket accept loopsrc/api.zig - HTTP routing, request validation, response serializationsrc/store.zig - SQLite queries, transactions, migrations, ownership/free helperssrc/domain.zig - pipeline FSM parsing and validationsrc/ids.zig - UUID/token/hash/time helperssrc/config.zig - config loading and resolutionsrc/export_manifest.zig - nullhub manifest exportsrc/from_json.zig - JSON config bootstrapsrc/migrations/001_init.sql - database schemasrc/migrations/003_store.sql - KV store tablesrc/migrations/004_store_fts.sql - FTS5 full-text search indextests/test_e2e.sh - end-to-end API flow| Method | Path | Description |
|---|---|---|
GET | /openapi.json | Full OpenAPI 3.1 schema for agent integration |
GET | /.well-known/openapi.json | Well-known OpenAPI discovery endpoint |
POST | /v1/traces | OTLP traces ingest (application/json or application/x-protobuf) |
POST | /otlp/v1/traces | OTLP collector-compatible traces ingest path |
GET | /health | Service and queue health |
POST | /pipelines | Create pipeline definition |
GET | /pipelines | List pipelines |
GET | /pipelines/{id} | Get pipeline by id |
POST | /tasks | Create task |
POST | /tasks/bulk | Bulk create tasks |
GET | /tasks?stage=&pipeline_id=&limit=&cursor= | List tasks (cursor paginated) |
GET | /tasks/{id} | Get task details |
POST | /tasks/{id}/dependencies | Add dependency |
GET | /tasks/{id}/dependencies | List dependencies |
POST | /tasks/{id}/assignments | Assign task to agent |
GET | /tasks/{id}/assignments | List assignments |
DELETE | /tasks/{id}/assignments/{agent_id} | Unassign task |
POST | /leases/claim | Claim next task by role |
POST | /leases/{id}/heartbeat | Extend lease |
GET | /tasks/{id}/run-state | Get task run_id |
POST | /runs/{id}/events | Append run event |
GET | /runs/{id}/events?limit=&cursor= | List run events (cursor paginated) |
POST | /runs/{id}/transition | Move task to next stage |
POST | /runs/{id}/fail | Mark run as failed |
POST | /artifacts | Attach artifact |
GET | /artifacts?task_id=&run_id=&limit=&cursor= | List artifacts (cursor paginated) |
GET | /ops/queue | Per-role queue stats for orchestrator |
PUT | /store/{namespace}/{key} | Put KV store entry |
GET | /store/{namespace}/{key} | Get KV store entry |
DELETE | /store/{namespace}/{key} | Delete KV store entry |
GET | /store/{namespace} | List entries in namespace |
DELETE | /store/{namespace} | Delete all entries in namespace |
GET | /store/search?q=&namespace=&limit=&filter_path=&filter_value= | Full-text search store |
namespace and key (for example spaces or /).search is reserved for GET /store/search and cannot be listed via GET /store/{namespace}.GET /store/search also supports exact JSON filtering with filter_path and filter_value in addition to FTS search.POST /leases/claim { agent_id, agent_role, lease_ttl_ms? }
-> 200 { task, run, lease_id, lease_token, expires_at_ms }
-> 204 (no work)
POST /runs/{run_id}/events (Bearer <lease_token>)
POST /runs/{run_id}/transition (Bearer <lease_token>)
POST /runs/{run_id}/fail (Bearer <lease_token>)
GET /tasks?limit=&cursor=
GET /runs/{run_id}/events?limit=&cursor=
GET /artifacts?limit=&cursor=
For practical nullclaw integration patterns (single-agent first, multi-agent optional), see nullclaw.md.
Agent bootstrap endpoint:
GET /openapi.jsonnullTickets accepts OTLP traces on:
POST /v1/tracesPOST /otlp/v1/tracesBehavior:
application/json: parses OTLP ExportTraceServiceRequest and stores normalized spans in otlp_spans.application/x-protobuf): stores raw payload in otlp_batches.payload_blob.To link telemetry to tracker entities, include span/resource attributes:
nulltickets.run_idnulltickets.task_id21 followers · starred Mar 2026
Zig
89.0%
Shell
10.1%