Skip to content
Merged
306 changes: 16 additions & 290 deletions .agents/skills/git/SKILL.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions .agents/skills/writing-voice/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,3 +195,9 @@ When the user provides example text or tone guidance, match it:
- If they give 5 sentences, don't write 5 paragraphs
- If they use direct statements, don't add narrative fluff
- Match their energy, not a template

## Financial Language

Epicenter's primary goal is not to make money. Vision and mission come first. Financial sustainability exists to fund more open-source development and sponsor contributors—it's a means, not the point.

When writing about how the project sustains itself, be cautious with language that sounds like a pitch deck. Avoid "revenue," "monetization," "ARR," dollar-figure valuations, and other tech bro jargon. Say "financial sustainability" or "sustaining the project" instead. Name companies like Grafana or Bitwarden as references, but drop the dollar figures—otherwise it reads as if we're chasing their numbers rather than explaining our approach.
2 changes: 0 additions & 2 deletions .github/ISSUE_TEMPLATE/bug-report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,4 @@ body:
description: Please confirm the following
options:
- label: I have searched existing issues to ensure this hasn't been reported
required: true
- label: I have included all relevant information above
required: true
7 changes: 1 addition & 6 deletions .github/ISSUE_TEMPLATE/feature-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,12 @@ body:
- Links to similar features in other apps
- If from Discord, paste the Discord message body here
value: |
### Problem:
### Problem / use case:


### Proposed solution:


### Use case:


### Additional details:

validations:
required: true

Expand Down
59 changes: 15 additions & 44 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,53 +1,24 @@
## Summary
<!--
Open with WHAT changed (one crisp sentence), then explain WHY.

<!-- Briefly describe what this PR does and why it's needed -->
For API changes, include before/after code examples.
For refactors, show before/after snippets.
Don't list files changed—the diff tab does that.
-->

## Changelog

<!-- One line per user-visible change. Omit this section entirely for internal-only changes. -->

## Related Issue

<!-- Link to the issue this PR addresses, if applicable -->
Closes #

## Changes Made

<!-- Describe your changes in detail. What did you change and how? -->

## Testing

<!-- Describe the tests you ran to verify your changes -->

### Desktop App Testing
- [ ] Tested on macOS
- [ ] Tested on Windows
- [ ] Tested on Linux
- [ ] Not applicable (web-only change)

### General Testing
- [ ] Tested with multiple API providers (if applicable)
- [ ] Verified no API keys are exposed in logs or storage
- [ ] Checked for console errors
- [ ] Tested on different screen sizes (if UI change)

## Checklist

<!-- Make sure you've completed these steps -->
## Changelog

- [ ] My code follows the project's coding standards (see [CONTRIBUTING.md](../CONTRIBUTING.md))
- [ ] I've used `type` instead of `interface` in TypeScript
- [ ] I've used absolute imports where applicable
- [ ] I've tested my changes thoroughly
- [ ] I've added/updated tests for my changes (if applicable)
- [ ] My changes don't break existing functionality
- [ ] I've updated documentation (if needed)
- [ ] If touching `apps/api/`, `packages/sync/`, or `packages/sync-client/`—CODEOWNERS requires @braden-w review
<!--
One line per user-visible change. Imperative mood. Written for end users, not developers.
Required for feat: and fix: PRs. Omit this section entirely for chore/refactor/docs.
-->

## Screenshots/Recordings
-

<!-- If this is a UI change, please include screenshots or recordings -->
Closes #

## Additional Notes
<!-- Paste screenshots or recordings here for UI changes -->

<!-- Any additional context, considerations, or discussion points -->
> PRs touching `apps/api/`, `packages/sync/`, or `packages/sync-client/` require @braden-w review per CODEOWNERS.
31 changes: 15 additions & 16 deletions HOW_TO_MONETIZE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Honestly, we're still figuring this out. I've been thinking about it a lot—tal

