Files
paliad/docs/feature-roadmap.md
m 11217f7bfa feat: email service — SMTP + deadline reminders + invitations (t-paliad-021)
- 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.
2026-04-20 12:34:38 +02:00

19 KiB
Raw Permalink Blame History

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 (AD) 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

  1. Knowledge and practice live together — tools and content bring people in; Aktenverwaltung keeps them there daily.
  2. 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.
  3. Self-serve over manual curation — prefer structured data + search over hand-maintained pages.
  4. Ship incrementally — each feature is independently useful.
  5. German content quality matters — proper Umlaute, legal precision, no machine-translation feel.
  6. 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 AJ); this roadmap is the user-facing summary.

0.1 Akten (Matter Management) — office-scoped Done (2026-04-16, Phases AD)

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.

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 13). 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 paliad schema 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 via embed.FS and applied by golang-migrate at server startup.
  • Knowledge platform (Phases 12) — 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) — paliad schema, 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:

  1. Practitioner identifies need (or new case law / template).
  2. Content written/curated (by knowledge lawyer or contributor).
  3. Added to Paliad repo as JSON/markdown.
  4. PR reviewed and merged.
  5. 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_group is filter-only metadata. If a partner asks for "Patents Litigation can't see Patents Prosecution Akten", the schema is ready to extend the paliad.can_see_akte predicate. 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_collaborators table with scoped RLS would cover it.

  • Read-only archive post-closure. Add is_archived on paliad.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.org still 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):

    1. Move Paliad to its own Supabase project and configure SMTP there.
    2. Wait until the youpc instance exposes per-project SMTP (Supabase Pro / self-hosted upgrade).
    3. 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).