Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ ui/dist/
ui/.vite/
**/*.tsbuildinfo
ui/src/**/*.js
/website/dist/

# Editor / OS
.DS_Store
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Strand

> A fast, keyboard-first Git client — built for reviewing what AI coding
> agents do to your code.
> A fast, keyboard-first Git client for Windows, macOS, and Linux — with
> first-class workflows for reviewing what AI coding agents do to your code.

[![CI](https://github.com/danielss-dev/strand/actions/workflows/ci.yml/badge.svg)](https://github.com/danielss-dev/strand/actions/workflows/ci.yml)
[![License: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)](./LICENSE)
Expand Down Expand Up @@ -299,7 +299,7 @@ strand/
│ └── strand-tauri/ # Tauri 2 app shell + IPC commands
├── packaging/ # Store/distribution manifests assembled around release binaries
├── ui/ # Vite + React + TypeScript frontend
├── website/ # strandgit.com: landing page + user guide (website/docs/, no build step)
├── website/ # strandgit.com: landing page + pre-rendered user guide
├── docs/ # design notes, perf baseline, packaging
├── PRD.md # product spec
├── ROADMAP.md # milestones and status
Expand Down
18 changes: 13 additions & 5 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -718,7 +718,7 @@ doc → doc links stay in Preview either way. Verified: `vitest` (105, +17
markdown), `tsc`, `cargo check -p strand-tauri`.

**Landing page (2026-06-12):** First pass at the public face, ahead of the
beta: `website/` holds a static, no-build-step landing page for
beta: `website/` initially held a static, no-build-step landing page for
`strandgit.com`. It reuses the app's identity wholesale — the OKLCH
token palette from `tokens.css`, self-hosted Geist + JetBrains Mono, the
single-hue accent system (a row of hero dots rotates `--accent-h` live,
Expand Down Expand Up @@ -1526,10 +1526,10 @@ store-level `reviewWorktree`); palette gained Clean up / Prune entries; the
documentation: `website/docs/` holds nine markdown guide pages (overview,
getting started, repositories & workspaces, reviewing agent changes,
worktrees, everyday git, commits & history, keyboard & palette, settings),
each fact-checked against `ui/src` before landing, rendered client-side by a
static viewer (`docs/index.html` + vendored `marked.min.js` — the site keeps
its no-build-step invariant; updating docs = editing the `.md` and
redeploying). The landing page was synced to 0.9.x reality: Linux download
each fact-checked against `ui/src` before landing. Markdown remains the source
of truth; since 2026-07-31 a zero-dependency build pre-renders it through the
vendored `marked.min.js` into static clean-URL HTML. The landing page was synced
to 0.9.x reality: Linux download
button live (AppImage), stale ~10 MB installer claims corrected to real
15/31 MB sizes, the worktrees card now covers Compare + Merge & clean up, new
Workspaces and AI-commit-messages cards fill the feature grid, and Docs is
Expand Down Expand Up @@ -2470,6 +2470,14 @@ pull-request chronology now places the latest commit, comment, or lifecycle
event at the top while retaining deterministic tie ordering. Focused frontend
tests cover merged and closed timelines.

**Website SEO foundation shipped (2026-07-31):** Strand's public site now
leads with its fast cross-platform Git-client category while keeping agent
review as the differentiator. The homepage exposes canonical, social, and
SoftwareApplication metadata; all 13 guide pages pre-render to crawlable clean
URLs; and the build emits a sitemap plus robots policy. A repository SEO check
fails on duplicate or missing metadata, invalid JSON-LD, broken routes, legacy
query/Markdown links, or a sitemap that drifts from the generated pages.

---

## Cross-cutting tracks (run in parallel with all milestones)
Expand Down
17 changes: 13 additions & 4 deletions TASKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2093,7 +2093,7 @@ quick-wins from that audit already landed (see ROADMAP changelog).
legal, updater-rehearsal, clean-machine, and real-platform checks in
`docs/release-checklist.md` remain open.
- ☑ Landing page at `strandgit.com` + downloads + auto-update manifest
(site built: `website/` — static, no build step, design tokens + fonts lifted
(site built: `website/` — static output, design tokens + fonts lifted
from the app, interactive app-replica demo + ⌘K palette, AGPL/honor-system
pricing section. **Deployed on Railway** — project `landings`, service
`strand-landing`, live at https://strandgit.com (custom domain DNS
Expand All @@ -2109,16 +2109,25 @@ quick-wins from that audit already landed (see ROADMAP changelog).
selection, repository/workspace Review scope, notes/baseline/file actions,
and pointer + keyboard pane resizing; desktop/narrow browser QA is clean.)
- ☑ User-guide docs on the website (2026-07-08: `website/docs/` — nine
fact-checked markdown pages + `manifest.json`, rendered client-side by
`docs/index.html`/`docs.js` with vendored `marked.min.js`; no build step —
updating docs = editing the `.md` files and redeploying. Landing page synced
fact-checked markdown pages + `manifest.json`; since 2026-07-31, `build.mjs`
pre-renders them with vendored `marked.min.js` into crawlable clean-URL HTML
under `website/dist/`, while Markdown remains the source of truth. Landing page synced
to 0.9.x: Linux download button live, installer sizes corrected, worktree
Compare / Merge & clean up + Workspaces + AI commit messages cards, Docs
link in nav/footer/⌘K.)
- ☑ Keep `website/docs/` in sync with app releases — 1.0 truth pass completed
2026-07-18 across all nine guide pages, native-menu language, privacy/status
copy, landing release labels, website maintainer notes, and
`docs/changelog/2026-07-18-strand-1.0.0.md`.
- ☑ Website SEO foundation (2026-07-31: general-first Git-client homepage
title/H1/copy and section order; canonical/Open Graph/SoftwareApplication
metadata; 13 pre-rendered guide routes; generated `robots.txt` and
`sitemap.xml`; `seo-check.mjs` validates metadata, JSON-LD, routes, and links)
- ◐ Deploy the SEO build, permanently redirect `www.strandgit.com` to the apex
domain, verify the domain in Google Search Console, import it into Bing
Webmaster Tools, and submit `https://strandgit.com/sitemap.xml` (Google domain
property verified by DNS on 2026-07-31; deployment, redirect, Bing, and sitemap
submission remain).

---

Expand Down
8 changes: 4 additions & 4 deletions docs/microsoft-store-submission.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ automation.

- Complete owner/counsel review of the open Strand trademark gate and approve
the factual privacy notice and user-content guidelines at
`https://strandgit.com/docs/?page=privacy` and
`https://strandgit.com/docs/?page=content-guidelines`.
`https://strandgit.com/docs/privacy/` and
`https://strandgit.com/docs/content-guidelines/`.
- Do not obtain or upload a Windows publisher certificate for this route.
Partner Center signs the accepted MSIX during certification.

Expand Down Expand Up @@ -166,11 +166,11 @@ installer-specific step does not apply to the MSIX route.
repository content and connected Git-host data, and an optional
user-reviewed crash report can contain repository paths.
- Privacy policy:
`https://strandgit.com/docs/?page=privacy`
`https://strandgit.com/docs/privacy/`
- Website: `https://strandgit.com`
- Support: `https://github.com/danielss-dev/strand/issues`
- User-generated content guidelines:
`https://strandgit.com/docs/?page=content-guidelines`
`https://strandgit.com/docs/content-guidelines/`
- Non-Microsoft drivers or NT services: **No**
- Tested to meet accessibility guidelines: **Do not claim this yet.** Strand
is keyboard-operable, but no external conformance audit is recorded.
Expand Down
4 changes: 2 additions & 2 deletions scripts/check-microsoft-store.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,10 @@ if (!/"file"\s*:\s*"privacy"/i.test(docsManifest)) {
if (!/"file"\s*:\s*"content-guidelines"/i.test(docsManifest)) {
fail('documentation manifest must include the content guidelines');
}
if (!/docs\/\?page=privacy/i.test(websiteIndex)) {
if (!/docs\/privacy\//i.test(websiteIndex)) {
fail('website footer must link to the privacy policy');
}
if (!/docs\/\?page=content-guidelines/i.test(websiteIndex)) {
if (!/docs\/content-guidelines\//i.test(websiteIndex)) {
fail('website footer must link to the content guidelines');
}
if (
Expand Down
45 changes: 28 additions & 17 deletions website/README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
# Strand landing page

Static site for `strandgit.com`. No build step.
Static site for `strandgit.com`. A zero-dependency Node build pre-renders the
Markdown user guide into crawlable HTML and writes the deployable site to
`dist/`.

**Deployed on Railway**: project `landings` → service `strand-landing`
(`railway up` from this folder redeploys; `npm start` is what Railway runs —
`serve . -l $PORT`; `npm run build` is a no-op that exists only because the
Railway image build wants a build command). Test URL:
(`railway up` from this folder redeploys; Railway runs `npm run build` and then
`npm start`, which serves `dist/` on `$PORT`). Test URL:
<https://strand-landing-production.up.railway.app>. The custom domain
`strandgit.com` is live through the Railway service.

Preview locally with `pnpm site` from the repo root (serves on
<http://localhost:4321> via [`serve`](https://github.com/vercel/serve)).
Preview locally with `pnpm site` from the repo root (builds and serves on
<http://localhost:4321> via [`serve`](https://github.com/vercel/serve)). Run
`npm test` from this folder to build and validate titles, descriptions,
canonicals, JSON-LD, the sitemap, robots policy, and internal links.

- `index.html` / `style.css` / `script.js` — the whole site. Design tokens are
lifted from the app (`ui/src/styles/tokens.css`): same warm-charcoal OKLCH
Expand All @@ -35,23 +38,31 @@ Preview locally with `pnpm site` from the repo root (serves on
fuzzy / highlighted UI): it scrolls to page sections, switches the demo
views, sets the accent, and opens GitHub / X. Items live in `ITEMS` in
`script.js` — add new destinations there.
- `docs/` — the user guide, served at `/docs/`. Content is plain markdown
(`*.md`, one file per page) rendered client-side by `docs/index.html` +
`docs/docs.js` using the vendored `docs/marked.min.js` (still no build
step). **To update a page, edit its `.md` and redeploy. To add a page,
drop the `.md` in `docs/` and add a row to `docs/manifest.json`** (order
there drives the sidebar and prev/next pager). Cross-page links are plain
relative `foo.md` links — the viewer rewrites them (and they render on
GitHub too). Keep the guide in sync with app releases: every claim in it
- `docs/` — the user-guide source, served as pre-rendered pages at `/docs/`
and `/docs/<slug>/`. Content is plain markdown (`*.md`, one file per page),
converted at build time by `build.mjs` with the vendored
`docs/marked.min.js`. **To update a page, edit its `.md` and redeploy. To add
a page, drop the `.md` in `docs/` and add a title + unique description row
to `docs/manifest.json`** (order drives the sidebar, sitemap, and prev/next
pager). Cross-page links stay as relative `foo.md` links in source so they
render on GitHub; the build rewrites them to canonical clean URLs. Keep the
guide in sync with app releases: every claim in it
was fact-checked against `ui/src` on 2026-07-18 for the 1.0 release candidate.
The public privacy policy used by distribution listings is
`/docs/?page=privacy`, and Store UGC guidance is
`/docs/?page=content-guidelines`; deploy website changes before submitting
either Store URL.
`/docs/privacy/`, and Store UGC guidance is `/docs/content-guidelines/`.
Legacy `?page=` URLs redirect to their clean equivalents; deploy website
changes before submitting either Store URL.

## Before launch

- [x] Custom-domain DNS and TLS are live at `strandgit.com`.
- [ ] Redirect `www.strandgit.com` permanently to `https://strandgit.com/`
in the Railway/DNS control plane (the stale `www` record currently lands
on an unrelated 404 host).
- [x] Verify the apex domain in Google Search Console (DNS verification completed
2026-07-31).
- [ ] Import the verified property into Bing Webmaster Tools and submit
`https://strandgit.com/sitemap.xml` after this SEO build is deployed.
- [x] Download CTAs resolve the latest platform assets through the GitHub
Releases API, with the release page as the failure fallback.
- [ ] Point "Get a commercial license" at `COMMERCIAL.md` / a purchase flow
Expand Down
Loading
Loading