A team directory, running on a spreadsheet
This table's database is a public Google Sheet. Your browser reads it directly with the gsab JS client — no auth, no API key — and polls for changes, so edits made by anyone (including directly in the sheet) show up here within a few seconds. Writes go through this site's server using the same library in Node. It's a shared toy: capped at 30 rows, rate-limited, and reset periodically.
Reading the sheet…
What this page actually runs
// in your browser — no auth, it's a public sheet
import { connect } from "gsab-js";
import { useSheet } from "gsab-js/react";
const db = connect("<sheet url or id>").sheet();
const { rows, loading, error } = useSheet(db, { key: "id" });
// on the server — writes need a Google sign-in
import { refreshTokenAuth } from "gsab-js/node";
const db = connect({ spreadsheetId, auth: refreshTokenAuth() }).sheet(schema);
await db.insert({ id: 5, name: "You", email: "you@example.com" });# the same sheet, from Python — pip install gsab · gsab auth login
import asyncio
from gsab import SheetConnection, SheetManager, Schema, Field, FieldType
schema = Schema("team", [
Field("id", FieldType.INTEGER, required=True, unique=True),
Field("name", FieldType.STRING, required=True),
Field("email", FieldType.STRING, required=True),
])
async def main():
db = SheetManager(SheetConnection(), schema)
await db.insert({"id": 5, "name": "You", "email": "you@example.com"})
print(await db.read({"status": "active"}))
asyncio.run(main())Try it yourself: npm install gsab-js — npm · GitHub. Early (0.2.x) and moving fast. The Python library it mirrors is on PyPI.