Update README to reflect current state of the app
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
25
README.md
25
README.md
@@ -6,11 +6,14 @@ Personal inventory for tasks, ideas, notes, and anything else. Entries are organ
|
|||||||
|
|
||||||
- **Configurable entry types** — default types are task, idea, note; create your own
|
- **Configurable entry types** — default types are task, idea, note; create your own
|
||||||
- **Hierarchical entries** — unlimited nesting, any type can be a child of any other
|
- **Hierarchical entries** — unlimited nesting, any type can be a child of any other
|
||||||
- **Tree view** (roots only, expandable — children always shown unfiltered) and **flat view**
|
- **Tree view** (root entries filtered; expanded children always shown) and **flat view**
|
||||||
- **Filters** by status, priority, and tag; free-text search across title and body; clickable tag chips
|
- **Filters** by status, priority, and tag; free-text search across title and body; filter state stored in URL query params (`?status=open&priority=high&search=foo`); status defaults to `open`
|
||||||
|
- **Clickable chips** — type, status, priority, and tag badges are all clickable to filter or navigate
|
||||||
|
- **CodeMirror 6 editor** — markdown syntax highlighting, multi-cursor, write/preview tabs
|
||||||
|
- **Keyboard shortcuts** — `Ctrl+E` edit, `Ctrl+S` save, `Ctrl+D` discard, `Ctrl+Alt+PgUp/Down` switch write/preview tab
|
||||||
- **Entry detail view** — full rendered markdown, metadata, children list; URL-addressable (`#4`)
|
- **Entry detail view** — full rendered markdown, metadata, children list; URL-addressable (`#4`)
|
||||||
- **URL routing** — `#all`, `#type/<id>`, `#<entry-id>`, `#manage-types`; back/forward works
|
- **URL routing** — `#` (all), `#type/<id>`, `#type/<id>/tag/<tag>`, `#tag/<tag>`, `#<entry-id>`, `#edit/<entry-id>`, `#manage-types`; back/forward works
|
||||||
- **Markdown rendering** via a local Gitea instance — edit/preview tabs in the editor
|
- **Markdown rendering** via a local Gitea instance
|
||||||
- **Sequential integer IDs** — global across all entry types
|
- **Sequential integer IDs** — global across all entry types
|
||||||
- **Flat NDJSON key-value store** — single file, no database required
|
- **Flat NDJSON key-value store** — single file, no database required
|
||||||
|
|
||||||
@@ -18,6 +21,7 @@ Personal inventory for tasks, ideas, notes, and anything else. Entries are organ
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install
|
npm install
|
||||||
|
make build # bundle CodeMirror vendor lib
|
||||||
cp config.yaml.example config.yaml
|
cp config.yaml.example config.yaml
|
||||||
# edit config.yaml — add your Gitea URL and token
|
# edit config.yaml — add your Gitea URL and token
|
||||||
node server.mjs
|
node server.mjs
|
||||||
@@ -35,7 +39,7 @@ gitea:
|
|||||||
token: your_token_here # needs read:misc scope minimum
|
token: your_token_here # needs read:misc scope minimum
|
||||||
```
|
```
|
||||||
|
|
||||||
If Gitea is not configured, titles and bodies are shown as plain text.
|
If Gitea is not configured, markdown is shown as plain text.
|
||||||
|
|
||||||
Environment overrides:
|
Environment overrides:
|
||||||
|
|
||||||
@@ -86,7 +90,7 @@ DELETE /api/entry-types/:id blocked if type still has entries
|
|||||||
GET /api/entries ?type=<id> to filter by type
|
GET /api/entries ?type=<id> to filter by type
|
||||||
POST /api/entries body: { type, title, body?, status?, priority?, tags?, parent_id? }
|
POST /api/entries body: { type, title, body?, status?, priority?, tags?, parent_id? }
|
||||||
GET /api/entries/:id
|
GET /api/entries/:id
|
||||||
PUT /api/entries/:id body: any subset of entry fields
|
PUT /api/entries/:id body: any subset of entry fields (including type)
|
||||||
DELETE /api/entries/:id blocked if entry has children
|
DELETE /api/entries/:id blocked if entry has children
|
||||||
|
|
||||||
POST /api/render-markdown body: { text, mode? } → { html }
|
POST /api/render-markdown body: { text, mode? } → { html }
|
||||||
@@ -102,14 +106,14 @@ sudo cp config.yaml.example /srv/task-inventory/config.yaml
|
|||||||
sudo chown task-inventory:task-inventory /srv/task-inventory/config.yaml
|
sudo chown task-inventory:task-inventory /srv/task-inventory/config.yaml
|
||||||
# edit /srv/task-inventory/config.yaml
|
# edit /srv/task-inventory/config.yaml
|
||||||
|
|
||||||
# Deploy (and on every update)
|
# Deploy (and on every update) — builds vendor bundle, rsyncs, runs npm ci
|
||||||
make deploy DEST=/srv/task-inventory
|
make deploy DEST=/srv/task-inventory
|
||||||
|
|
||||||
# Enable service (first time only)
|
# Enable service (first time only)
|
||||||
sudo systemctl enable --now "$(realpath deployment/task-inventory.service)"
|
sudo systemctl enable --now "$(realpath deployment/task-inventory.service)"
|
||||||
```
|
```
|
||||||
|
|
||||||
`make deploy` runs rsync (excluding `data/`, `config.yaml`, `node_modules/`), fixes ownership, and runs `npm ci` as the service user. `make sync` does the rsync+chown only, skipping `npm ci`.
|
`make deploy` builds the CodeMirror vendor bundle, rsyncs files (excluding `data/`, `config.yaml`, `node_modules/`), fixes ownership, and runs `npm ci` as the service user. `make sync` does the rsync+chown only, skipping build and `npm ci`.
|
||||||
|
|
||||||
To bind to all interfaces instead of localhost, uncomment `Environment=BIND_ADDRESS=0.0.0.0` in `deployment/task-inventory.service`.
|
To bind to all interfaces instead of localhost, uncomment `Environment=BIND_ADDRESS=0.0.0.0` in `deployment/task-inventory.service`.
|
||||||
|
|
||||||
@@ -117,7 +121,8 @@ To bind to all interfaces instead of localhost, uncomment `Environment=BIND_ADDR
|
|||||||
|
|
||||||
```
|
```
|
||||||
server.mjs Entry point — Express 5, all routes
|
server.mjs Entry point — Express 5, all routes
|
||||||
Makefile deploy / sync targets
|
Makefile build / deploy / sync targets
|
||||||
|
codemirror-entry.mjs ESM entry point for esbuild CodeMirror bundle
|
||||||
lib/
|
lib/
|
||||||
config.mjs Loads config.yaml (ENOENT-safe)
|
config.mjs Loads config.yaml (ENOENT-safe)
|
||||||
kv-store.mjs Flat NDJSON key-value store (auto-load, debounced flush)
|
kv-store.mjs Flat NDJSON key-value store (auto-load, debounced flush)
|
||||||
@@ -128,6 +133,8 @@ public/
|
|||||||
style.css All styles
|
style.css All styles
|
||||||
templates.html HTML templates (injected at init)
|
templates.html HTML templates (injected at init)
|
||||||
gitea-markup.css Vendored Gitea markup + chroma CSS for markdown rendering
|
gitea-markup.css Vendored Gitea markup + chroma CSS for markdown rendering
|
||||||
|
vendor/ Built by make build, not committed
|
||||||
|
codemirror-bundle.mjs Bundled CodeMirror 6 (ESM)
|
||||||
lib/
|
lib/
|
||||||
api.mjs fetch wrappers for all API endpoints
|
api.mjs fetch wrappers for all API endpoints
|
||||||
dom.mjs qs(), clone(), set_text(), show(), hide()
|
dom.mjs qs(), clone(), set_text(), show(), hide()
|
||||||
|
|||||||
Reference in New Issue
Block a user