Merge pull request #24 from runbear-io/feat/gtm-readiness

GTM readiness: reviewer-scored launch prep (6 rounds → 9/8/9/9/8/9 ×2)
This commit is contained in:
Snow W. Lee (Sungwon)
2026-07-15 15:58:11 -07:00
committed by GitHub
25 changed files with 841 additions and 139 deletions
+14 -4
View File
@@ -1,14 +1,24 @@
{
"name": "beardrive",
"owner": { "name": "runbear", "email": "snow@runbear.io" },
"description": "BearDrive (beardrive) — a synced file system for AI agents",
"owner": {
"name": "runbear",
"email": "snow@runbear.io"
},
"description": "BearDrive — the open-source Google Drive for AI agents: one folder your team and their agents share, with per-change attribution and read analytics.",
"plugins": [
{
"name": "beardrive",
"source": "./plugin",
"description": "BearDrive: folders that stay in sync across your team and agents through a BearDrive server (or S3/GCS directly). Installs the beardrive skill, /beardrive:install, /beardrive:init and /beardrive:status commands, and turn-boundary sync hooks in one step.",
"description": "BearDrive: folders that stay in sync across your team and agents through a self-hostable BearDrive hub, with per-file history and public share links. Installs the beardrive skill, /beardrive:install, /beardrive:init and /beardrive:status commands, and turn-boundary sync hooks in one step.",
"category": "workflow",
"tags": ["sync", "files", "workspace", "s3", "gcs", "agents"]
"tags": [
"sync",
"files",
"workspace",
"agents",
"memory",
"claude-code"
]
}
]
}
+47
View File
@@ -0,0 +1,47 @@
name: Bug report
description: Something misbehaved — a sync, the CLI, the hub, or the web UI
labels: [bug]
body:
- type: input
id: version
attributes:
label: bdrive version
description: Output of `bdrive version`
placeholder: beardrive v0.7.0
validations:
required: true
- type: input
id: os
attributes:
label: OS / platform
placeholder: macOS 15.2 (arm64) / Ubuntu 24.04
validations:
required: true
- type: dropdown
id: mode
attributes:
label: Where does it happen?
options:
- Syncing client (bdrive CLI / daemon)
- Self-hosted hub (bdrive web)
- Web UI in the browser
- Claude Code plugin / agent hooks
- Not sure
validations:
required: true
- type: textarea
id: repro
attributes:
label: What happened, and how do we reproduce it?
description: |
Steps, expected vs actual. For sync issues, `bdrive status` and
`bdrive log -n 20` output help a lot. Never paste tokens or the
contents of settings.json.
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs (optional)
description: Daemon log lives at `~/.bdrive/volumes/<mount-id>/daemon.log`.
render: text
@@ -0,0 +1,27 @@
name: Feature request
description: An idea for BearDrive — check ROADMAP.md first, it might already be planned
labels: [enhancement]
body:
- type: textarea
id: problem
attributes:
label: What are you trying to do?
description: The workflow or problem, not just the feature — context makes better designs.
validations:
required: true
- type: textarea
id: proposal
attributes:
label: What would you like BearDrive to do?
validations:
required: true
- type: dropdown
id: area
attributes:
label: Area
options:
- Sync engine / CLI
- Hub / web UI
- Agent integration (hooks, plugin, skills)
- Sharing / permissions
- Other
+10
View File
@@ -0,0 +1,10 @@
## What & why
<!-- One paragraph: what changes, and the problem it solves. -->
## Checklist
- [ ] `go build ./... && go vet ./... && go test ./...` green
- [ ] Sync behavior changes have a multi-device test in `internal/syncer`
- [ ] Frontend changes: `npm run build` re-committed `internal/webapp/static` and `npm run e2e` is green
- [ ] CLI behavior changes updated both `README.md` and `plugin/skills/beardrive/SKILL.md`
+69
View File
@@ -0,0 +1,69 @@
# Changelog
Notable changes per release. Format loosely follows
[Keep a Changelog](https://keepachangelog.com/); BearDrive is pre-1.0, so
minor versions may ship breaking changes (see [SemVer §4](https://semver.org/#spec-item-4)).
## v0.7.0 — 2026-07-14
- **`bdrive url <file>`** — internal, permission-walled links (sign-in +
project membership required) that agents share when they create files;
the plugin now teaches agents to include the link in their reply.
- Mobile layout overhaul: responsive chrome now covers tablet and phone
landscape, 44px touch targets throughout, five designer-review rounds.
- Read-heat hooks re-registered on upgrade pick up broader matchers.
## v0.6.0 — 2026-07-13
- **Web UI rewritten in React + TypeScript** (same URLs, same design):
committed build output keeps `go build`/`go install` Node-free.
- **Read-heat coverage fix**: agent reads via shell commands (`cat`,
`grep`, `tail`) and Grep matches now count, not just native file reads;
`bdrive hooks install` upgrades existing hook matchers in place.
- Content-hashed assets served immutable; committed e2e harness +
42-spec Playwright suite.
## v0.5.0 — 2026-07-12
- **Project home page**: connect-an-agent guide (Claude Code & Cowork
plugin flow, Hermes/Codex CLI) with real hub URL + project id filled
in; Insights embedded for admins/org owners.
- Two-file AGENTS.md orientation for shared folders in the plugin flows.
- Expandable history notes; RESTful `/insights` and `/history` routes.
## v0.4.0 — 2026-07-12
- **Read heat / Insights**: per-file read telemetry (human vs agent vs
share), heat dots in listings, and the Insights dashboard — treemap,
reads×staleness scatter with the hot-but-stale danger quadrant, hot
path, per-agent coverage matrix.
- **Agent read reporting**: `bdrive read-log` + hooks spool agent file
reads locally and report on next sync.
## v0.3.1 — 2026-07-10
- Parallel blob upload + progress bar for large initial imports.
## v0.3.0 — 2026-07-10
- **Hub-only architecture**: clients sync exclusively through a
`bdrive web` hub over HTTPS (the `remote` command and direct
client-to-bucket sync were removed); `bdrive logout` added.
- **SQL metadata backends**: hub accounts/projects/orgs/shares can live
in SQLite or Postgres (incl. Supabase) instead of JSON files.
- Dockerfile + Cloud Run deployment recipe.
## v0.2.2 — 2026-07-08
- **BearDrive**: the project (formerly `sfs`) got its name; CLI became
`bdrive`.
- Multi-project sync hub with accounts and orgs; interactive
`bdrive init` / browser `bdrive login` onboarding; public share links;
web viewer folded into the CLI as `bdrive web`; per-file history in
the web UI; `/beardrive:install` team onboarding for Claude Code.
## v0.1.0 — 2026-06-12
- First release: per-device append-only journals, last-writer-wins
replay, content-addressed blobs, offline-first sync through S3/GCS/
file remotes, conflict copies, daemon with turn-boundary agent hooks.
+65
View File
@@ -0,0 +1,65 @@
# Contributing to BearDrive
Thanks for wanting to help. BearDrive is early (pre-1.0) and moving fast —
small, focused PRs land quickest, and an issue or discussion before a big
change saves everyone time.
## Build & test
```sh
go build ./... # everything, no CGO, no Node needed
go vet ./...
go test ./... # full suite
go test ./internal/syncer -run TestConflict -v # one test
```
Set `BDRIVE_HOME=/some/tmp/dir` when testing the CLI by hand so you never
touch your real `~/.bdrive`.
## Run a local hub
```sh
go build -o bdrive ./cmd/bdrive
mkdir -p /tmp/hub-storage
./bdrive web /tmp/hub-storage --addr :8080 --upload # plain-folder viewer
```
For hub mode with accounts, see the self-hosting guide
([docs/self-hosting.md](docs/self-hosting.md)). The e2e test harness
(`BDRIVE_E2E_SERVE=1 go test -run TestE2EServe ./internal/webapp`) starts a
seeded hub on :8993 with test accounts — handy for frontend work.
## The rules that matter here
- **Sync changes need multi-device tests.** The real coverage lives in
`internal/syncer/syncer_test.go`: simulated devices syncing through a
shared remote, driven cycle by cycle. A new sync behavior without a
multi-device test is untested where it matters.
- **Never break sync.** Errors degrade to offline and retry next cycle;
a cycle must not fail because a side feature (telemetry, hooks) did.
Read the invariants section in [CLAUDE.md](CLAUDE.md) before touching
`internal/syncer`, `internal/journal`, or `internal/store` — replay
determinism and journal ownership are the whole concurrency story.
- **Frontend changes rebuild the committed assets.** The web UI lives in
`internal/webapp/frontend` (React + TS, Vite); its build output is
committed at `internal/webapp/static` so `go build` needs no Node.
After changing `frontend/src`: `npm run build`, commit the new
`static/`, and keep `npm run e2e` green. `frontend/check-dist.sh`
verifies freshness.
- **Docs travel with behavior.** Changing CLI commands, flags, or output
means updating both `README.md` and `plugin/skills/beardrive/SKILL.md`
— the skill is what makes agents beardrive-aware and must match the
binary.
## Where to start
[ROADMAP.md](ROADMAP.md) marks items we'd love help with, and issues
labeled `good first issue` / `help wanted` are curated to be approachable.
Bug reports with a reproduction (the issue form asks for `bdrive version`,
OS, and hub vs plain-folder mode) are gold.
## Conduct
Be kind, be direct, assume good intent. Maintainers reserve the right to
moderate. Security issues: email snow@runbear.io rather than opening a
public issue.
+58 -88
View File
@@ -7,25 +7,38 @@ everything keeps working offline. The CLI is `bdrive`; a hub is a
`bdrive web` server you (or we) run on an object store — clients sync
through it over HTTPS and never touch the storage directly.
Two things it's for: **sharing files with people** — any synced file
becomes a public URL that renders as a page — and **sharing context across
AI agents**: give every agent on the team the same folder as memory, and
your agent knows what their agent knows. Notes, plans, findings, and
artifacts follow the team everywhere, with a full audit trail of which
agent or human changed what.
What it's for, first and foremost: **sharing context across AI agents**
give every agent on the team the same folder as memory, and your agent
knows what their agent knows. (People are covered too: any synced file
becomes a public URL that renders as a page.) Notes, plans, findings, and
artifacts follow the team everywhere — and unlike a memory API, they stay
**real files with provenance**: every change is attributed to the human,
agent, and device that made it, and the hub's Insights show what your
agents actually read (and which hot-but-stale docs nobody maintains).
<p align="center">
<img src="docs/assets/insights.png" alt="Knowledge Insights — every file plotted by agent/human reads vs staleness; hot-but-stale docs are the danger zone" width="820">
</p>
| Browse with read heat | Public share pages |
|---|---|
| ![Folder listing with per-file agent read counts and change feed](docs/assets/browse.png) | ![A shared markdown file rendered as a public page](docs/assets/share.png) |
```console
$ bdrive login # once per device (browser sign-in)
$ bdrive login https://your-hub # once per device — self-host a hub in ~10 min (docs/self-hosting.md)
$ cd ~/workspace && bdrive init
initialized /Users/snow/workspace
project: workspace (p-7f3a2c91)
daemon: running (pid 55434, scan 3s, remote sync 10s)
```
> BearDrive Cloud — zero-setup, bare `bdrive login` — is on the waitlist
> at [beardrive.ai](https://beardrive.ai). Self-host to try it today.
On another machine:
```console
$ bdrive login && cd ~/workspace && bdrive init
$ bdrive login https://your-hub && cd ~/workspace && bdrive init
# … connect the same project; the files appear and stay in sync
```
@@ -72,9 +85,11 @@ go install github.com/runbear-io/beardrive/cmd/bdrive@latest
## Quick start
```sh
# 1. Sign this device in (once). Default server: beardrive.ai;
# self-hosters pass their own URL.
bdrive login
# 1. Sign this device in against your hub (once per device).
# Self-host a hub in ~10 minutes (docs/self-hosting.md), then:
bdrive login https://your-hub
# (BearDrive Cloud — zero-setup, bare `bdrive login` — is coming;
# join the waitlist at beardrive.ai. Self-host to try it today.)
# 2. Start syncing a project — interactive: create or connect a project,
# sync the whole folder or just ./shared. Re-run any time to resume.
@@ -83,7 +98,7 @@ cd ~/my-project && bdrive init
# 3. Work normally — create, edit, delete files with any tool.
echo "remember this" > memory.md
# On every other device: bdrive login once, then bdrive init in a folder
# On every other device: `bdrive login https://your-hub` once, then bdrive init in a folder
# and connect the same project.
# See what changed, who changed it, and from which device
@@ -103,7 +118,10 @@ exactly where it left off — zero re-scan, zero spurious changes.
### Credentials
beardrive uses each provider's standard credential chain — nothing beardrive-specific:
beardrive uses each provider's standard credential chain — nothing beardrive-specific.
Note: **client devices always use an `https://` hub remote** — the
`s3`/`gs`/`file` rows below are how the *hub operator* configures the
hub's own storage, never something a syncing client points at directly:
| Remote | Credentials |
|---|---|
@@ -116,7 +134,7 @@ beardrive uses each provider's standard credential chain — nothing beardrive-s
| Command | Description |
|---|---|
| `bdrive login [server-url]` | Sign this device in (browser flow; `--device` for headless; default server beardrive.ai). Switch hubs with `bdrive login <new-url>` |
| `bdrive login [server-url]` | Sign this device in (browser flow; `--device` for headless; default server beardrive.ai — the managed cloud, waitlist-only: pass your hub URL). Switch hubs with `bdrive login <new-url>` |
| `bdrive logout` | Sign this device out — clear the saved token/account (`--forget` also drops the remembered server) |
| `bdrive init [folder]` | Create/connect a project and start syncing — interactive on a TTY, flags (`--name/--project/--shared/--yes`) for scripts; re-run to resume |
| `bdrive stop [folder]` | Stop syncing (files stay; `bdrive init` resumes) |
@@ -241,7 +259,8 @@ cd ~/some-project && bdrive init # once per project
```
`bdrive login` signs the device in and remembers the server (`settings.json`
under the bdrive home; bare `bdrive login` defaults to beardrive.ai —
under the bdrive home; bare `bdrive login` defaults to beardrive.ai — the
managed cloud, currently waitlist-only, so pass your hub's URL —
`--status` shows the current server and account). To move to a **different
hub**, run `bdrive login <new-url>` and then re-run `bdrive init` in each
folder to connect it to a project there; `bdrive logout` signs out entirely.
@@ -347,77 +366,18 @@ distinct-reader counts, and last-read times — never who read what;
`?by=device` adds the agent-only per-device folder breakdown (device
identity is already public via history; human emails never appear).
### Authentication
### Authentication & database
Hubs always require sign-in — every change is attributed to a real account.
The whole API — web UI, uploads, project creation, device sync — needs a
session; only `/api/config` and the auth pages stay open (the plain-folder
viewer, `bdrive web ./folder`, remains auth-free). Accounts are
email + password + name, kept in a file-backed registry (`auth.json`:
bcrypt password hashes and SHA-256 token digests, atomically rewritten —
no plaintext credentials ever touch disk).
Hubs always require sign-in — every change is attributed to a real
account. **Signup is invite-only by default** (the safe posture for a
public URL); self-service signup opens only with a gate (admin approval,
or allowed domains + email verification). Hub metadata (accounts,
projects, orgs, shares) lives in a file-backed store by default, or
SQLite/Postgres (incl. Supabase) via the `database` config block.
**Signup is invite-only by default** — the safe posture for a hub on a
public URL. New people get in only through an expiring invite link an owner
mints; the link lets them create an account (bypassing the gates below) and
join, in one step. To allow self-service signup instead, set
`"allow_signup": true` **with a gate** — the server refuses to start an open
hub that has none, so a fake email can never just walk in. Three postures:
Full reference — the three signup postures, SMTP, admins, CLI device
sign-in, and database selection: **[docs/self-hosting.md](docs/self-hosting.md)**.
- **Invite-only** (default): `allow_signup` unset/false. Only invite links create accounts.
- **Approval-gated**: `allow_signup: true` + `require_approval: true` — anyone can sign up, but a hub admin approves each new account before it works (no SMTP needed).
- **Domain-restricted + verified**: `allow_signup: true` + `allowed_domains: ["you.com"]` + `require_verification: true` (needs `smtp`) — only your company's addresses may sign up, each confirming an emailed link. Verification without SMTP is refused (the link would otherwise only reach the server log).
Admins tune verification/approval live from the web UI (**Admin → Signup &
access**); `allowed_domains`, the admin list, and `allow_signup` are
server-config-owned so a browser session can never widen who gets in.
`bdrive login <url>` on a client device opens the server's sign-in page in
a browser (sign up right there if needed); when the user signs in, the
page bounces a one-time code to the CLI's loopback listener and the
terminal finishes on its own, storing a long-lived per-device token
(revocable server-side). On headless/SSH machines, `bdrive login --device`
prints a short code to approve from any signed-in browser instead. Every
sync and every `bdrive init` then authenticates with that token.
"Forgot password" emails a one-hour reset link via the `auth.smtp` block —
plain SMTP, so any provider works. With no SMTP configured, the link is
printed to the server log so an admin can hand it over; reset is never
fully broken.
Two notes: put a hub behind TLS (reverse proxy
or tailscale) — `bdrive login` warns when signing in over plain http to a
non-localhost address. Internally all of this sits behind an
`AuthProvider` interface; the open-source server ships the built-in
email/password provider, and alternative identity backends can be swapped
in without touching the CLI or the API.
### Choosing a database
A hub keeps a little **metadata** — accounts, projects, orgs, invites,
shares, devices — separate from your files. (File content and the sync
journals always live in the object store; the database never holds them.)
You choose where that metadata lives with the `database` block:
```jsonc
"database": { "driver": "file" } // default — JSON under BDRIVE_HOME
"database": { "driver": "sqlite", "dsn": "/var/lib/bdrive/hub.db" }
"database": { "driver": "postgres", "dsn": "postgres://…@…pooler.supabase.com:6543/postgres" }
```
- **file** (default): zero dependencies, human-readable JSON, perfect for a
laptop or a small self-hosted hub.
- **sqlite**: one embedded database file — a real DB locally with no server
to run.
- **postgres**: a managed Postgres such as **Supabase** for production —
just point `dsn` at its connection string (use the transaction pooler for
many connections). Since Supabase *is* Postgres, this stays fully
open-source with no managed-only lock-in.
`file` and `sqlite` are single-writer (run one hub instance); Postgres is
transactional and can back more than one instance. Switching backends
doesn't migrate existing data — pick one when you set the hub up. Both SQL
drivers are pure Go, so the binary stays a CGO-free static build.
### Uploads
@@ -507,14 +467,19 @@ deletes for it), and anything excluded by `.bdriveignore` or omitted from an
## Roadmap
- `beardrive restore <path>@<time>` — restore any file from history (all content
is already retained)
- FUSE/NFS mount mode for lazy-loading huge volumes
- Journal compaction & blob GC policies
- Per-path access scopes for multi-agent setups
See [ROADMAP.md](ROADMAP.md) — the public, dated roadmap, including the
items we'd love help with. Highlights: `beardrive restore <path>@<time>`
(time travel — all content is already retained), FUSE/NFS mount mode,
journal compaction & blob GC, per-path access scopes for multi-agent
setups.
## Development
Contributions welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for the
build/test workflow and the rules that matter, [ROADMAP.md](ROADMAP.md)
for where help is wanted, and [CHANGELOG.md](CHANGELOG.md) for what
shipped when. Self-hosting a hub: [docs/self-hosting.md](docs/self-hosting.md).
```sh
go build ./...
go test ./...
@@ -548,6 +513,11 @@ npm run e2e # Playwright suite; starts its own seeded hub on :8993
GNU AGPL-3.0 — Copyright 2026 Runbear, Inc. See [LICENSE](LICENSE).
We chose AGPL-3.0 deliberately: it keeps BearDrive fully open and
self-hostable forever while preventing a cloud provider from offering a
closed BearDrive-as-a-service. The managed service at beardrive.ai funds
the project; the code stays open.
Everything in this repo is open source and self-hostable: a complete BearDrive
server for one organization's deployment, teams included. The managed service
at beardrive.ai is the same core plus what only makes sense as an operated
+38
View File
@@ -0,0 +1,38 @@
# BearDrive roadmap
Last updated: 2026-07-15. This is the direction, not a contract — items
move as we learn. Comments and PRs welcome; items marked **help wanted**
are deliberately scoped for outside contributors.
## Now (next release or two)
- **Time travel / restore**`bdrive restore <path>@<time>`: every blob
is already retained forever, so restore is re-putting an old blob as a
new op. The history UI and blob API already exist; this is the CLI and
revert UX.
- **Demo assets & docs** — 60-second demo, richer self-hosting guide.
## Next
- **Journal compaction & blob GC policies** — bounded storage for
long-lived, high-churn volumes (opt-in; today everything is retained).
- **Per-path access scopes** — multi-agent setups where an agent can be
limited to a subtree of a project. **help wanted** (design discussion
first — this touches the org/permission model).
- **More agent platforms in `bdrive hooks install`** — the hook engine is
platform-generic; adding a platform is a small adapter + matcher set.
**help wanted**.
## Later / exploring
- **FUSE / NFS mount mode** — lazy-loading huge volumes instead of full
materialization.
- **Search across the hub** — full-text + wikilink graph over a project.
- **Webhooks / notifications** — "a file changed in `reports/`" pushed to
Slack or similar (hub-side).
## Recently shipped
See [CHANGELOG.md](CHANGELOG.md): React web UI (v0.6.0), read-heat
Insights and agent read attribution (v0.4.0), `bdrive url` internal links
(v0.7.0), SQL metadata backends incl. Postgres/Supabase (v0.3.0).
Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

+81
View File
@@ -0,0 +1,81 @@
# GTM handoff — actions only Snow can take
Everything the GTM loop cannot do from inside the repo, prioritized.
Draft copy is ready to paste; adjust voice as you like.
## P0 — do before anything else (minutes each)
1. **Enable GitHub Discussions** on runbear-io/beardrive (Settings →
Features). Then add categories: Announcements, Q&A, Ideas, Show &
tell. CONTRIBUTING.md already links "where to ask" there.
2. **Set GitHub repo topics**: `ai-agents`, `claude-code`, `file-sync`,
`sync`, `agent-memory`, `self-hosted`, `golang`, `agpl`. (Repo →
About → gear.)
3. **Set the repo social-preview image** (Settings → Social preview):
use `docs/assets/insights.png` for now — it's the most striking
frame; replace with a branded card later.
4. **Repo About blurb** → paste:
> The open-source Google Drive for AI agents: one folder your team
> and their agents share — synced in seconds, every change
> attributed, with read analytics. Self-host in one Go binary.
Website field: `https://beardrive.ai`.
5. **Verify the install path from a clean machine** (the #1 CTA must
not 404 on launch day): `brew install runbear-io/tap/beardrive &&
bdrive version`, and `go install
github.com/runbear-io/beardrive/cmd/bdrive@latest`. If the tap is
stale, cut a fresh `goreleaser release` first.
6. **Verify the full first run, not just the binary**: on a clean
machine, `bdrive login <a working hub> && bdrive init && edit a file
&& bdrive log` must succeed end to end. Until BearDrive Cloud is
live, every try-path (README, website, launch posts) must route
people to self-hosting — bare `bdrive login` defaults to
beardrive.ai and MUST NOT be advertised until that hub actually
accepts logins. Gate any launch on this check.
7. **Seed 35 `good first issue` / `help wanted` issues** from
ROADMAP.md (more agent platforms in `bdrive hooks install`; per-path
access scopes design discussion; demo assets; docs gaps) —
CONTRIBUTING.md promises curated starter issues; make it true.
## P1 — demo assets (an hour)
8. **Record a 4560s demo GIF/video** for the README hero and any
launch post. Script (uses two terminals + a browser):
- T1: `bdrive init --name demo --yes` in a folder with a few notes →
show `bdrive status` (daemon running).
- T1: have Claude Code write `wiki/findings.md` (or just edit it) →
within seconds…
- T2 (second machine/dir): the file appears; `bdrive log -n 3` shows
the change attributed to the agent session.
- Browser: the hub's History view for that file, then Insights.
- T1: `bdrive share wiki/findings.md` → open the public URL.
Tools: `vhs` (charmbracelet) or QuickTime + gifski. Put the result at
`docs/assets/demo.gif` and add it above the fold in README.
9. **Verify beardrive.ai serves the updated landing page** (the repo's
`website/` — including the new `assets/insights.png`) after the next
deploy.
## P2 — when you're ready to be seen (launch window)
10. **Show HN post** — full drafts in [launch-plan.md](launch-plan.md):
title, body, and the first-comment founder note. Post from your
account; be present for the first 3 hours to answer everything.
11. **Product Hunt** — drafts in launch-plan.md. Schedule after HN, not
the same day. Before PH: replace the mailto waitlist on the site
with a real form (any hosted waitlist works) — email-composer
friction kills launch-day conversion.
12. **Claude Code plugin discoverability** — submit/announce the
marketplace entry wherever Anthropic surfaces community plugins
(Discord, awesome-lists PRs from your account).
## P3 — measurement plumbing (see metrics.md)
13. **Turn on GitHub traffic watching**: stars/clones/views are under
Insights → Traffic; consider a weekly note of the numbers in
Discussions → Announcements.
14. **Homebrew install counts**: `brew info --analytics
runbear-io/tap/beardrive` (public analytics take ~30 days to
appear).
15. **Decide on hub-side opt-in telemetry** (proposal in metrics.md —
requires your explicit approval before any implementation; nothing
is wired today).
+86
View File
@@ -0,0 +1,86 @@
# Spec: GTM readiness for BearDrive (reviewer-satisfied goal loop)
Authoritative spec for the GTM improvement loop. The bar is met by
independent review: a `beardrive-gtm` subagent (COSS operator persona)
audits the repo's go-to-market surfaces and scores them; the implementing
agent never scores its own work.
## Scope — what the loop may change
Everything GTM-relevant that lives in this repo:
- `README.md` (positioning, quickstart, time-to-wow, demo assets plan)
- `website/` (headline, category claim, CTAs, pricing posture copy)
- `docs/` (self-host guide, quickstart, a launch plan, a metrics plan)
- Community surface: `CONTRIBUTING.md`, `.github/` issue/PR templates,
`CHANGELOG.md` or release-notes convention, a public `ROADMAP.md`
- `plugin/` copy where it is a funnel surface (install flow wording)
- The open↔paid line as *explanation* (docs/website copy about what OSS
ships vs what beardrive.ai adds)
## Hard guardrails (violating any = the round is void)
1. **Truth only.** Never fabricate social proof: no invented testimonials,
logos, user counts, star counts, or benchmarks. Every product claim
must be verifiable against the code/docs. Aspirations are labeled as
roadmap, not shipped features.
2. **No license change, no pricing decisions.** Pricing/packaging content
is written as clearly-labeled *proposal* for Snow to approve, not
published as fact.
3. **No external actions.** No posting, publishing, account creation,
emailing, or launching anywhere. Anything requiring action outside the
repo goes to `docs/gtm-handoff.md` — a prioritized checklist for Snow
(e.g. "post X to HN with this title", "enable GitHub Discussions",
"record 45s demo of Y") with ready-to-use draft copy where applicable.
4. Keep README ↔ SKILL.md ↔ CLAUDE.md consistent when CLI behavior is
described; never commit `internal/webapp/manual_serve_test.go`;
`go build ./... && go test ./...` stays green if anything code-adjacent
is touched; frontend changes rebuild committed static.
5. Branch `feat/gtm-readiness`, commit per round, PR at the end; never
merge or deploy.
## Review protocol (per round)
Launch a `beardrive-gtm` subagent. It must score the six dimensions from
its charter (positioning, funnel, open-vs-paid line, community readiness,
launch readiness, metrics) 010 **on repo-controllable readiness**: "has
everything within this repo's power been done for this dimension?" —
external-world gaps (no stars yet, no community yet) do NOT cap the score
if the corresponding handoff items exist and are well-prepared. It returns
findings tagged blocker / major / minor, each marked REPO-FIXABLE or
HANDOFF, with concrete fixes (replacement copy written out).
The implementing agent fixes every repo-fixable blocker/major (and minors
where cheap), routes handoff items into `docs/gtm-handoff.md`, and records
the round in the Scorecard below.
## Exit bar
Two CONSECUTIVE review rounds where every dimension scores ≥ 8 and there
are zero repo-fixable blocker or major findings. Disagreements: the
reviewer's judgment wins unless it violates a guardrail (e.g. demands
fabricated proof) — record such rejections under Won't-fix with reasons.
## Scorecard (append one row per round)
| Round | positioning | funnel | open-paid | community | launch | metrics | repo-fixable blockers/majors |
|---|---|---|---|---|---|---|---|
| 1 (baseline) | 6 | 4 | 8 | 3 | 3 | 2 | 3 blockers, 3 majors (all fixed this round; screenshots captured from the live demo hub — real UI, not fabricated) |
| 2 | 8 | 7 | 9 | 8 | 8 | 8 | 1 major (residual dead-deployment-mode copy ×3 on the site — fixed) + 4 minors fixed; share.png re-captured with real rendered content |
| 3 | 9 | 7 | 9 | 8 | 7 | 9 | 1 major (quickstart defaulted into the not-yet-live beardrive.ai — quickstart/closer rewritten to self-host-first, first-run gate added to handoff) + README trimmed 583→524, starter-issues & waitlist handoffs added |
| 4 | 9 | 6 | 9 | 9 | 7 | 9 | 2 majors: bare-login default survived in the README HERO and both plugin commands (+ SKILL walkthrough, website terminal animation) — all four surfaces now self-host-first, fixed this round |
| 5 | 9 | 8 | 9 | 9 | 8 | 9 | 0 — PASS #1 (two optional one-line minors applied after the round) |
| 6 (confirmation) | 9 | 8 | 9 | 9 | 8 | 9 | 0 — PASS #2, EXIT BAR MET (truth-verified against code; two optional minors — og:image, SKILL parity — applied post-exit) |
## Won't-fix / disputed
(none yet)
## Status
GOAL COMPLETE (2026-07-15): rounds 5 and 6 both scored every dimension
≥8 with zero repo-fixable blocker/major findings. Six reviewer rounds
total. The loop's own copy was audited for truth-overreach each round —
rounds 3 and 4 caught the loop routing strangers into the not-yet-live
cloud, which is exactly what independent review is for. Remaining work
is Snow's external checklist: docs/gtm-handoff.md (P0 first).
+72
View File
@@ -0,0 +1,72 @@
# Launch plan (drafts — nothing here is posted; posting is Snow's call)
Stage-1 launch: the goal is strangers who care — stars, issues, first
outside users — not signups or revenue. Sequence: quiet HN → learnings →
Product Hunt → Launch-Week-style feature cadence as Cloud approaches.
## Show HN (primary)
**Title (pick one):**
1. `Show HN: BearDrive open-source Google Drive for AI agents`
2. `Show HN: A shared folder where your team's AI agents read and write — with attribution`
3. `Show HN: BearDrive give every agent on your team the same folder as memory`
**Body draft:**
> BearDrive mounts any folder as a synced volume for a team *and their
> AI agents*: files sync through a self-hostable hub in seconds, every
> change is attributed to the human/agent/device that made it, and the
> hub shows what your agents actually read.
>
> Why we built it: our agents kept re-deriving context that a teammate's
> agent had already figured out. Memory APIs felt wrong — we wanted
> real files on disk (agents are great at files), with provenance. So:
> append-only per-device journals, last-writer-wins replay,
> content-addressed blobs (all history retained), offline-first, one Go
> binary for CLI + daemon + hub. AGPL; a managed cloud will fund it.
>
> The part we like most: read telemetry. Agent hooks report which files
> agents consume, so the Insights view shows "hot but stale" knowledge —
> docs everyone's agents rely on that no one maintains.
>
> Happy to answer anything about the sync design (no locks — no object
> ever has two writers), the AGPL choice, or the agent hooks.
**First-comment (founder voice) draft:** technical deep-dive offer —
"the whole concurrency story is that no object has two writers: each
device appends to its own journal; replay is deterministic," + link to
CLAUDE.md's invariants. Answer every comment for the first 3 hours.
**Prep checklist:** install path verified from a clean machine
(`brew install runbear-io/tap/beardrive && bdrive version` — a 404 tap on
launch day is fatal), full first-run verified against a working hub (handoff #6), demo GIF live in README (handoff #8), Discussions
enabled, `docs/self-hosting.md` linked from README, hub demo instance
warm (expect self-host attempts within minutes).
## Product Hunt (after HN, separate day)
- **Tagline:** "The open-source Google Drive for AI agents"
- **Description:** One folder your whole team and their agents share —
synced in seconds, every change attributed, read analytics included.
Self-host in one Go binary, or join the cloud waitlist.
- **First comment:** the HN body, warmer tone, plus the 60s demo video.
## Launch-Week cadence (when Cloud nears — one artifact/day)
1. **Sync core** — the journal/replay design post ("no locks, no two
writers").
2. **Attribution & history** — every change knows who/what/where; time
travel is already free (blobs retained).
3. **Share links** — files as public pages; sandboxed HTML.
4. **Insights** — the read×staleness quadrant; what agents actually
read.
5. **The Claude Code plugin**`/beardrive:install`, two-file AGENTS.md
orientation, `bdrive url` links in agent replies.
Each day: a blog-able writeup + a tweet-length version + a repo artifact
(doc or demo). Drafts to be written per-day when scheduled.
## Not part of launch
Pricing (Cloud is waitlist-only), enterprise pages, paid promotion, and
any claim of traction we don't have.
+41
View File
@@ -0,0 +1,41 @@
# Metrics plan
What we measure to know whether BearDrive is working as a project and a
product. Stage-aware: today (a16z stage 1, project-community fit) the
numbers that matter are attention and activation, not revenue.
## North star
> **Active shared brains**: projects with ≥2 members where an agent both
> wrote and read a file in the last 7 days.
This is the promise — "your agent knows what their agent knows" —
actually happening: multiple people, agents on both sides of the sync,
within a week. Everything else is upstream of it.
## Funnel metrics (in order)
| # | Metric | Source | Stage |
|---|---|---|---|
| 1 | README/landing views → GitHub stars | GitHub Insights → Traffic (handoff #13) | attention |
| 2 | Installs: brew + `go install` | brew analytics (handoff #14); go proxy stats are noisy — treat as directional | acquisition |
| 3 | Activation: `bdrive init` → first successful sync | today: anecdotal/self-reported; future: opt-in telemetry (below) | activation |
| 4 | Team formation: project gains a 2nd member (invite redeemed) | hub data (self-hosted: invisible to us; beardrive.ai once live) | expansion |
| 5 | Wedge proof: first agent read-telemetry event in a project | hub read ledger (same visibility caveat) | wedge |
## What we can already see without any new code
- GitHub: stars, forks, issues, Discussions activity, traffic.
- Homebrew analytics (public, aggregated).
- beardrive.ai hub metrics once Cloud is live: metrics 35 fall out of
data the hub already stores (device registry, org invites, read
ledger) — measurement is a query, not instrumentation.
## Proposal (not implemented — needs Snow's approval)
Opt-in, anonymous CLI telemetry (a single `bdrive init` success ping with
version + OS, no paths, no identifiers beyond a random install id,
disabled by default with `BDRIVE_TELEMETRY=1` to enable). This is the
only way metric #3 becomes visible for self-hosted users. **Deliberately
a proposal**: shipping any telemetry, even opt-in, changes the trust
posture of an OSS tool and is Snow's call, not the GTM loop's.
+156
View File
@@ -0,0 +1,156 @@
# Self-hosting a BearDrive hub in ~10 minutes
Until BearDrive Cloud launches, self-hosting is *the* way to run a team
hub — and it stays a first-class, fully-supported path forever (AGPL, no
features held back). One static Go binary, one config file, any object
store (or a plain directory).
## 1. Install the binary
```sh
brew install runbear-io/tap/beardrive # macOS / Linuxbrew
# or: go install github.com/runbear-io/beardrive/cmd/bdrive@latest
# or: grab a release tarball — https://github.com/runbear-io/beardrive/releases
```
## 2. Pick storage
Any of: `s3://bucket/prefix`, `gs://bucket/prefix`, an S3-compatible
endpoint, or — simplest for a first run — a plain directory
(`file:///var/lib/bdrive/storage`). Files and change journals live
there; hub metadata (accounts, projects, orgs) lives in the database you
pick in step 3. Clients never see this storage — they sync through the
hub over HTTPS.
## 3. Write config.json
```jsonc
{
"remote": "file:///var/lib/bdrive/storage",
"addr": ":4173",
"upload": true,
"auth": {
// Signup is invite-only by default — the safe posture for a public
// URL. Your first account: start once with signup gated (or use an
// org invite), then invite teammates from the web UI.
"admins": ["you@example.com"],
"users_db": "/var/lib/bdrive/auth.json"
},
"reads": { "enabled": true }, // agent read analytics (Insights)
"database": { "driver": "sqlite", "dsn": "/var/lib/bdrive/hub.db" }
}
```
Full knob reference for auth and databases: the sections below;
share-link rate limits and upload TTLs: the
[README's web-server section](../README.md#web-server).
## 4. Run it
```sh
bdrive web -c config.json
```
Put TLS in front (Caddy/nginx/your platform's LB) — device tokens travel
as bearer tokens. For containers, the repo ships a `Dockerfile`
(distroless, CGO-free) with a Cloud Run recipe in [deploy/](../deploy/)
— any container platform works the same way.
## 5. First sign-in and first project
1. Open `https://your-hub/` → create your account (first run: use the
signup posture you configured; hub admins are the `admins` emails).
2. On any machine: `bdrive login https://your-hub` (browser flow), then
in the folder you want synced:
`bdrive init --name wiki --yes` — or `--shared docs` inside a repo to
sync only that subfolder.
3. Invite a teammate: sidebar footer → **Manage****New invite**
the join link both creates their account and adds them to your org.
4. Connect agents: the project's home page in the web UI shows
copy-paste setup for Claude Code/Cowork, Hermes, and Codex; or run
`bdrive hooks install` in the folder.
## Authentication reference
Hubs always require sign-in — every change is attributed to a real account.
The whole API — web UI, uploads, project creation, device sync — needs a
session; only `/api/config` and the auth pages stay open (the plain-folder
viewer, `bdrive web ./folder`, remains auth-free). Accounts are
email + password + name, kept in a file-backed registry (`auth.json`:
bcrypt password hashes and SHA-256 token digests, atomically rewritten —
no plaintext credentials ever touch disk).
**Signup is invite-only by default** — the safe posture for a hub on a
public URL. New people get in only through an expiring invite link an owner
mints; the link lets them create an account (bypassing the gates below) and
join, in one step. To allow self-service signup instead, set
`"allow_signup": true` **with a gate** — the server refuses to start an open
hub that has none, so a fake email can never just walk in. Three postures:
- **Invite-only** (default): `allow_signup` unset/false. Only invite links create accounts.
- **Approval-gated**: `allow_signup: true` + `require_approval: true` — anyone can sign up, but a hub admin approves each new account before it works (no SMTP needed).
- **Domain-restricted + verified**: `allow_signup: true` + `allowed_domains: ["you.com"]` + `require_verification: true` (needs `smtp`) — only your company's addresses may sign up, each confirming an emailed link. Verification without SMTP is refused (the link would otherwise only reach the server log).
Admins tune verification/approval live from the web UI (**Admin → Signup &
access**); `allowed_domains`, the admin list, and `allow_signup` are
server-config-owned so a browser session can never widen who gets in.
`bdrive login <url>` on a client device opens the server's sign-in page in
a browser (sign up right there if needed); when the user signs in, the
page bounces a one-time code to the CLI's loopback listener and the
terminal finishes on its own, storing a long-lived per-device token
(revocable server-side). On headless/SSH machines, `bdrive login --device`
prints a short code to approve from any signed-in browser instead. Every
sync and every `bdrive init` then authenticates with that token.
"Forgot password" emails a one-hour reset link via the `auth.smtp` block —
plain SMTP, so any provider works. With no SMTP configured, the link is
printed to the server log so an admin can hand it over; reset is never
fully broken.
Two notes: put a hub behind TLS (reverse proxy
or tailscale) — `bdrive login` warns when signing in over plain http to a
non-localhost address. Internally all of this sits behind an
`AuthProvider` interface; the open-source server ships the built-in
email/password provider, and alternative identity backends can be swapped
in without touching the CLI or the API.
## Choosing a database
A hub keeps a little **metadata** — accounts, projects, orgs, invites,
shares, devices — separate from your files. (File content and the sync
journals always live in the object store; the database never holds them.)
You choose where that metadata lives with the `database` block:
```jsonc
"database": { "driver": "file" } // default — JSON under BDRIVE_HOME
"database": { "driver": "sqlite", "dsn": "/var/lib/bdrive/hub.db" }
"database": { "driver": "postgres", "dsn": "postgres://…@…pooler.supabase.com:6543/postgres" }
```
- **file** (default): zero dependencies, human-readable JSON, perfect for a
laptop or a small self-hosted hub.
- **sqlite**: one embedded database file — a real DB locally with no server
to run.
- **postgres**: a managed Postgres such as **Supabase** for production —
just point `dsn` at its connection string (use the transaction pooler for
many connections). Since Supabase *is* Postgres, this stays fully
open-source with no managed-only lock-in.
`file` and `sqlite` are single-writer (run one hub instance); Postgres is
transactional and can back more than one instance. Switching backends
doesn't migrate existing data — pick one when you set the hub up. Both SQL
drivers are pure Go, so the binary stays a CGO-free static build.
## Upgrading
`brew upgrade beardrive` (clients and hub are the same binary — keep
them roughly in step; the sync protocol is append-only journals + blobs,
which old clients read forward). After upgrading a client, re-run
`bdrive hooks install` once per project to pick up any hook improvements.
## Backup
Everything irreplaceable is in two places: the storage root (blobs +
journals — files and their entire history) and the metadata database
(accounts/projects/orgs/shares). Snapshot both; restore is copy-back.
+13 -3
View File
@@ -1,11 +1,21 @@
{
"name": "beardrive",
"displayName": "BearDrive",
"description": "BearDrive: a synced file system for AI agents. Mount folders that stay in sync across devices through S3/GCS/any object store, with automatic sync at turn boundaries and full change history. CLI: bdrive.",
"description": "BearDrive — the open-source Google Drive for AI agents: mount folders that stay in sync across devices and teammates through a self-hostable BearDrive hub (backed by S3/GCS/any object store), with turn-boundary sync, per-change attribution, and full change history. CLI: bdrive.",
"version": "0.1.0",
"author": { "name": "runbear", "url": "https://github.com/runbear-io" },
"author": {
"name": "runbear",
"url": "https://github.com/runbear-io"
},
"homepage": "https://github.com/runbear-io/beardrive",
"repository": "https://github.com/runbear-io/beardrive",
"license": "AGPL-3.0-only",
"keywords": ["sync", "files", "workspace", "s3", "gcs", "memory", "agents"]
"keywords": [
"sync",
"files",
"workspace",
"memory",
"agents",
"claude-code"
]
}
+6 -4
View File
@@ -13,10 +13,12 @@ Follow these steps:
or `go install github.com/runbear-io/beardrive/cmd/bdrive@latest`) and
wait for the user's choice before installing.
2. **Sign in if needed**: run `bdrive login --status`. With no server or a
stale token, run `bdrive login` (tell the user a browser window is
coming; it completes by itself). Default server is beardrive.ai; pass a
self-hosted URL if the user mentioned one.
2. **Sign in if needed**: run `bdrive login --status`. With no valid
session, ask the user for their team's hub URL and run
`bdrive login https://their-hub` (tell the user a browser window is
coming; it completes by itself). Bare `bdrive login` targets BearDrive
Cloud, which is not open yet — only use it if the user says their team
is on the cloud beta.
3. **Detect knowledge tooling** (skip if the folder already contains
`.bdrive/` — then just run `bdrive init --yes`; it resumes syncing,
+7 -5
View File
@@ -15,11 +15,13 @@ If neither works, stop and tell the user how to install manually.
## 2. Sign in if needed
Run `bdrive login --status`. If there is no server or the token is invalid,
run `bdrive login` — it opens the user's browser to sign in (or sign up) and
completes by itself. Default server is beardrive.ai; if the user mentioned a
self-hosted server, pass its URL: `bdrive login https://their-server`.
Tell the user a browser window is coming before you run it.
Run `bdrive login --status`. If there is no valid session, sign in against
the team's hub: ask the user for their hub URL and run
`bdrive login https://their-hub` — it opens the browser to sign in (or
sign up) and completes by itself. (Bare `bdrive login` targets BearDrive
Cloud, which is not open yet — don't use it unless the user says their
team is on the cloud beta.) Tell the user a browser window is coming
before you run it.
## 3. Initialize the project
+6 -6
View File
@@ -1,9 +1,9 @@
---
name: beardrive
description: Use BearDrive — a synced file system for AI agents and teams. Start syncing any project folder (bdrive init) and it stays in sync across devices and teammates through a BearDrive hub, with accounts, per-file change history, public share links, and offline support. Use when the user wants to "set up beardrive", "sync this folder", "share this file by URL", "start/stop syncing", "connect to a beardrive server", "switch to a different hub", "check bdrive status", "see what changed", "who changed this file?", or troubleshoot a stuck sync.
description: Use BearDrive — the open-source Google Drive for AI agents and their teams. Start syncing any project folder (bdrive init) and it stays in sync across devices and teammates through a BearDrive hub, with accounts, per-file change history, public share links, and offline support. Use when the user wants to "set up beardrive", "sync this folder", "share this file by URL", "start/stop syncing", "connect to a beardrive server", "switch to a different hub", "check bdrive status", "see what changed", "who changed this file?", or troubleshoot a stuck sync.
---
# BearDrive — synced file system for AI agents
# BearDrive — Google Drive for AI agents
**BearDrive** (CLI: `bdrive`) turns any folder into a synced project: a background daemon per project scans for local changes and exchanges them with a **hub** (a `bdrive web` server). Files on disk are always real files — every tool, editor, and agent works on them with no integration.
@@ -13,7 +13,7 @@ Use this skill whenever the user is working with the `bdrive` CLI: initializing
| Action | Command |
|---|---|
| Start syncing a project (create/connect; the front door) | `bdrive init [<folder>]` — interactive on a TTY; flags `--name <x>` / `--project <id>` / `--shared <dir>` / `--yes` for scripts and agents (NEVER prompts without a TTY). Re-run to resume, including after the folder was renamed/moved. Runs `bdrive login` first if the device has no session. |
| Start syncing a project (create/connect; the front door) | `bdrive init [<folder>]` — interactive on a TTY; flags `--name <x>` / `--project <id>` / `--shared <dir>` / `--yes` for scripts and agents (NEVER prompts without a TTY). Re-run to resume, including after the folder was renamed/moved. Runs the login flow first (against your hub URL) if the device has no session. |
| Run the daemon in the foreground | `bdrive init -f` |
| Stop syncing | `bdrive stop [<folder>]` (`--forget` also unregisters) |
| One sync cycle now | `bdrive sync [<folder>]` |
@@ -22,7 +22,7 @@ Use this skill whenever the user is working with the `bdrive` CLI: initializing
| Mounts + daemon + pending state | `bdrive status [<folder>]` |
| Change history | `bdrive log [<folder>] [-p path] [-n N]` |
| This device's identity | `bdrive whoami` |
| Sign this device in (once per device) | `bdrive login [url]` — bare form uses the remembered server or beardrive.ai. Opens the sign-in page in a browser (sign-up available there); the terminal completes on its own and stores a per-device token. `--device` prints a code to approve from any browser (SSH/headless); `--status` shows server + account. Password reset: "Forgot password?" on the sign-in page (emailed via the server's SMTP config, or the link appears in the server log). **Switch hubs** with `bdrive login <new-url>`, then re-run `bdrive init` in each folder. |
| Sign this device in (once per device) | `bdrive login [url]` — bare form uses the remembered server or beardrive.ai — currently waitlist-only; pass your hub URL. Opens the sign-in page in a browser (sign-up available there); the terminal completes on its own and stores a per-device token. `--device` prints a code to approve from any browser (SSH/headless); `--status` shows server + account. Password reset: "Forgot password?" on the sign-in page (emailed via the server's SMTP config, or the link appears in the server log). **Switch hubs** with `bdrive login <new-url>`, then re-run `bdrive init` in each folder. |
| Sign this device out | `bdrive logout` — clears the saved token + account (folders untouched); `--forget` also drops the remembered server. The device token stays valid server-side until it expires — revoke it from the hub's device list to be sure. |
| Link a synced file for teammates | `bdrive url <file>` — prints the file's hub viewer URL (sign-in + project membership required; always the latest content). Computed locally, no network; `--sync` pushes first so a just-created file's link resolves immediately; no arg = the project home page. **After creating a shareable artifact (.md/.html/.csv/report/plan) in the shared folder, include this link in your reply** so teammates can open it. |
| Share a synced file publicly by URL | `bdrive share <file>` — prints a link anyone can open (HTML renders as a page, markdown rendered, PDFs inline; sandboxed; always the latest content; no account needed). `--expires 24h` for self-destructing links; `--list` / `--revoke <token-or-url>` to manage. Put generated reports in the shared folder, sync, then share. |
@@ -69,7 +69,7 @@ Selective-sync semantics — important when advising users:
### Init flow
1. `bdrive login` once per device (browser sign-in; default server beardrive.ai; sign-up available on the page).
1. `bdrive login https://your-hub` once per device (browser sign-in; sign-up available on the page). Bare `bdrive login` targets BearDrive Cloud, which is not open yet — use the team's hub URL.
2. Run `bdrive init` in the folder. Interactive on a TTY (create new / connect existing project; whole folder / shared subfolder); with flags or without a TTY it creates-or-joins a project named after the folder and syncs everything. It:
- writes `<folder>/.bdrive/config.json` (mount id + project + remote) and registers the mount id in `~/.bdrive/mounts.json`,
- seeds a starter `.bdriveignore` (node_modules, build dirs, caches, `.env*`) when none exists,
@@ -260,7 +260,7 @@ The `s3://`/`gs://`/`file://` URL is the **hub's** storage root; the prefix can
### Pointing a hub at storage (server-side)
```sh
# Start a hub on an S3 bucket; clients then `bdrive login` + `bdrive init`
# Start a hub on an S3 bucket; clients then `bdrive login https://this-hub` + `bdrive init`
bdrive web s3://acme-beardrive/root --upload
# Or from a config file
Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

+40 -24
View File
@@ -4,10 +4,14 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BearDrive — Google Drive for AI agents</title>
<meta name="description" content="Google Drive for AI agents: one synced folder for your whole team. Share any file with people as a public URL; share context across agents, so your agent knows what their agent knows. Open source, no server required.">
<meta name="description" content="Google Drive for AI agents: one synced folder for your whole team. Share any file with people as a public URL; share context across agents, so your agent knows what their agent knows. Open source and self-hostable.">
<meta property="og:title" content="BearDrive — Google Drive for AI agents">
<meta property="og:description" content="One synced folder for humans and agents: files become public URLs for people, and shared memory for every teammate's agent. Open source, no server required.">
<meta property="og:description" content="One synced folder for humans and agents: files become public URLs for people, and shared memory for every teammate's agent. Open source, self-host in one binary.">
<meta property="og:type" content="website">
<meta property="og:image" content="https://raw.githubusercontent.com/runbear-io/beardrive/main/website/assets/insights.png">
<meta property="og:image:width" content="2720">
<meta property="og:image:height" content="1700">
<meta name="twitter:card" content="summary_large_image">
<meta property="og:url" content="https://beardrive.ai">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>&#128059;</text></svg>">
<style>
@@ -276,7 +280,7 @@ footer a:hover { color: var(--text); }
<a href="#claude">Claude Code</a>
<a href="#get">Open source</a>
<a href="https://github.com/runbear-io/beardrive" title="GitHub">GitHub</a>
<a class="btn" href="#get">Start syncing</a>
<a class="btn" href="https://github.com/runbear-io/beardrive">Star on GitHub</a>
</div>
</div>
</nav>
@@ -287,7 +291,7 @@ footer a:hover { color: var(--text); }
<h1>Google Drive for AI agents.<span class="green">Your agent knows what their agent knows.</span></h1>
<p class="sub">One synced folder for your whole team — humans and agents.
<b>Share any file with people</b> as a public URL; <b>give every agent the same
memory</b>, synced across machines in seconds. Real files. No server required.</p>
memory</b>, synced across machines in seconds. Real files. Self-host the whole thing in one Go binary.</p>
<div class="cta-row">
<a class="btn" href="#get">Start syncing</a>
<button class="install" id="install" title="Copy">
@@ -303,10 +307,10 @@ footer a:hover { color: var(--text); }
</div>
</div>
<div class="strip">
<p>Works with the storage you already have</p>
<p>Your hub stores on the object storage you already have</p>
<div class="names">
<span>Amazon S3</span><span>Google Cloud Storage</span><span>Cloudflare R2</span>
<span>MinIO</span><span>any folder</span><span>— or a BearDrive hub</span>
<span>MinIO</span><span>any folder</span>
</div>
</div>
</header>
@@ -333,12 +337,16 @@ footer a:hover { color: var(--text); }
<p><b>Share by URL.</b> <code>bdrive share wiki/report.md</code> prints a
public link that renders the file as a page — always the latest synced
version, no account needed, revocable any time.</p>
<img src="assets/share.png" alt="A shared markdown runbook rendered as a public page" loading="lazy" style="display:block;width:100%;margin-top:12px;border-radius:8px;border:1px solid rgba(255,255,255,.09)">
</div>
<div class="card wide">
<div class="arch"><b>your folder</b> ←scan/materialize→ <b>local volume</b> ←push/pull→ <span class="a">object storage or a BearDrive hub</span>
<span class="dim">real files per-device journals, devices converge through dumb storage:
<div class="arch"><b>your folder</b> ←scan/materialize→ <b>local volume</b> ←push/pull→ <span class="a">a BearDrive hub (on S3 / GCS / R2 / a folder)</span>
<span class="dim">real files per-device journals, devices converge through the hub's dumb storage:
every tool works content-addressed blobs append-only, no locks, offline-safe</span></div>
</div>
<div class="card wide" style="padding:0;overflow:hidden">
<img src="assets/browse.png" alt="The hub web UI browsing a project — per-file agent read counts, heat dots, and the folder's change feed" loading="lazy" style="display:block;width:100%">
</div>
</div>
</div>
</section>
@@ -348,13 +356,6 @@ every tool works content-addressed blobs append-only, no locks, offl
<p class="kicker">WHY BEARDRIVE</p>
<h2>Two superpowers, one folder.</h2>
<div class="grid" style="grid-template-columns:repeat(auto-fit,minmax(340px,1fr))">
<div class="card"><div class="ico">🧑‍🤝‍🧑</div>
<p style="font-size:15px"><b>Share files with people.</b> Anything in the folder is a
<code>bdrive share</code> away from being a public URL that renders as a page —
markdown, HTML, PDFs. No accounts for viewers, no "can you re-send that?",
always the latest version, revocable any time. Dropbox-link simplicity for
everything your team produces.</p>
</div>
<div class="card"><div class="ico">🧠</div>
<p style="font-size:15px"><b>Share context across agents.</b> The folder is shared
memory. What your agent learns today — findings, plans, decisions, notes —
@@ -362,7 +363,21 @@ every tool works content-addressed blobs append-only, no locks, offl
session already knowing it</b>. Context stops being siloed per laptop;
every agent on the team reads from, and writes to, the same brain.</p>
</div>
<div class="card"><div class="ico">🧑‍🤝‍🧑</div>
<p style="font-size:15px"><b>Share files with people.</b> Anything in the folder is a
<code>bdrive share</code> away from being a public URL that renders as a page —
markdown, HTML, PDFs. No accounts for viewers, no "can you re-send that?",
always the latest version, revocable any time. Dropbox-link simplicity for
everything your team produces.</p>
</div>
<div class="card"><div class="ico">📊</div>
<p style="font-size:15px"><b>See what your agents actually read.</b> Every change is
attributed to the human, agent, or device that made it — and BearDrive's Insights
show which files your agents lean on and which "hot but stale" docs the team relies
on that nobody maintains. Agents aren't just users of the folder; they're measured.</p>
</div>
</div>
<p style="margin-top:28px"><img src="assets/insights.png" alt="BearDrive Insights — every file plotted by agent and human reads versus staleness" loading="lazy" style="width:100%;border-radius:12px;border:1px solid rgba(255,255,255,.09)"></p>
</div>
</section>
@@ -400,9 +415,10 @@ every tool works content-addressed blobs append-only, no locks, offl
concurrent edits keep both versions as conflict copies.</p>
</div>
<div class="card"><div class="ico">🪣</div>
<p><b>Bring your own storage.</b> S3, GCS, R2, MinIO, or a plain shared
directory — BearDrive needs nothing but dumb object storage. Or sync
through a hub and devices never hold cloud credentials at all.</p>
<p><b>Bring your own storage.</b> Your hub is backed by S3, GCS, R2,
MinIO, or a plain shared directory — nothing but dumb object storage.
Clients sync through the hub over HTTPS and never hold cloud
credentials at all.</p>
</div>
</div>
</div>
@@ -432,7 +448,7 @@ every tool works content-addressed blobs append-only, no locks, offl
<div class="msg claude"><div class="who">Your Claude</div>
<div class="bubble">Done — I saved the report to <code>wiki/q3-findings.md</code>
(synced to the team) and here's a public link for anyone outside it:<br><br>
<span class="url">https://beardrive.ai/s/1aad3327224e408d…</span></div>
<span class="url">https://acme-hub.example/s/1aad3327224e408d…</span></div>
</div>
<div class="msg"><div class="who">Your teammate, to their Claude</div>
<div class="bubble">What did we learn from the Q3 numbers?</div>
@@ -464,7 +480,7 @@ every tool works content-addressed blobs append-only, no locks, offl
</ul>
<div class="cta-row" style="justify-content:flex-start">
<a class="btn" href="https://github.com/runbear-io/beardrive">View on GitHub</a>
<a class="btn ghost" href="https://github.com/runbear-io/beardrive#the-sync-hub-and-bdrive-init">Self-hosting guide</a>
<a class="btn ghost" href="https://github.com/runbear-io/beardrive/blob/main/docs/self-hosting.md">Self-hosting guide</a>
</div>
</div>
<div class="oss-card cloud">
@@ -486,8 +502,8 @@ every tool works content-addressed blobs append-only, no locks, offl
<section class="closer">
<div class="wrap">
<h2>Share files. Share context.<br><span class="green">Set up in under a minute.</span></h2>
<p>brew install, bdrive init, done. Files travel to people as URLs; context travels to every agent on the team.</p>
<h2>Share files. Share context.<br><span class="green">Self-host in one binary.</span></h2>
<p>brew install, run one hub, bdrive init. Files travel to people as URLs; context travels to every agent on the team. Cloud — zero-setup — is on the waitlist.</p>
<div class="cta-row">
<a class="btn" href="https://github.com/runbear-io/beardrive">Start on GitHub</a>
<button class="install" id="install2" title="Copy">
@@ -537,12 +553,12 @@ for (const [btn, cmd] of [["install", "install-cmd"], ["install2", "install-cmd2
const LINES = [
{ t: "$ ", cls: "p" }, { t: "bdrive init\n", type: true },
{ t: "✓", cls: "ok" }, { t: " project ", cls: "dim" }, { t: "acme-wiki" },
{ t: " syncing → beardrive.ai\n\n", cls: "dim" },
{ t: " syncing → your team's hub\n\n", cls: "dim" },
{ t: " (your agent writes wiki/q3-report.md…)\n\n", cls: "dim", pause: 900 },
{ t: "$ ", cls: "p" }, { t: "bdrive status\n", type: true },
{ t: " daemon: running\n files: 142 (3.4 MiB)\n pending: 0 — everything synced\n\n", cls: "dim" },
{ t: "$ ", cls: "p" }, { t: "bdrive share wiki/q3-report.md\n", type: true },
{ t: "https://beardrive.ai/s/1aad3327224e408d\n", cls: "url" },
{ t: "https://acme-hub.example/s/1aad3327224e408d\n", cls: "url" },
{ t: " anyone can open it — no account needed\n", cls: "dim" },
];
const body = document.getElementById("term-body");
+5 -5
View File
@@ -75,7 +75,7 @@ h1 { text-align: center; font-size: 22px; margin: 0 0 6px; }
<div class="mini">
<div class="pill"><span class="dot">Open source</span> AGPL-3.0 · on Homebrew</div>
<h2>A shared drive for your AI agents.<span class="g">Synced in seconds. Tracked forever.</span></h2>
<p>Real files. No server required.</p>
<p>Real files. Self-hostable in one binary.</p>
<div class="row"><button class="btn">Start syncing</button><button class="btn ghost">GitHub</button></div>
<div class="term"><span class="p">$</span> bdrive share wiki/q3-report.html
<span class="url">https://beardrive.ai/s/1aad3327…</span>
@@ -92,7 +92,7 @@ h1 { text-align: center; font-size: 22px; margin: 0 0 6px; }
<div class="mini">
<div class="pill"><span class="dot">Open source</span> AGPL-3.0 · on Homebrew</div>
<h2>A shared drive for your AI agents.<span class="g">Synced in seconds. Tracked forever.</span></h2>
<p>Real files. No server required.</p>
<p>Real files. Self-hostable in one binary.</p>
<div class="row"><button class="btn">Start syncing</button><button class="btn ghost">GitHub</button></div>
<div class="term"><span class="p">$</span> bdrive share wiki/q3-report.html
<span class="url">https://beardrive.ai/s/1aad3327…</span>
@@ -109,7 +109,7 @@ h1 { text-align: center; font-size: 22px; margin: 0 0 6px; }
<div class="mini">
<div class="pill"><span class="dot">Open source</span> AGPL-3.0 · on Homebrew</div>
<h2>A shared drive for your AI agents.<span class="g">Synced in seconds. Tracked forever.</span></h2>
<p>Real files. No server required.</p>
<p>Real files. Self-hostable in one binary.</p>
<div class="row"><button class="btn">Start syncing</button><button class="btn ghost">GitHub</button></div>
<div class="term"><span class="p">$</span> bdrive share wiki/q3-report.html
<span class="url">https://beardrive.ai/s/1aad3327…</span>
@@ -126,7 +126,7 @@ h1 { text-align: center; font-size: 22px; margin: 0 0 6px; }
<div class="mini">
<div class="pill"><span class="dot">Open source</span> AGPL-3.0 · on Homebrew</div>
<h2>A shared drive for your AI agents.<span class="g">Synced in seconds. Tracked forever.</span></h2>
<p>Real files. No server required.</p>
<p>Real files. Self-hostable in one binary.</p>
<div class="row"><button class="btn">Start syncing</button><button class="btn ghost">GitHub</button></div>
<div class="term"><span class="p">$</span> bdrive share wiki/q3-report.html
<span class="url">https://beardrive.ai/s/1aad3327…</span>
@@ -143,7 +143,7 @@ h1 { text-align: center; font-size: 22px; margin: 0 0 6px; }
<div class="mini">
<div class="pill"><span class="dot">Open source</span> AGPL-3.0 · on Homebrew</div>
<h2>A shared drive for your AI agents.<span class="g">Synced in seconds. Tracked forever.</span></h2>
<p>Real files. No server required.</p>
<p>Real files. Self-hostable in one binary.</p>
<div class="row"><button class="btn">Start syncing</button><button class="btn ghost">GitHub</button></div>
<div class="term"><span class="p">$</span> bdrive share wiki/q3-report.html
<span class="url">https://beardrive.ai/s/1aad3327…</span>