Publish a roadmap and a changelog, and write down who we are selling to #114

Merged
cruelacid merged 2 commits from worktree-gtm into main 2026-09-23 16:36:15 +01:00
Owner

Part of #110 (go-to-market) and #77. Carries the "Social Media" session's two commits (session_011buQqeLZQ2r5dCrgQ42u4U) through a pull request. That session's direct push to main was blocked, rightly. The commits are rebased onto main and otherwise unchanged.

  • /roadmap and /changelog on nectenda.com. The site build asserts that the newest changelog entry matches packages/plugin/manifest.json, and that manifest joins deploy-site.yml's paths: so the assertion actually runs.
  • docs/go-to-market.md, which is private.

Merging this deploys the site: deploy-site.yml runs on main for site/**.

#85 follows on top. It turns site/content/changelog.mjs from hand-written into a renderer of docs/changelog-plugin.md, keeping this page's design, because the ledger is the single master (#82).

Checked here after the rebase: node site/build.mjs builds 7 pages with every local reference resolving, and no <script> is emitted. eslint site scripts is clean.

Changelog

NONE

🤖 Generated with Claude Code

https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt

Part of #110 (go-to-market) and #77. Carries the "Social Media" session's two commits (`session_011buQqeLZQ2r5dCrgQ42u4U`) through a pull request. That session's direct push to `main` was blocked, rightly. The commits are rebased onto `main` and otherwise unchanged. - **`/roadmap` and `/changelog` on nectenda.com.** The site build asserts that the newest changelog entry matches `packages/plugin/manifest.json`, and that manifest joins `deploy-site.yml`'s `paths:` so the assertion actually runs. - **`docs/go-to-market.md`**, which is private. Merging this **deploys the site**: `deploy-site.yml` runs on `main` for `site/**`. #85 follows on top. It turns `site/content/changelog.mjs` from hand-written into a renderer of `docs/changelog-plugin.md`, keeping this page's design, because the ledger is the single master (#82). Checked here after the rebase: `node site/build.mjs` builds 7 pages with every local reference resolving, and no `<script>` is emitted. `eslint site scripts` is clean. ## Changelog NONE 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Relay publishes a roadmap and release notes and we published neither, which
reads as abandonment to anyone deciding between two small tools. Both pages
returned 404 while the other six were live.

The changelog is the sharper of the two. Relay ships roughly weekly and their
notes are text only, so a visual changelog is a gap nobody in the niche fills.
Which is also why it is hand-written: versions.json knows only minAppVersion,
and publish-plugin.mjs emits the same build-verification boilerplate every
release, so generating one would publish six identical entries -- reproducing
exactly the thing worth beating.

It carries one assertion instead. The newest entry must name the version in
packages/plugin/manifest.json, so a release with no entry fails the site
deploy. That manifest joins deploy-site.yml's paths in this commit, because
otherwise the assertion would only run when site/ changed, which is precisely
when it is not needed: the bump that skips an entry touches packages/, not
site/. It cannot block a release -- ci.yml does not build the site.

The roadmap carries states and never dates. A date on a roadmap is a promise,
and positioning.md is blunt about what one overstatement costs. Every shipped
item was checked against plan-master.md's phase headings rather than memory.
It links no feedback board because there is not one yet; a dead "vote on this"
link is worse than none, so requests go to an inbox a person reads.

Roadmap goes in the header, changelog in the footer. That makes the footer
comment claiming it carries "the legal pages and only those" untrue, so it is
rewritten here rather than left standing -- a comment asserting a rule the list
below no longer follows is worse than no comment.

Both build guards were mutation-checked: an entry behind the manifest fails,
and an 81-character description fails.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011buQqeLZQ2r5dCrgQ42u4U
Write down who we are selling to, having found out
Some checks failed
Release note / release-note (pull_request) Successful in 11s
CI / build (pull_request) Successful in 4m53s
CI / e2e (pull_request) Failing after 3m27s
CI / promote (pull_request) Has been skipped
60d58d0f4e
The question asked was how to start a social media presence. Looking at what
the competition actually does answered a different one: Relay, at 209,229
downloads, has a Discord, a forum thread and a release-notes page, and no X, no
Bluesky, no Mastodon and no newsletter. Peerdraft has a Discord. An empty field
is either an opportunity or evidence the customers are not standing in it, and
Obsidian plugin discovery says the latter -- the store, the forum, r/ObsidianMD,
the Roundup and YouTube.

The arithmetic settles it. 36 downloads, no paying customers, and
commercial-model.md puts break-even at roughly ten accounts. Ten is not a funnel
problem, and launch-readiness.md already names what it is: no task anywhere in
this project involves a person outside it.

So the market is named rather than assumed: security consultancies and red
teams, because theirs is the one segment where "the server cannot read your
notes" is a contractual requirement rather than a preference, and the only one
that can actually verify the unminified client. That second half matters --
"read the code yourself" is worth nothing to a buyer who cannot.

The audit answer is written down too, because it arrives within two emails and
the honest no is stronger than a weak yes when the verification path already
exists. With a trigger for commissioning a real one, so it is a decision rather
than an open question.

Private, so it can cite positioning.md and competition-relay.md freely.
PUBLIC_DOCS holds security-model.md and nothing else, so that is the default.

One thing it records rather than repeats: Relay's non-encryption wording has
already moved between the 1 September snapshot and the live page on the 22nd.
The claim holds, but publishing the old quote would be quoting a page that no
longer says it.

Tracked as #110, which carries the checklist. This carries the reasoning.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011buQqeLZQ2r5dCrgQ42u4U
cruelacid force-pushed worktree-gtm from 60d58d0f4e
Some checks failed
Release note / release-note (pull_request) Successful in 11s
CI / build (pull_request) Successful in 4m53s
CI / e2e (pull_request) Failing after 3m27s
CI / promote (pull_request) Has been skipped
to 21bddd4db3
Some checks failed
Release note / release-note (pull_request) Successful in 10s
e2e / multi (push) Failing after 5m10s
CI / build (pull_request) Successful in 5m6s
CI / e2e (pull_request) Successful in 4m8s
CI / promote (pull_request) Has been skipped
Deploy site / deploy (push) Successful in 56s
CI / build (push) Successful in 5m50s
CI / e2e (push) Successful in 4m56s
CI / promote (push) Has been cancelled
2026-09-23 16:20:39 +01:00
Compare
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Nectenda/nectenda!114
No description provided.