Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c810d63bee | |||
| fd20b67b22 | |||
| 7031e36670 |
@@ -4,7 +4,7 @@ A self-hosted second brain and project management application with integrated LL
|
|||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
Notes and tasks with a Markdown editor, sub-tasks, milestones, and kanban project workspaces. AI chat with streaming responses, RAG over your notes, and tool use (web search, calendar, weather). A daily briefing that digests your tasks, RSS feeds, and weather on a schedule. Knowledge graph, per-user/group sharing, PWA with push notifications, an MCP server for external AI clients, and an Android companion app.
|
Notes and tasks with a Markdown editor, sub-tasks, milestones, and kanban project workspaces. AI chat with streaming responses, RAG over your notes, and tool use (web search, calendar, weather). A daily briefing that digests your tasks, RSS feeds, and weather on a schedule. Knowledge graph, per-user/group sharing, PWA with push notifications, and an MCP server for external AI clients.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
@@ -36,7 +36,6 @@ Open `http://localhost:5000`. The first user to register becomes admin. Go to **
|
|||||||
| [API Keys & MCP](docs/api-keys-and-mcp.md) | API key management and Fable MCP install guide |
|
| [API Keys & MCP](docs/api-keys-and-mcp.md) | API key management and Fable MCP install guide |
|
||||||
| [SSO / OAuth](docs/sso-oauth.md) | OIDC setup for Authentik, Keycloak, and other providers |
|
| [SSO / OAuth](docs/sso-oauth.md) | OIDC setup for Authentik, Keycloak, and other providers |
|
||||||
| [API Reference](docs/api-reference.md) | All REST API endpoints |
|
| [API Reference](docs/api-reference.md) | All REST API endpoints |
|
||||||
| [Android App](docs/android-app.md) | Flutter companion app architecture and feature status |
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -1,73 +0,0 @@
|
|||||||
# Android Companion App
|
|
||||||
|
|
||||||
The Android companion app lives in a separate repository at `/home/bvandeusen/Nextcloud/Projects/fabled_app`.
|
|
||||||
|
|
||||||
## Stack
|
|
||||||
|
|
||||||
- Flutter + Dart
|
|
||||||
- Riverpod (state management)
|
|
||||||
- GoRouter (navigation)
|
|
||||||
- Dio (HTTP client)
|
|
||||||
- PersistCookieJar (session persistence)
|
|
||||||
- SSE streaming via `fetch` + `ReadableStream` bridge
|
|
||||||
|
|
||||||
## Architecture
|
|
||||||
|
|
||||||
```
|
|
||||||
lib/
|
|
||||||
app.dart # GoRouter + _Shell + _QuickCaptureBar
|
|
||||||
core/constants.dart # Routes.*
|
|
||||||
data/
|
|
||||||
models/ # note.dart, task.dart, project.dart
|
|
||||||
api/ # notes_api.dart, tasks_api.dart, projects_api.dart
|
|
||||||
repositories/ # notes, tasks, projects repositories
|
|
||||||
providers/
|
|
||||||
api_client_provider.dart # all API + repository providers
|
|
||||||
notes_provider.dart # NotesNotifier
|
|
||||||
tasks_provider.dart # TasksNotifier
|
|
||||||
projects_provider.dart # ProjectsNotifier
|
|
||||||
screens/
|
|
||||||
notes/note_edit_screen.dart # chip tag input + ProjectSelector
|
|
||||||
tasks/task_edit_screen.dart # ProjectSelector
|
|
||||||
projects/project_list_screen.dart
|
|
||||||
widgets/
|
|
||||||
project_selector.dart # reusable DropdownButtonFormField
|
|
||||||
```
|
|
||||||
|
|
||||||
## Navigation
|
|
||||||
|
|
||||||
4-tab shell (Notes · Tasks · Projects · Chat):
|
|
||||||
- Phone: bottom `NavigationBar`
|
|
||||||
- Tablet/landscape: `NavigationRail`
|
|
||||||
|
|
||||||
Quick Capture bar persists across all tabs. Settings accessible from top-right icon.
|
|
||||||
|
|
||||||
## Feature Status
|
|
||||||
|
|
||||||
| Feature | Status | Notes |
|
|
||||||
|---------|--------|-------|
|
|
||||||
| Notes CRUD | ✅ | Tags chip input; project selector in editor |
|
|
||||||
| Tasks CRUD | ✅ | Project selector in editor |
|
|
||||||
| Projects list | ✅ | Active/archived sections; long-press status change; create dialog |
|
|
||||||
| Chat + SSE | ✅ | Full streaming |
|
|
||||||
| Quick Capture | ✅ | Offline queue with retry |
|
|
||||||
| Tags | ✅ | Chip input in NoteEditScreen; typed as `List<String>` |
|
|
||||||
| Project assignment | ✅ | `ProjectSelector` dropdown in Note + Task editors |
|
|
||||||
| Milestones | ❌ deferred | Too granular for mobile; web UI handles it |
|
|
||||||
| Push notifications | ❌ incompatible | Backend uses browser VAPID; Flutter needs FCM/APNs — separate implementation required |
|
|
||||||
| CalDAV settings | ❌ intentional | Server-side config only; not exposed in mobile app |
|
|
||||||
|
|
||||||
## API Compatibility Notes
|
|
||||||
|
|
||||||
- `GET /api/projects/:id` returns a flat JSON object (not `{project: ...}` wrapper); includes `summary` field.
|
|
||||||
- `POST /api/projects` returns the project dict directly (201).
|
|
||||||
- `PATCH /api/projects/:id` returns the updated project dict.
|
|
||||||
- Task body field is `body` (not `description`) — the app maps `description` → `body` on serialize.
|
|
||||||
|
|
||||||
## Self-Update
|
|
||||||
|
|
||||||
The app supports self-update via the Forgejo release API (`update_provider.dart`). It checks the latest release tag and prompts the user to download and install a new APK when one is available.
|
|
||||||
|
|
||||||
## CI
|
|
||||||
|
|
||||||
Builds are triggered from the Forgejo Actions pipeline in the `fabled_app` repository. The APK is attached to the release as a downloadable artifact.
|
|
||||||
@@ -568,17 +568,6 @@ Items deliberately not addressed in this round; revisit when a real need surface
|
|||||||
- Standalone voice/tone audit across every UI string — opportunistic-only; full sweep deferred unless drift becomes visible.
|
- Standalone voice/tone audit across every UI string — opportunistic-only; full sweep deferred unless drift becomes visible.
|
||||||
- A handful of editor utility buttons (`.btn-suggest-tags`, `.btn-link-all`, AI assist generate/proofread/accept/reject set, etc.) — currently ghost-styled and visually compliant; revisited only if they read off in practice.
|
- A handful of editor utility buttons (`.btn-suggest-tags`, `.btn-link-all`, AI assist generate/proofread/accept/reject set, etc.) — currently ghost-styled and visually compliant; revisited only if they read off in practice.
|
||||||
|
|
||||||
### Flutter app port — shipped 2026-04-28
|
|
||||||
|
|
||||||
The companion mobile app (`fabled_app` / FabledApp repo) tracks the same design system. Two commits:
|
|
||||||
|
|
||||||
- **Foundation port** — `0f05f47`. `lib/core/theme.dart` rewritten with the Obsidian/Iron/Pewter dark palette, warm parchment light palette, dusty violet `#5B4A8A` primary. Inter loaded for body, JetBrains Mono available at call sites, Fraunces for headlines ≥18px. New `ActionColors` ThemeExtension exposes Moss/Bronze/Oxblood/Pewter outside the `ColorScheme` (Material's primary/secondary/tertiary slots all carry brand accent, so action tokens need their own home). `GradientButton` recolored to dusty-violet gradient.
|
|
||||||
- **Surface phase** — `b9e68e3`. `lucide_icons ^0.257.0` installed; 107 `Icons.*` references across 21 files swapped to `LucideIcons.*`. Input border radius 24 → 8 in both themes. ChatMessageBubble Illuminated Transcript fixes — neutral border on user bubbles, `surface`/Iron bg on assistant bubbles, asymmetric corner restoration (only bottom-left clipped, not both left corners), accent-tinted glow shadow added. 5 destructive confirm buttons across notes / tasks / chat / calendar wired to `ActionColors.destructive`. Calendar event Save wired to `ActionColors.primary` as the reference Moss site. 4 hardcoded indigo Color literals → dusty-violet equivalents.
|
|
||||||
|
|
||||||
The Flutter port doesn't decompose into 7 PRs the way web did because Flutter's centralized `theme.dart` means most palette/font work happens in one file. Per-screen Save / Cancel reclassification beyond the calendar event Save is opportunistic — the wiring pattern (`Theme.of(context).extension<ActionColors>()!.primary`) is established and applied incrementally as files are touched.
|
|
||||||
|
|
||||||
Pattern reference for downstream screens: see `lib/screens/calendar/event_form_sheet.dart` for `ActionColors.primary` usage on Save buttons; see the dialog spots in `note_edit_screen.dart` / `task_edit_screen.dart` / `note_detail_screen.dart` / `conversations_tab_screen.dart` for `ActionColors.destructive` on confirm-Delete buttons.
|
|
||||||
|
|
||||||
### Open threads
|
### Open threads
|
||||||
|
|
||||||
*New threads will accumulate here as gaps surface in real use.*
|
*New threads will accumulate here as gaps surface in real use.*
|
||||||
|
|||||||
@@ -132,8 +132,6 @@ Settings are tabbed:
|
|||||||
|
|
||||||
- Email integration (read/send via IMAP/SMTP tools in chat)
|
- Email integration (read/send via IMAP/SMTP tools in chat)
|
||||||
- Session invalidation on user deletion
|
- Session invalidation on user deletion
|
||||||
- Flutter push notifications (requires FCM/APNs — separate from web VAPID)
|
|
||||||
- Flutter milestone support in project view
|
|
||||||
|
|
||||||
## Keyboard Shortcuts
|
## Keyboard Shortcuts
|
||||||
|
|
||||||
|
|||||||
@@ -48,11 +48,15 @@ rules via create_rule when you notice a pattern worth codifying — coordinate
|
|||||||
with the operator on whether it belongs in an existing rulebook+topic or a
|
with the operator on whether it belongs in an existing rulebook+topic or a
|
||||||
new one.
|
new one.
|
||||||
|
|
||||||
Plans are tasks with kind=plan. Begin a plan with start_planning(project_id,
|
Plans are tasks with kind=plan, and Scribe is the canonical home for them.
|
||||||
title) — that seeds a plan template and returns the project's applicable_rules.
|
When you begin non-trivial work, call start_planning(project_id, title) FIRST —
|
||||||
Maintain the plan with the normal task tools (update_task for the body,
|
before any brainstorming, design, or plan-writing skill runs. start_planning
|
||||||
add_task_log for progress); its work-logs are the build record. Build plans in
|
seeds the plan body, returns the project's applicable_rules, and gives you the
|
||||||
Scribe via start_planning, not in local .md files.
|
task id you'll write into. If a skill or habit tells you to save a plan or spec
|
||||||
|
to `docs/superpowers/plans/*.md` or `docs/superpowers/specs/*.md`, that path is
|
||||||
|
superseded here: put the spec/plan content in the kind=plan task's body via
|
||||||
|
update_task, and record progress with add_task_log. Local .md files are not
|
||||||
|
the record — the task is.
|
||||||
|
|
||||||
Deletes are recoverable: every delete_* tool moves the entity (and its
|
Deletes are recoverable: every delete_* tool moves the entity (and its
|
||||||
descendants) to the trash and returns a deleted_batch_id. Use list_trash() to
|
descendants) to the trash and returns a deleted_batch_id. Use list_trash() to
|
||||||
|
|||||||
Reference in New Issue
Block a user