AI News HubLIVE
In-site rewrite5 min read

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.

SourceHacker News AIAuthor: rasulkireev

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

  1. Clone the repository

git clone https://github.com/LVTD-LLC/rowset.git cd rowset

  1. 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.

  1. 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

  1. 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.

  1. 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.

  1. 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]