Epicenter is AGPL-3.0. It stays that way. We require a lightweight CLA (license grant, not copyright assignment—contributors keep their copyright) and we don't need to formally "dual license" anything. When an enterprise wants to self-host our sync server but can't accept AGPL (because their legal team won't let them), we sell them a commercial license. That's just a private contract between us and them—nothing changes on the public repo.

The AGPL isn't the business model. It's the moat that makes the business model work.
AGPL keeps the code open. When enterprises need a different arrangement, that's where the commercial license comes in.

## What we considered

Expand All @@ -22,11 +22,11 @@ Option 3 won. It's the least complicated, stays faithful to open source, and doe

## How AGPL actually works as leverage

Here's something I didn't fully appreciate until recently: AGPL is effectively a lead generation tool for enterprise sales. Not because we'd ever sue anyone, but because of how corporate compliance works.
Here's something I didn't fully appreciate until recently: the AGPL basically does the work of surfacing enterprises who need a commercial license. Not because we'd ever sue anyone, but because of how corporate compliance works.

The typical flow looks like this: a developer at a company discovers Epicenter, starts using it, loves it. Then their compliance tooling (Snyk, FOSSA, whatever they use) flags AGPL in a dependency scan. Legal sees the flag and applies their blanket ban—most Fortune 500 companies prohibit AGPL by default. At that point, the company has two options: stop using it, or buy a commercial license. We get a sales conversation we didn't have to create.

This is the same playbook that Grafana Labs ($9B valuation, $400M+ ARR), Bitwarden ($100M Series B), and MinIO ($1B+ valuation) all use. AGPL creates the constraint. The commercial license removes it.
This is the same approach Grafana Labs, Bitwarden, and MinIO all use. AGPL creates the constraint. The commercial license removes it.


## What this means for developers building on Epicenter
Expand All @@ -37,17 +37,17 @@ The catch is that the **combined work** (your code + our AGPL library) must comp

This is the same pattern Grafana uses—their UI libraries (`grafana-ui`, `grafana-data`) are Apache 2.0 so plugin developers aren't forced into AGPL for their own code, even though the combined Grafana distribution is AGPL.

## The three revenue streams
## How this sustains the project

We see three ways this generates revenue, serving different kinds of customers:
We see three ways to become financially sustainable, serving different kinds of customers:

**Hosted sync.** We run the sync server. Users pay for the convenience of not managing infrastructure, plus end-to-end encryption. This is the Obsidian model—they make roughly 80% of their revenue from Sync alone. Individual users and small teams will never self-host; they just want it to work. This is the volume play.
**Hosted sync.** We run the sync server. Users pay for the convenience of not managing infrastructure, plus end-to-end encryption. This is the Obsidian model—individual users and small teams will never self-host; they just want it to work.

**Enterprise self-host licenses.** Banks, healthcare companies, defense contractors, anyone with strict data sovereignty requirements—they need to run the sync server on their own infrastructure. Their legal team flags the AGPL, and that forces a commercial conversation. They're buying AGPL escape plus SSO, audit logs, and a support SLA. This is the high-ticket play.
**Enterprise self-host licenses.** Banks, healthcare companies, defense contractors, anyone with strict data sovereignty requirements—they need to run the sync server on their own infrastructure. Their legal team flags the AGPL, and that forces a commercial conversation. They're buying AGPL escape plus SSO, audit logs, and a support SLA.

**AI compute.** Epicenter does transcription and AI assistance. Users who don't want to manage their own API keys pay us for bundled access. We negotiate volume pricing with model providers and mark it up slightly. Nice margin on top.
**AI compute.** Epicenter does transcription and AI assistance. Users who don't want to manage their own API keys pay us for bundled access. We negotiate volume pricing with model providers and pass on reasonable rates.

These aren't competing streams. The person paying $10/month for hosted sync will never self-host. The enterprise paying $100k/year for a commercial license will never use our hosted sync—their compliance team won't let data leave their network. Different buyers, different motivations, same AGPL foundation.
These aren't competing streams. The person paying for hosted sync will never self-host. The enterprise buying a commercial license will never use our hosted sync—their compliance team won't let data leave their network. Different buyers, different motivations, same AGPL foundation.

## Why not a formal dual license?

Expand All @@ -65,15 +65,14 @@ Crucially, this is a license grant, NOT copyright assignment. You keep your copy

## The comps

Projects using this same AGPL approach at venture scale right now:
Projects using this same AGPL approach:

- Grafana Labs—$9B valuation, switched to AGPL specifically to prevent cloud providers from strip-mining their value
- Bitwarden—AGPL, $100M Series B, sells enterprise self-host licenses
- MinIO—$1B+ valuation, AGPL forces enterprise licenses starting at ~$96k/year
- AppFlowy—AGPL, $6.4M seed, open core plus enterprise self-host (closest to our architecture)
- Logseq—AGPL, local-first desktop app, VC-backed (closest comp to Epicenter overall)
- Grafana Labs—switched to AGPL specifically to prevent cloud providers from strip-mining their value
- Bitwarden—AGPL, sells enterprise self-host licenses
- MinIO—AGPL, enterprise licenses for self-hosted object storage
- AppFlowy—AGPL, open core plus enterprise self-host (closest to our architecture)
- Logseq—AGPL, local-first desktop app (closest comp to Epicenter overall)

Nobody's proven a $10B+ exit with this exact model yet. But Grafana at $9B is close, and none of those comps had our AI angle.
Every one of these projects requires a CLA. We do now too.

## What I care about
Expand Down
4 changes: 2 additions & 2 deletions specs/20260313T071500-add-cla-infrastructure.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Problem

HOW_TO_MONETIZE.md claims Epicenter follows the same AGPL dual-licensing playbook as Grafana ($9B), MongoDB, Bitwarden, and MinIO—but omits that every one of those companies requires a Contributor License Agreement. Without a CLA:
HOW_TO_MONETIZE.md claims Epicenter follows the same AGPL dual-licensing approach as Grafana, MongoDB, Bitwarden, and MinIO—but omits that every one of those projects requires a Contributor License Agreement. Without a CLA:

1. Community contributions to commercially relevant code (sync server, sync protocol) can't be commercially licensed
2. Future relicensing is blocked by copyright fragmentation across ~30 contributors
Expand Down Expand Up @@ -71,7 +71,7 @@ What the CLA covers:
## What This Does NOT Change

- The AGPL-3.0 license stays
- The monetization strategy stays (it was correct, just incomplete)
- The sustainability strategy stays (it was correct, just incomplete)
- Existing contributors' code remains under AGPL (their past contributions don't retroactively fall under the CLA)
- No copyright assignment—contributors keep their copyright

Expand Down
Loading