Skip to content

Pitch: Tolgee Apps — from POC to production #3801

Description

@JanCizmar

Pitch: Tolgee Apps — from POC to production

1. Problem

Tolgee cannot be extended without forking or upstreaming. Every customer-specific need — a semantic back-translation check, glossary enforcement, linking keys to an external system — either becomes a feature request competing for core capacity, or doesn't happen at all. Competitors (Crowdin Apps, Atlassian Connect ecosystem) let third parties build on the platform; we have no story.

The hackathon produced a working plugin system POC (jancizmar/tolgee-apps-poc, architecture in docs/dev-notes/TOLGEE_APPS_ARCHITECTURE.md): manifest-registered apps render sandboxed iframes across the product, call the REST API with signed short-lived JWTs, and react to webhooks. Three example apps (dev-plugin, back-translate, glossary-keeper) were built against it with an SDK, CLI, and generator. The baseline problem now: this all lives on one giant unreviewed branch (~275 files). Nobody but the author can vouch for it, the security surface (iframes, tokens, SSRF, scope escalation) has never had focused review, and it can't merge as-is.

2. Appetite

4 weeks — two cycles worth of calendar time, one developer.

  • Weeks 1–2 — implementation: extract the POC into ~9 vertically-integrated, UI-testable scopes (each ≈ one PR), merged to main behind a tolgee.apps.enabled flag, each with e2e proof that an SDK-built app works against it.
  • Weeks 3–4 — team review: reviewers work through the per-scope PRs; the developer addresses findings, hardens security per review feedback, and finishes docs.

3. Solution

The engine gives an app author three capabilities, delivered in this order, each proven end-to-end in the UI before the next starts:

Foundation — register & enable. Org settings → Apps: admin pastes a manifest URL, Tolgee fetches + validates it (SSRF-guarded, HTTPS-only), shows the parsed modules, stores the install. Project settings → Apps: project admin toggles the app per project. Disabled = invisible everywhere.

Pillar 1 — apps use the REST API. An enabled app's project-dashboard-page module appears in the project sidebar; clicking mounts a sandboxed iframe. postMessage handshake delivers a Tolgee-signed JWT (install/org/project/user claims, short TTL); the app calls /v2/... with it. Enforcement is scope-cap ∩ user-role. Proven by an SDK example app that reads and writes a translation from its page, asserted by Cypress.

Pillar 2 — apps enhance the UI. Same iframe host reused across: translation tools panel (receives live selection), key-edit dialog tab, key/translation action decorators (static + dynamic via the app's decoratorsUrl, count badges), and — nice-to-have — modals with five trigger surfaces including keyboard shortcuts.

Pillar 3 — apps react to webhooks. Manifest webhooks.events (validated against ActivityType) auto-provisions app-managed webhook configs. Demoed as the back-translate loop: edit a translation → webhook fires → app's decorator badge updates.

Growing alongside every scope: @tolgee/apps-sdk (context, selection, API helpers), the e2e suite (a real SDK app per scope), and the docs section in the documentation repo. UI is not redesigned — the POC's UI, already user-validated in the hackathon, serves as the mockup (deliberate deviation from our "Figma during shaping" rule).

5. No-gos

  • No ZIP-based plugin delivery, no marketplace/directory, no app discovery UI.

6. Success criteria

  • The time to deliver a prototype of customer specific feature is shorter
  • User's understand apps and create their own
  • We have 20 registered user apps in 2 months

Metadata

Metadata

Assignees

No one assigned

    Labels

    pitchThe pitch according to the Shape-up approachpitch-donePitch prepared for betting

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions