Skip to content

Commit 0809cdc

Browse files
pmaxhoganclaude
andcommitted
feat(landing): on-brand driven.maxhogan.dev root page + assemble script (M12)
Add site-landing/ (index.html + styles.css + icon.svg copy of the C2 road-to-cloud master + 404.html): a plain HTML/CSS, framework-free, CDN/tracker-free static landing page. Deep teal (#0F766E) brand, README tagline, feature list, per-platform Get it section, bring-your-own-OAuth trust blurb, Download CTA -> GitHub Releases. Responsive + accessible + ASCII/LF. scripts/assemble-landing.sh copies the landing files into the site/ deploy root (additive, never touches site/updates) for the whole-site CF Pages snapshot. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CyiRqk2DVwmJjEu5gcD1m
1 parent 11fec5a commit 0809cdc

5 files changed

Lines changed: 702 additions & 0 deletions

File tree

scripts/assemble-landing.sh

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env bash
2+
# assemble-landing.sh (M12).
3+
#
4+
# Copies the committed root landing page (site-landing/) into the whole-site
5+
# deploy staging root (site/). `wrangler pages deploy site` publishes a
6+
# WHOLE-SITE snapshot to the driven-updates CF Pages project (which serves
7+
# driven.maxhogan.dev), so EVERY deploy must include BOTH the landing page AND
8+
# both channels' live updates/ manifests, or whatever is missing gets wiped.
9+
#
10+
# This script only handles the LANDING half: it lays down index.html, styles.css,
11+
# icon.svg, and 404.html at the ROOT of site/ (so `/` serves the landing and `/`
12+
# 404s render the branded 404). The updates/ tree is assembled separately by the
13+
# calling workflow (the channel manifest generators + scripts/fetch-live-channel.sh
14+
# overlay), and this copy is ADDITIVE - it never touches site/updates/.
15+
#
16+
# Usage:
17+
# scripts/assemble-landing.sh [site-dir] [landing-dir]
18+
# Defaults: site-dir=site, landing-dir=site-landing
19+
#
20+
# Idempotent: safe to run before or after the updates/ tree is assembled, and
21+
# safe to re-run. It does NOT delete anything under site/.
22+
23+
set -euo pipefail
24+
25+
SITE_DIR="${1:-site}"
26+
LANDING_DIR="${2:-site-landing}"
27+
28+
if [ ! -d "$LANDING_DIR" ]; then
29+
echo "::error::assemble-landing: landing dir '${LANDING_DIR}' not found" >&2
30+
exit 1
31+
fi
32+
33+
mkdir -p "$SITE_DIR"
34+
35+
# Copy the landing files to the site root. We copy the known landing assets
36+
# explicitly (not the dir wholesale) so a stray file under site-landing/ cannot
37+
# accidentally land at the site root. The icon is the C2 road-to-cloud master.
38+
copied=0
39+
for f in index.html styles.css icon.svg 404.html; do
40+
src="${LANDING_DIR}/${f}"
41+
if [ -f "$src" ]; then
42+
cp "$src" "${SITE_DIR}/${f}"
43+
copied=$((copied + 1))
44+
echo "landing: copied ${f} -> ${SITE_DIR}/${f}"
45+
fi
46+
done
47+
48+
# index.html, styles.css, and icon.svg are required for a usable landing; 404.html
49+
# is optional. Fail closed if a required file is missing so we never deploy a
50+
# half-built landing over the live one.
51+
for required in index.html styles.css icon.svg; do
52+
if [ ! -f "${SITE_DIR}/${required}" ]; then
53+
echo "::error::assemble-landing: required landing file '${required}' missing after copy" >&2
54+
exit 1
55+
fi
56+
done
57+
58+
echo "assemble-landing: copied ${copied} landing file(s) into ${SITE_DIR}/"

site-landing/404.html

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>Page not found - Driven</title>
7+
<meta name="robots" content="noindex">
8+
<link rel="icon" type="image/svg+xml" href="/icon.svg">
9+
<link rel="stylesheet" href="/styles.css">
10+
</head>
11+
<body>
12+
<main id="main">
13+
<section class="hero">
14+
<div class="wrap hero-inner">
15+
<img class="hero-mark" src="/icon.svg" width="96" height="96"
16+
alt="Driven app icon: a road leading up into a cloud on a deep teal background">
17+
<h1 class="hero-title">Page not found</h1>
18+
<p class="hero-tagline">That page does not exist (404).</p>
19+
<p class="hero-sub">The link may be old or mistyped. Head back to the Driven home page.</p>
20+
<div class="cta-row">
21+
<a class="btn btn-primary" href="/">Go to Driven home</a>
22+
<a class="btn btn-secondary" href="https://github.com/pmaxhogan/driven">View on GitHub</a>
23+
</div>
24+
</div>
25+
</section>
26+
</main>
27+
</body>
28+
</html>

site-landing/icon.svg

Lines changed: 33 additions & 0 deletions
Loading

site-landing/index.html

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>Driven - encrypted one-way backup to your own Google Drive</title>
7+
<meta name="description" content="Driven is a desktop app for Windows, macOS, and Linux that makes one-way, encrypted backups of your local folders to your own Google Drive.">
8+
<meta name="color-scheme" content="light dark">
9+
<link rel="icon" type="image/svg+xml" href="icon.svg">
10+
<link rel="stylesheet" href="styles.css">
11+
<meta property="og:title" content="Driven">
12+
<meta property="og:description" content="One-way, encrypted backup of your local folders to your own Google Drive.">
13+
<meta property="og:type" content="website">
14+
</head>
15+
<body>
16+
<a class="skip-link" href="#main">Skip to content</a>
17+
18+
<header class="site-header">
19+
<div class="wrap header-inner">
20+
<span class="brand">
21+
<img class="brand-mark" src="icon.svg" width="36" height="36" alt="">
22+
<span class="brand-name">Driven</span>
23+
</span>
24+
<nav class="header-nav" aria-label="Primary">
25+
<a href="#features">Features</a>
26+
<a href="#get-it">Get it</a>
27+
<a href="#privacy">Privacy</a>
28+
<a href="https://github.com/pmaxhogan/driven">GitHub</a>
29+
</nav>
30+
</div>
31+
</header>
32+
33+
<main id="main">
34+
<section class="hero">
35+
<div class="wrap hero-inner">
36+
<img class="hero-mark" src="icon.svg" width="128" height="128"
37+
alt="Driven app icon: a road leading up into a cloud on a deep teal background">
38+
<h1 class="hero-title">Driven</h1>
39+
<p class="hero-tagline" id="tagline">
40+
One-way, encrypted backup of your local folders to your own Google Drive.
41+
</p>
42+
<p class="hero-sub">
43+
A fast, battery- and network-aware desktop app for Windows, macOS, and
44+
Linux. Your source folders stay the single source of truth; Driven only
45+
ever uploads, so there are no two-way sync surprises.
46+
</p>
47+
<div class="cta-row">
48+
<a class="btn btn-primary" href="https://github.com/pmaxhogan/driven/releases">
49+
Download
50+
</a>
51+
<a class="btn btn-secondary" href="https://github.com/pmaxhogan/driven">
52+
View on GitHub
53+
</a>
54+
</div>
55+
<p class="hero-note">
56+
Free and open source. Dual-licensed MIT or Apache-2.0.
57+
</p>
58+
</div>
59+
</section>
60+
61+
<section id="features" class="section" aria-labelledby="features-heading">
62+
<div class="wrap">
63+
<h2 id="features-heading" class="section-title">What Driven does</h2>
64+
<ul class="feature-grid">
65+
<li class="feature">
66+
<h3>One-way to your own Drive</h3>
67+
<p>
68+
Backs up to a Google Drive you control. No second cloud bill, no
69+
two-way sync surprises - local changes flow up, never back down.
70+
</p>
71+
</li>
72+
<li class="feature">
73+
<h3>Client-side encryption</h3>
74+
<p>
75+
Optional per-source encryption (XChaCha20-Poly1305) scrambles file
76+
names and contents on your machine. A BIP39 recovery phrase guards
77+
the master key, so Google stores only ciphertext.
78+
</p>
79+
</li>
80+
<li class="feature">
81+
<h3>Gitignore-aware scanner</h3>
82+
<p>
83+
Honors your <code>.gitignore</code>, built-in and custom exclude
84+
rules, and a configurable symlink policy, so you back up what matters
85+
and skip the noise.
86+
</p>
87+
</li>
88+
<li class="feature">
89+
<h3>Battery and network aware</h3>
90+
<p>
91+
Backups defer on battery and on metered or offline networks, then
92+
resume automatically. A paced, concurrent executor retries and
93+
resumes interrupted uploads.
94+
</p>
95+
</li>
96+
<li class="feature">
97+
<h3>Windows Volume Shadow Copy</h3>
98+
<p>
99+
VSS support backs up locked files - Outlook PSTs, running database
100+
files, VM disks - that an ordinary copy cannot read.
101+
</p>
102+
</li>
103+
<li class="feature">
104+
<h3>In-app restore browser</h3>
105+
<p>
106+
Browse your backup with full-text file-name search and streaming
107+
decrypt, then restore exactly the files you need.
108+
</p>
109+
</li>
110+
<li class="feature">
111+
<h3>Activity dashboard</h3>
112+
<p>
113+
A live tail plus a filterable history shows what was backed up, when,
114+
and whether anything needs attention.
115+
</p>
116+
</li>
117+
<li class="feature">
118+
<h3>Signed auto-update</h3>
119+
<p>
120+
In-app auto-update with signed update manifests and a stable or dev
121+
channel selector keeps you current. (See the macOS note below.)
122+
</p>
123+
</li>
124+
<li class="feature">
125+
<h3>Opt-out telemetry</h3>
126+
<p>
127+
Anonymous, opt-out telemetry records coarse counts only - never file
128+
names, paths, or content.
129+
</p>
130+
</li>
131+
</ul>
132+
</div>
133+
</section>
134+
135+
<section id="get-it" class="section section-alt" aria-labelledby="get-it-heading">
136+
<div class="wrap">
137+
<h2 id="get-it-heading" class="section-title">Get it</h2>
138+
<p class="section-lead">
139+
Download the installer for your platform from the
140+
<a href="https://github.com/pmaxhogan/driven/releases">GitHub Releases page</a>.
141+
Grab the latest release and pick the asset for your OS.
142+
</p>
143+
<ul class="platform-grid">
144+
<li class="platform">
145+
<h3>Windows</h3>
146+
<p><code>.msi</code> or <code>.exe</code> (NSIS) installer.</p>
147+
</li>
148+
<li class="platform">
149+
<h3>macOS</h3>
150+
<p><code>.dmg</code>, universal (Apple Silicon and Intel).</p>
151+
</li>
152+
<li class="platform">
153+
<h3>Linux</h3>
154+
<p><code>.AppImage</code> (portable) or <code>.deb</code> (Debian / Ubuntu).</p>
155+
</li>
156+
</ul>
157+
<p class="section-note">
158+
V1 binaries are not yet code-signed with a paid OS certificate, so the
159+
OS may warn you on first run. On Windows click "More info" then "Run
160+
anyway"; on macOS right-click the app and choose "Open". The in-app
161+
auto-updater works on Windows and Linux; on macOS, re-download the latest
162+
<code>.dmg</code> to update until Developer ID signing lands.
163+
</p>
164+
<div class="cta-row">
165+
<a class="btn btn-primary" href="https://github.com/pmaxhogan/driven/releases">
166+
Go to Releases
167+
</a>
168+
</div>
169+
</div>
170+
</section>
171+
172+
<section id="privacy" class="section" aria-labelledby="privacy-heading">
173+
<div class="wrap">
174+
<h2 id="privacy-heading" class="section-title">Bring your own keys</h2>
175+
<p class="section-lead">
176+
Driven uses YOUR own Google OAuth client credentials and backs up to a
177+
Google Drive YOU own - not a shared, app-wide cloud account. You stay in
178+
control of your Google project, and there is no shared rate-limit or
179+
verification bottleneck.
180+
</p>
181+
<p class="section-lead">
182+
The OAuth flow uses PKCE on a loopback redirect, so your client secret
183+
never leaves your machine, and refresh tokens are stored only in the OS
184+
keychain. With per-source encryption enabled, your files are encrypted
185+
locally before upload, so the data at rest in Drive is ciphertext only.
186+
</p>
187+
</div>
188+
</section>
189+
</main>
190+
191+
<footer class="site-footer">
192+
<div class="wrap footer-inner">
193+
<p class="footer-brand">
194+
<img class="brand-mark" src="icon.svg" width="24" height="24" alt="">
195+
Driven
196+
</p>
197+
<nav class="footer-nav" aria-label="Footer">
198+
<a href="https://github.com/pmaxhogan/driven">GitHub</a>
199+
<a href="https://github.com/pmaxhogan/driven/releases">Releases</a>
200+
<a href="https://github.com/pmaxhogan/driven/blob/main/LICENSE">License (MIT or Apache-2.0)</a>
201+
</nav>
202+
</div>
203+
</footer>
204+
</body>
205+
</html>

0 commit comments

Comments
 (0)