Poppy-Local is a local-first relationship manager. It stores contacts, interactions, and reminders in SQLite, serves a small Express API, and renders a no-build vanilla JS frontend from public/index.html.
- Node.js
- Express
- better-sqlite3
- SQLite with WAL mode
- Vanilla HTML/CSS/JS frontend
- Node built-in test runner for integration and smoke tests
src/server.js: Express app, API routes, assistant brief logic, import/export, startup flowsrc/db.js: SQLite connection, data directory resolution, schema bootstrappublic/index.html: Entire frontend UI, styles, client-side state, modal flowspublic/manifest.json: PWA manifestpublic/sw.js: Basic service worker for app-shell cachingpublic/favicon.svg: Brand favicon and manifest icon sourcetests/api.test.js: API integration coveragetests/e2e.test.js: end-to-end smoke test that boots the server processtests/helpers/server-test-utils.js: shared test server startup and HTTP helpers
npm install
npm startThe app is available at http://localhost:3456 by default.
PORT: HTTP port for the Express serverNODE_ENV: runtime mode, typicallydevelopment,test, orproductionPOPPY_DB_PATH: full path to the SQLite database file
If POPPY_DB_PATH is unset, the app stores data under ~/.poppy-local/poppy.db.
npm run devnpm run dev uses Node's watch mode and restarts the server on backend changes. The frontend is static, so reloading the browser is enough after editing files in public/.
Recommended flow:
- Run
npm run dev - Make changes
- Run
npm test - Commit with a conventional commit message
npm testThe tests start isolated server processes with temporary SQLite databases so they do not touch your real local data.
Use Conventional Commits:
feat: add dark mode togglefix: handle missing reminder contactdocs: document import workflowtest: add health smoke test
Preferred format:
type(scope optional): short imperative summary
- Keep API responses stable unless a change is intentional and coordinated with the frontend.
- The frontend is intentionally build-free; prefer small, direct edits over introducing tooling.
public/index.htmlcontains both UI and client logic, so verify modal flows and dashboard refreshes after changes.- Import/export is treated as a portability contract; avoid breaking snapshot structure.