- internal/services/mail_service.go: SMTP/TLS sender (implicit TLS on 465), html/template rendering, branded base layout + content templates, silent no-op when SMTP_* unset. - internal/services/reminder_service.go: hourly scanner for Fristen that are overdue / due tomorrow / due within the week (Monday digest). Dedup via paliad.reminder_log (24h window). - internal/services/invite_service.go: POST /api/invite flow with domain whitelist, in-memory 10/day/user rate limit, audit row in paliad.invitations. - internal/handlers/invite.go: POST + GET /api/invite handlers. - Sidebar "Kolleg:in einladen" button + modal on every page. - migration 016: paliad.reminder_log, paliad.invitations, users.lang column. - docker-compose: SMTP_* + PALIAD_BASE_URL env vars. - docs/feature-roadmap.md: documented Supabase auth-SMTP routing as open question; current pilot keeps identity mails on Supabase default sender. Rationale: get Paliad off Supabase's best-effort outbound for the inbox-facing stuff (reminders, invitations) and move deadline nudges from passive dashboard to active email. Custom Supabase auth SMTP is blocked on the shared ydb.youpc.org instance — deferred until Paliad has its own project or GoTrue webhook relay.
19 KiB
Paliad Feature Roadmap
Author: cronus (inventor) | Original date: 2026-04-14 | Rewritten: 2026-04-17 (Phase J, after KanzlAI integration) Task: t-paliad-013 (rewrite); originally t-patholo-011
Strategic Position
Paliad is the all-in-one platform for HLC patent practice: knowledge tools plus Aktenverwaltung, behind one sidebar, one URL, one login.
It grew out of a pure knowledge platform (patholo.de, Q1 2026) and absorbed the KanzlAI case-management prototype on 2026-04-16 after the HL → HLC merger. The goal stays the same: every new associate's first bookmark, every partner's quick-reference, every PA's template source — and now also the place where a lawyer checks their next Frist before looking up the relevant UPC fee.
Audience
- Patent lawyers and PAs across 7 offices (Munich, Düsseldorf, Hamburg, Amsterdam, London, Paris, Milan)
- Mix of German and English speakers — DE/EN toggle on every page
- Range from senior partners to new associates
- Daily work: drafting submissions, calculating costs, tracking deadlines, managing matters, researching case law
What We Have (shipped — April 2026)
| Feature | Phase | Status |
|---|---|---|
| Supabase auth (@hoganlovells.com gate) | v1 | Live |
| Prozesskostenrechner (DE / UPC / EPA) | v1 | Live |
| Fristenrechner (deadlines with holiday adjustment) | v1 | Live |
| Lime-green branding + DE/EN i18n + sidebar | v1 | Live |
| File proxy + Downloads page (HL Patents Style.dotm) | 1.2 | Live |
| Link Hub with curated categories + youpc.org case-law link | 1.1 / 2.3 | Live |
| Gebührentabellen (GKG / RVG / UPC / EPA / PatKostG) | 1.3 | Live |
| Patentglossar (DE/EN, searchable) | 1.4 | Live |
| Kostenrechner enhancements (PDF export, URL sharing, scenario comparison) | 1.5 | Live (partial — Prozesskostensicherheit pending) |
| Gerichtsverzeichnis (court directory) | 2.2 | Live |
| Checklisten (interactive filing checklists) | 2.4 | Live |
| Akten (matter management, office-scoped visibility, collaborators) | 0.1 (A–D) | Live |
| Fristen (persistent deadline management, traffic-light cards, calendar) | 0.2 (E) | Live |
| Termine (appointments, calendar view) + CalDAV sync (AES-GCM at rest) | 0.3 (F) | Live |
| Dashboard (logged-in landing, server-rendered) | 0.4 (G) | Live |
Design Principles
- Knowledge and practice live together — tools and content bring people in; Aktenverwaltung keeps them there daily.
- Office-scoped by default — an Akte belongs to one office; cross-office access is explicit via collaborator lists or a partner-toggled firm-wide flag. No "everyone sees everything" and no multi-tenancy machinery. See
docs/design-kanzlai-integration.md§2. - Self-serve over manual curation — prefer structured data + search over hand-maintained pages.
- Ship incrementally — each feature is independently useful.
- German content quality matters — proper Umlaute, legal precision, no machine-translation feel.
- HTML-first, JS-enhanced — server-rendered TSX with per-page client TS bundles. No react-query, no heavy client frameworks.
Phase 0: Aktenverwaltung Foundation (shipped April 2026)
Ported and rebuilt from the retired KanzlAI prototype. Detailed phase breakdown and acceptance criteria live in docs/design-kanzlai-integration.md §8 (Phases A–J); this roadmap is the user-facing summary.
0.1 Akten (Matter Management) — office-scoped ✅ Done (2026-04-16, Phases A–D)
Persistent Akten (previously "cases" / "Mandate") with Parteien, audit trail (Verlauf), and per-Akte visibility. Every Akte has an owning_office, an explicit collaborators list, and a partner-togglable firm_wide_visible flag. Visibility is enforced both in Supabase RLS (paliad.can_see_akte(akte_id)) and at the application layer for defense in depth.
Shipped in Phases A (schema + RLS), B (services + sqlx pool), C (Fristenrechner → DB), D (Akten CRUD + onboarding + collaborator picker).
0.2 Fristen (Persistent Deadline Management) ✅ Done (2026-04-16, Phase E)
Persistent Frist list with traffic-light cards (rot / amber / grün / grau), detail page, month calendar, bulk-import from Fristenrechner ("Als Frist(en) speichern"). Visibility inherits from the parent Akte. Every mutation appends an akten_events row.
0.3 Termine + CalDAV Sync ✅ Done (2026-04-17, Phase F)
Termine CRUD (dual-mode: Akte-attached or personal), list/detail/calendar views, per-user CalDAV configuration. Bidirectional sync with a per-user goroutine on a 60s tick. Credentials encrypted at rest with AES-GCM keyed off CALDAV_ENCRYPTION_KEY (KanzlAI audit §1.3 fix). Passwords never returned in API responses.
0.4 Dashboard (Logged-in Landing) ✅ Done (2026-04-16, Phase G)
Server-rendered /dashboard for authenticated users: Frist summary (traffic lights), Akten summary, upcoming Fristen and Termine (7d), recent Verlauf. Zero client-side waterfall (audit §2.3 fix).
0.5 AI-assisted Frist-Extraktion — Deferred (Phase H)
Anthropic-based extraction of Fristen from uploaded court documents. Not in current scope — decision by m on 2026-04-16: "We don't want Anthropic API. We put this off for a while." The Dokumente tab on Akten detail stays as a "Kommt bald" placeholder. No ANTHROPIC_API_KEY needed on Dokploy today.
Open when revisiting: document upload + Supabase Storage alone (without AI) may still be worth shipping as a standalone Dokumente feature.
0.6 Notizen (polymorphic) — Pending (Phase I)
Schema exists (migration 005: paliad.notizen with polymorphic FK + CHECK constraint, RLS inherits from parent). Service, handlers, and UI component not yet shipped. Sized at ~4h in the integration design; pick up when cross-cutting notes become the next friction point.
Phase 1: Foundation (Low effort, High impact)
Feature specs from the original roadmap. Items marked ✅ Done were shipped in the pre-Aktenverwaltung April 2026 content push.
1.1 Link Hub ("Nützliche Links") ✅ Done (2026-04-14)
Curated, categorized page of external links relevant to daily patent practice. Categories cover Gerichte & Ämter, Recherche, UPC, Gesetze, and HL Intern. Lives at /links. Includes the youpc.org case-law entry that replaces the dropped §2.3 item. Users can suggest new links via an inline form.
1.2 More Downloads ✅ Done (page shipped — content pending)
Dedicated /downloads page with card-grid layout shipped (2026-04-14, fd25998). Current registry still holds only HL Patents Style.dotm — adding BuildingBlocks, legal writing templates, and the original Patentprozesskostenrechner.xlsm is a one-line registry edit per file, pending content selection from mWorkRepo.
1.3 Gebührentabellen (Fee Schedule Reference) ✅ Done (2026-04-14)
Interactive, tabbed fee schedule reference at /tools/gebuehrentabellen: GKG / RVG / UPC / EPA / PatKostG, with Streitwert quick-lookup and sortable tables per schedule version.
1.4 Patentglossar (DE/EN) ✅ Done (2026-04-14)
Searchable bilingual glossary at /glossar with client-side filter, category tags (prosecution / litigation / UPC / EPA), and a "Begriff vorschlagen" feedback form. Loaded from static JSON at server startup.
1.5 Kostenrechner Enhancements ✅ Partial (2026-04-14)
- PDF Export — shipped (print CSS).
- Scenario Comparison — shipped (side-by-side diff).
- URL Sharing — shipped (query-param state).
- Prozesskostensicherheit — pending. Calculation logic not yet implemented; only the glossary term exists. Kühnen 16th ed. Rn. E.47 ff. formula is still the target reference.
Phase 2: Content Hub (Medium effort, High impact)
2.1 Verfahrensleitfäden (Procedure Guides) — Pending
Step-by-step visual guides for UPC Infringement, UPC Revocation, UPC Provisional Measures, German Infringement, German Nullity, EPA Opposition, EPA Appeal. Timeline + step descriptions + cross-links to Fristenrechner pre-filled for the proceeding type. Content exists in mWorkRepo (UPC Know-How, UPC Training); needs structuring.
Effort: ~8h code + ~6h content per guide | Impact: Very High
2.2 Gerichtsverzeichnis (Court Directory) ✅ Done (2026-04-16)
Reference page at /gerichte with entries for every relevant UPC division, German court (LG / OLG / BGH / BPatG), DPMA, EPA, and national courts in NL / UK / FR / IT. Searchable + filterable by type and country.
2.3 UPC Rechtsprechungsübersicht — Dropped
Explicitly removed 2026-04-16. Rationale: youpc.org already maintains a curated UPC case-law database with 1,600+ decisions. Replaced with a prominent youpc.org entry in the Link Hub under "Recherche" (commit 4526942). Re-add only if youpc.org shuts down or if HLC needs firm-specific takeaways attached to decisions.
2.4 Checklisten (Interactive Checklists) ✅ Done (2026-04-16)
Interactive checklists at /checklisten for UPC Statement of Claim, Statement of Defence, Confidentiality Application, Representative Registration, BPatG nullity, EPA Opposition, nUPCMS filing. Checkbox state persisted in localStorage per user; print-friendly layout; feedback form per list.
Phase 3: Platform Features (Higher effort, Transformative)
3.1 Suchfunktion (Global Search) — Pending
Search across all Paliad content — glossary, Gerichte, Leitfäden, Checklisten, links, and eventually Akten (scoped by visibility). Build the index at startup from JSON sources + DB. Expose GET /api/search?q=....
Effort: ~6h | Impact: High
3.2 Vorlagenbibliothek (Template Library) — Pending
Evolve /downloads from a flat card grid into a proper template library with preview, category filters (Schriftsätze, Vorlagen, Tabellen, Blöcke), and metadata. Distribution channel for the HL Model Documents project and BuildingBlocks.
Effort: ~8h | Impact: High
3.3 Schulungsbereich (Training Hub) — Pending
Self-serve onboarding and continuing education at /schulung. New-associate guide, UPC training material, video guide links, HL Patents Style tutorial, nUPCMS filing guide, FAQ.
Effort: ~6h code + ~10h content | Impact: Medium-High
3.4 Benachrichtigungen (What's New) — Pending
Changelog + "neu seit letztem Besuch" badge in the sidebar. JSON-backed changelog, localStorage last-seen timestamp, optional browser push.
Effort: ~3h | Impact: Medium (retention)
Phase 4: Advanced (High effort, Long-term)
4.1 KI-Recherche (AI-Powered Research) — Pending (AI features deferred alongside Phase H)
Claude-powered chat grounded in Paliad content (glossary, guides, case law, fee tables, and — with visibility enforcement — a user's own Akten/Fristen). Every answer cites sources. Requires guardrails; requires a solid content foundation (Phases 1–3). Currently blocked by the same "no Anthropic API" decision as Phase H; revisit when that decision flips.
4.2 Fristenkalender ✅ Done (Phase F)
Originally "export deadlines as .ics / CalDAV sync". Subsumed by Phase 0.3 Termine + CalDAV Sync — bidirectional sync with encrypted credentials at rest. The Fristenrechner's "Als Frist(en) speichern" button is the entry point from quick-calc into persistent Fristen; Fristen themselves appear in the user's CalDAV calendar via Termine linkage.
4.3 Collaborative Annotations — Pending (partial via 0.6 Notizen)
The polymorphic paliad.notizen table already covers per-Akte / per-Frist / per-Termin / per-AkteEvent notes (Phase I). "Annotations on published knowledge content" (e.g., per-glossary-term practitioner tips) is a separate scope and still pending. Requires moderation UI.
4.4 Mandantenkosten-Report (Client Cost Report) — Pending
Branded PDF cost estimate generated from Kostenrechner data: HL logo, matter reference, date, scenario comparison, editable cover letter. One-click replacement for today's manual Excel-to-memo workflow.
Effort: ~10h | Impact: Medium-High (client-facing)
Prioritized Backlog
Phase 0 (Aktenverwaltung) items are Done as of April 2026. Remaining work ordered by priority.
| # | Feature | Phase | Effort | Impact | Priority | Status |
|---|---|---|---|---|---|---|
| 0.1 | Akten (matter mgmt) | 0 | — | Foundational | P0 | ✅ Done |
| 0.2 | Fristen (persistent) | 0 | — | Foundational | P0 | ✅ Done |
| 0.3 | Termine + CalDAV | 0 | — | High | P0 | ✅ Done |
| 0.4 | Dashboard | 0 | — | High | P0 | ✅ Done |
| 1.1 | Link Hub | 1 | 2h | High | P0 | ✅ Done |
| 1.3 | Gebührentabellen | 1 | 4h | Med-High | P0 | ✅ Done |
| 1.4 | Patentglossar | 1 | 5h | Medium | P1 | ✅ Done |
| 2.2 | Gerichtsverzeichnis | 2 | 8h | Med-High | P1 | ✅ Done |
| 2.4 | Checklisten | 2 | 7h | High | P1 | ✅ Done |
| 1.5 | Kostenrechner enhancements | 1 | 6h | High | P1 | ✅ Partial (PDF/URL/compare done; Prozesskostensicherheit pending) |
| 1.2 | More Downloads (content) | 1 | 1h/file | Medium | P1 | ⬜ Page shipped; content pending |
| 0.6 | Notizen (service + UI) | 0 | 4h | Medium | P2 | ⬜ Schema done, service pending |
| 2.1 | Verfahrensleitfäden | 2 | 14h | Very High | P2 | ⬜ Pending |
| 3.4 | Benachrichtigungen | 3 | 3h | Medium | P2 | ⬜ Pending |
| 3.1 | Suchfunktion | 3 | 6h | High | P3 | ⬜ Pending |
| 3.2 | Vorlagenbibliothek | 3 | 8h | High | P3 | ⬜ Pending |
| 3.3 | Schulungsbereich | 3 | 16h | Med-High | P3 | ⬜ Pending |
| 4.4 | Mandantenkosten-Report | 4 | 10h | Med-High | P3 | ⬜ Pending |
| 0.5 | AI Frist-Extraktion (Phase H) | 0 | 4h | High | Deferred | ⏸ Anthropic API decision pending |
| 4.1 | KI-Recherche | 4 | 20h | Transformative | Deferred | ⏸ Tied to Phase H decision |
| 4.3 | Collaborative Annotations (published content) | 4 | 15h | High | P4 | ⬜ Pending |
Architecture Notes
Data Strategy
The data model is split:
- Phase 0 (Aktenverwaltung) — Supabase tables in the
paliadschema with office-scoped RLS (paliad.can_see_akte(akte_id)). User-generated data lives here: Akten, Fristen, Termine, Parteien, Dokumente, Notizen, Verlauf, User profiles, CalDAV config. Migrations embedded into the Go binary viaembed.FSand applied bygolang-migrateat server startup. - Knowledge platform (Phases 1–2) — static JSON data loaded at server startup. Content lives in git; content updates = git commits = automatic deploy.
- Feedback tables (
link_suggestions,checklisten_feedback,gerichte_feedback) —paliadschema, firm-wide visibility.
When static content grows past what's practical in JSON (Phase 3+), migrate specific content types to Supabase tables with a simple admin API. Don't mass-migrate — move what benefits from search/filtering/mutation.
Visibility Invariant
The office-scoped visibility predicate is defined once in SQL (paliad.can_see_akte(akte_id uuid)) and reused by every RLS policy on every table that carries an akte_id. AkteService.GetByID mirrors the predicate at the application layer for defense in depth; every child service (FristService, TerminService, ParteienService, …) routes through AkteService.GetByID before operating on its own row. Never duplicate the predicate. See docs/design-kanzlai-integration.md §2 and the Phase E memory episode for the architecture invariant.
Content Pipeline
New knowledge content follows this flow:
- Practitioner identifies need (or new case law / template).
- Content written/curated (by knowledge lawyer or contributor).
- Added to Paliad repo as JSON/markdown.
- PR reviewed and merged.
- Auto-deploy via Dokploy webhook (push to
main→ Gitea webhook → Dokploy).
Navigation
The sidebar has six grouped sections (see docs/design-kanzlai-integration.md §6):
— ÜBERSICHT —
Dashboard
— ARBEIT —
Akten
Fristen
Termine
— WERKZEUGE —
Kostenrechner
Fristenrechner (stateless quick calc; distinct from /fristen)
Gebührentabellen
— WISSEN —
Glossar
Checklisten
Gerichtsverzeichnis
Leitfäden (future — Phase 2.1)
— RESSOURCEN —
Downloads
Nützliche Links
— EINSTELLUNGEN —
CalDAV
What Paliad Is
Paliad is the all-in-one platform for HLC patent practice:
- Knowledge platform — curated content, practical tools, quick reference (Glossar, Gebührentabellen, Checklisten, Gerichtsverzeichnis, Leitfäden, Links, Downloads).
- Aktenverwaltung — Akten, Fristen, Termine, Parteien, Dokumente, Notizen, Verlauf (audit trail). Office-scoped visibility with explicit collaborator lists for cross-office teams. Personal calendar sync via CalDAV. AI-assisted Frist extraction is designed but deferred.
What Paliad is not:
- Not a billing tool — HLC has firm-wide billing infrastructure.
- Not a beA gateway — out of scope; lawyers use existing beA software.
- Not a document management system — SharePoint / netDocuments stay in their lane.
- Not a CMS — content lives in git, not a database with a CMS UI.
Longer-Term Open Questions
-
Outlook / Exchange sync (Phase K). CalDAV covers Apple iCloud +
dav.msbls.de. HLC lives on Outlook + Exchange; Exchange's CalDAV support is limited. A follow-on "Phase K" would add an EWS / Microsoft Graph backend behind the same sync abstraction. Decide based on internal feedback to Phase F. -
Practice-group walls. Today,
practice_groupis filter-only metadata. If a partner asks for "Patents Litigation can't see Patents Prosecution Akten", the schema is ready to extend thepaliad.can_see_aktepredicate. Don't build until asked. -
External counsel access. Bringing in an outside boutique on a specific Akte currently means adding them as a user (not possible without the HLC email domain). A future
external_collaboratorstable with scoped RLS would cover it. -
Read-only archive post-closure. Add
is_archivedonpaliad.akten, deny mutations via RLS. Cheap follow-on. -
AI revisit. The Phase H / 4.1 pause is a decision, not a technical block. When Anthropic API goes back on the table, both AI extraction (Phase H) and KI-Recherche (4.1) can be unblocked.
-
Supabase Auth SMTP routing. Confirmation / password-reset / magic-link mails from
ydb.youpc.orgstill go through Supabase's default sender. Routing them through Paliad's SMTP (mail@paliad.de) is a one-line GoTrue config change, but youpc's Supabase is shared with youpc.org, so the global SMTP settings can't be flipped without rebranding youpc.org's auth mails too. Resolution paths (lowest-effort first):- Move Paliad to its own Supabase project and configure SMTP there.
- Wait until the youpc instance exposes per-project SMTP (Supabase Pro / self-hosted upgrade).
- Write a custom GoTrue webhook that Paliad's Go server intercepts and re-sends via
MailService.
For now the inbox-facing mails (reminders + invitations) go through Paliad's SMTP; identity-bootstrap mails stay on the default sender — acceptable for the current HLC pilot. Tracked as part of t-paliad-021 completion (2026-04-20).