Show HN: Rowset – An open-source back end for AI agents
Rowset is a private MCP and REST backend for structured datasets that trusted AI agents can create, inspect, update, export, and share. It provides a stable programmatic interface for agents, avoiding browser automation.
Uh oh!
There was an error while loading. Please reload this page.
Notifications You must be signed in to change notification settings
Fork 0
Star 4
BranchesTags
Open more actions menu
Folders and files
NameName
Last commit message
Last commit date
Latest commit
History
644 Commits
644 Commits
.agents/skills
.agents/skills
.cursor/rules
.cursor/rules
.github
.github
.greptile
.greptile
.seo
.seo
apps
apps
cli
cli
deployment
deployment
docs
docs
evaluations
evaluations
frontend
frontend
rowset
rowset
scripts
scripts
.browserslistrc
.browserslistrc
.dockerignore
.dockerignore
.env.example
.env.example
.gitignore
.gitignore
.nvmrc
.nvmrc
.pre-commit-config.yaml
.pre-commit-config.yaml
.python-version
.python-version
.stylelintrc.json
.stylelintrc.json
AGENTS.md
AGENTS.md
ANALYTICS.md
ANALYTICS.md
CHANGELOG.md
CHANGELOG.md
CLAUDE.md
CLAUDE.md
DESIGN.md
DESIGN.md
Dockerfile-python
Dockerfile-python
GEMINI.md
GEMINI.md
Makefile
Makefile
PRODUCT.md
PRODUCT.md
README.md
README.md
SELF_HOSTING.md
SELF_HOSTING.md
STRUCTURE.md
STRUCTURE.md
TECH.md
TECH.md
VISION.md
VISION.md
conftest.py
conftest.py
djass-manifest.json
djass-manifest.json
docker-compose-local.yml
docker-compose-local.yml
docker-compose-prod.yml
docker-compose-prod.yml
docker-compose-test.yml
docker-compose-test.yml
eslint.config.js
eslint.config.js
manage.py
manage.py
package-lock.json
package-lock.json
package.json
package.json
postcss.config.js
postcss.config.js
project-metadata.json
project-metadata.json
pyproject.toml
pyproject.toml
pytest.ini
pytest.ini
render.yaml
render.yaml
tailwind.config.js
tailwind.config.js
uv.lock
uv.lock
Repository files navigation
Rowset is a private MCP and REST backend for structured datasets that trusted AI agents can create, inspect, update, export, and share. Users sign in, copy an agent setup prompt, authorize a scoped API key, and let the agent work with owned datasets through stable programmatic interfaces instead of browser automation.
Key Features
Hosted Streamable HTTP MCP server for AI-agent workflows.
Authenticated REST API for account checks, projects, datasets, rows, exports, relationships, image assets, and public preview settings.
Go rowset under cli/ for the same authenticated REST operations.
API-backed datasets with stable headers, semantic column metadata, persistent agent instructions, JSON metadata, and an explicit index column.
Row CRUD by internal Rowset row id or by dataset index value.
Projects and project sections for organizing related datasets without changing authentication boundaries.
Choice, reference, image, date, datetime, currency, number, boolean, email, URL, and text column metadata.
Read-only public previews with optional password protection for human review.
CSV, JSONL, XLSX, SQLite, and dashboard-oriented Parquet export paths.
Private image asset storage on local disk or S3-compatible storage such as Cloudflare R2.
Optional Qdrant-backed hybrid vector and lexical search for dataset rows.
Table of Contents
Tech Stack
Product Boundaries
Prerequisites
Getting Started
Agent Golden Path
REST API Quick Start
CLI Quick Start
Architecture
Data Model
Environment Variables
Available Commands
Testing
Deployment
Troubleshooting
Contributor Notes
Tech Stack
Area Technology
Language Python 3.14.2 (.python-version, pyproject.toml) and Go for cli/
Backend Django 6
REST API Django Ninja
MCP FastMCP mounted through Starlette in rowset/asgi.py
Auth Django allauth, session auth, API-key auth, hosted MCP bearer auth
Data stores PostgreSQL, Redis
Background jobs Django Q2 workers
Tabular work Python csv, json, sqlite3, zipfile, plus Polars
Frontend Django templates, HTMX, Alpine.js, Tailwind, PostCSS
Assets Custom Node 24 build script in scripts/build-assets.mjs
Local stack Docker Compose with Postgres, Redis, backend, workers, frontend, Mailhog, Stripe CLI, MJML, and MinIO
Observability Sentry and PostHog
Integrations Mailgun, Buttondown, Stripe, Chatwoot, S3-compatible storage, Qdrant/OpenRouter for optional vector search
Active deployment path Docker images plus CapRover GitHub Actions
Product Boundaries
Rowset is intentionally centered on agent-managed datasets.
In scope:
A signed-in user copies a Rowset setup prompt into a trusted agent.
The agent stores the API key privately and connects to Rowset MCP with Authorization: Bearer .
The agent creates or discovers datasets, inspects schema/context, mutates rows, manages projects, exports snapshots, or enables a public preview when asked.
The dashboard helps humans with setup, settings, recent dataset state, schema review, exports, public preview review, and account recovery.
Out of scope for the current product path:
Rowset-owned source connectors, sync, or write-back.
Public previews as authentication or as a substitute for REST/MCP access.
Browser automation as the preferred agent integration.
Broad BI, warehouse, or ETL orchestration promises.
Agents can still read local files, Google Sheets, databases, or other upstream sources with their own capabilities, then send structured rows into Rowset through MCP or REST.
Prerequisites
For the supported local workflow:
Docker Desktop or Docker Engine with Docker Compose.
Git.
A shell that can run make.
For host-side debugging outside Docker:
Python 3.14.2.
uv.
Node.js 24.11 or newer and npm 11 or newer.
Go 1.26 or newer when building the rowset CLI from source.
PostgreSQL and Redis reachable from your environment.
Most contributors should start with Docker Compose. The local Compose stack builds the Python image, installs Node dependencies in the frontend service, and runs Postgres and Redis for you.
Getting Started
- Clone the repository
git clone https://github.com/LVTD-LLC/rowset.git cd rowset
- Create local environment configuration
cp .env.example .env
The checked-in defaults are designed for the local Docker Compose stack:
Postgres host: db
Postgres database/user/password: rowset
Redis host: redis
Redis password: rowset
Site URL: http://localhost:8000
Environment: dev
Debug: on
Do not commit .env.
- Start the full local stack
make serve
This runs:
docker compose -f docker-compose-local.yml up -d --build
backend logs for the backend service
The local stack includes:
Service Purpose Local port
backend Django app and ASGI server 8000
workers Django Q worker process internal
frontend PostCSS/Tailwind/asset watcher internal
db PostgreSQL 5432
redis Redis 6379
mailhog Local email capture 1025, 8025
stripe Optional Stripe webhook forwarding internal
mjml MJML HTTP renderer 15500
minio Local S3-compatible storage 9000, 9001
Open the app at:
http://localhost:8000
Mailhog is available at:
http://localhost:8025
MinIO's console is available at:
http://localhost:9001
- Create an account
Use the local app UI to sign up. Email verification is non-blocking in the current app: local confirmation links are captured by Mailhog or printed through the configured email backend.
- Create an agent API key
In the app:
Go to Settings.
Create an agent API key.
Use the smallest permission level that fits the agent:
Read for inspection and exports.
Read + write for dataset, row, project, relationship, and public preview changes.
Admin only when automation must create more agent API keys.
The dashboard and settings pages generate a copyable agent setup prompt. The preview masks the key; the copy endpoint returns the full key and uses Cache-Control: no-store.
- Verify the golden path
For local development, the setup values are:
Rowset MCP URL: http://localhost:8000/mcp/ Rowset REST API base: http://localhost:8000/api/ Rowset setup skill: http://localhost:8000/skills/rowset-setup/SKILL.md Rowset skill: http://localhost:8000/SKILL.md
Store the copied API key in a private environment variable:
export ROWSET_API_KEY="replace-with-your-copied-key"
Verify REST authentication:
curl -H "Authorization: Bearer $ROWSET_API_KEY" \ http://localhost:8000/api/user
Agent Golden Path
Rowset's primary workflow is agent handoff, not manual row editing.
Recommended agent startup order:
Read the Rowset setup prompt.
Store the full API key privately as ROWSET_API_KEY.
Configure the remote MCP server with bearer-token auth.
For a new or failing connection, call get_user_info once to verify authentication, complete onboarding, and diagnose credential problems.
Start the user's task. Use live tool schemas for the operation at hand and call get_rowset_capabilities only for an unfamiliar feature or troubleshooting, requesting only the relevant topics.
If the user supplied a dataset key or URL, call get_dataset directly. If the relevant dataset is unknown, use search_datasets with a limit of 3, select a result, then call get_dataset before row operations.
Do not load capabilities or list datasets merely because a session started. Do not enumerate unrelated datasets or projects during discovery.
For Codex/OpenClaw-compatible clients:
codex mcp add rowset \ --url http://localhost:8000/mcp/ \ --bearer-token-env-var ROWSET_API_KEY
For production, replace the URL with:
https://rowset.lvtd.dev/mcp/
Do not put the raw API key in the MCP server config. Store the key in the agent's private runtime environment or secret store and configure the client to send:
Authorization: Bearer
MCP tool groups
The live MCP server is the exact source for tool schemas. The current workflow groups are:
Workflow Representative MCP tools
Account and setup get_user_info, get_rowset_capabilities
API keys create_agent_api_key
Dataset discovery get_all_datasets, get_archived_datasets, search_datasets, get_dataset
Dataset creation/context create_dataset, update_dataset_metadata, update_dataset_column_types
Projects get_all_projects, search_projects, create_project, get_project, get_project_sections, create_project_section, update_project, update_project_metadata, update_project_section, archive_project_section, archive_project, update_dataset_project
Rows list_dataset_rows, search_dataset_rows, get_dataset_row, get_dataset_row_by_index, create_dataset_row, update_dataset_row, update_dataset_row_by_index, delete_dataset_row
Schema changes add_column, rename_column, drop_column, reorder_columns
Relationships list_dataset_relationships, create_dataset_relationship, resolve_dataset_relationship, delete_dataset_relationship
Image assets attach_image_to_dataset_row, get_dataset_image_asset
Public previews update_dataset_public_preview
Archive/restore archive_dataset, restore_dataset
Agents should ask before destructive actions such as row deletion, dataset archive, project archive, or clearing a public preview password unless the user explicitly requested that action.
Canonical task-board example
A useful Rowset dogfood pattern is a task board indexed by task_id:
{ "name": "Agent Task Board", "description": "Durable task board for one agent workflow", "instructions": "Keep task_id stable. Move status to done only after definition_of_done is satisfied.", "metadata": { "status_order": ["todo", "doing", "blocked", "review", "done"], "priority_meaning": { "P0": "Highest leverage or blocking", "P1": "Important current-cycle work" } }, "headers": [ "task_id", "status", "priority", "task", "definition_of_done", "owner", "updated_on", "notes" ], "index_column": "task_id", "column_types": { "task_id": "text", "status": { "type": "choice", "choices": ["todo", "doing", "blocked", "review", "done"] }, "priority": { "type": "choice", "choices": ["P0", "P1", "P2
[truncated for AI cost control]