
Security News
RubyGems Adds Cooldown Feature to Bundler for Newly Published Gems
RubyGems and Bundler 4.0.13 introduced an opt-in cooldown feature that delays newly published gems during dependency resolution.
[!WARNING] This is highly experimental software. Use with caution, especially during account migration.
Vow is a Bring-Your-Own-Key (BYOK) PDS (Personal Data Server) for AT Protocol. The server never stores a private signing key; all repository transactions are signed by a user passkey.
[!NOTE] Experiment with Vow using the following
DL7KM7UX-4LLQYELWinvite code on the test server vowpds.srv.rbrt.fr. The PDS accounts are cleared regularly.
git clone https://pkg.rbrt.fr/vow.git
cd vow
cp .env.example .env
.env with your settingsVOW_DID="did:web:your-domain.com"
VOW_HOSTNAME="your-domain.com"
VOW_CONTACT_EMAIL="you@example.com"
VOW_RELAYS="https://bsky.network"
# Generate with: openssl rand -hex 16
VOW_ADMIN_PASSWORD="your-secure-password"
# Generate with: openssl rand -hex 32
VOW_SESSION_SECRET="your-session-secret"
docker compose pull
docker compose up -d
This starts three services:
On first run, an invite code is automatically created:
docker compose logs create-invite
Or check saved file:
cat keys/initial-invite-code.txt
docker compose logs -f
127.0.0.1:8081 for your reverse proxy../keys/ — generated keys
rotation.key — PDS rotation keyjwk.key — JWK private keyinitial-invite-code.txt — first invite code (first run only)./data/ — SQLite metadata database/opt/ipfs Docker volume — IPFS blocks and blobsYou need a reverse proxy (nginx, Caddy, etc.) in front of the PDS:
| Service | Internal address | Purpose |
|---|---|---|
| vow | 127.0.0.1:8080 | AT Protocol PDS |
| ipfs | 127.0.0.1:8081 | IPFS gateway for blob serving |
Set VOW_IPFS_GATEWAY_URL to your public gateway URL so sync.getBlob redirects clients there instead of proxying through vow.
Vow uses SQLite for relational metadata such as accounts, sessions, record indexes, and tokens.
VOW_DB_NAME="/data/vow/vow.db"
# URL of Kubo RPC API
VOW_IPFS_NODE_URL="http://127.0.0.1:5001"
# Optional: redirect sync.getBlob to a public gateway
VOW_IPFS_GATEWAY_URL="https://ipfs.example.com"
VOW_SMTP_USER="your-smtp-username"
VOW_SMTP_PASS="your-smtp-password"
VOW_SMTP_HOST="smtp.example.com"
VOW_SMTP_PORT="587"
VOW_SMTP_EMAIL="noreply@example.com"
VOW_SMTP_NAME="Vow PDS"
The PDS holds two keys:
rotation.key) — used for DID genesis operations and for signing the PLC operation that transfers control to the user's passkey during passkey registration.jwk.key) — a P-256 ECDSA key used exclusively to sign ATProto session JWTs (access and refresh tokens) and OAuth tokens. It has no role in repo writes or identity operations.Neither key is ever used to sign repo commits or service-auth JWTs.
The account page (/account) connects over WebSocket and runs entirely in the browser. No browser extension or extra software is needed — the user just keeps the tab open and signs commits automatically when prompted.
Vow implements a two-key model:
| Property | PDS Server Key | Passkey-Derived Key |
|---|---|---|
| DID slot | #atproto_service | #atproto |
| Purpose | Service-auth JWTs | Repo commits |
| Passkey required | No | Yes (for repo writes) |
| Private key stored | Yes (in jwk.key) | No (derived on-the-fly) |
Create an invite code:
docker exec vow-pds /vow create-invite-code --uses 1
Reset a user's password:
docker exec vow-pds /vow reset-password --did "did:plc:xxx"
docker compose build
docker compose up -d
[!NOTE] Just because something is implemented doesn't mean it is finished. Many endpoints still have rough edges around validation and error handling.
com.atproto.identity.getRecommendedDidCredentialscom.atproto.identity.requestPlcOperationSignaturecom.atproto.identity.resolveHandlecom.atproto.identity.signPlcOperationcom.atproto.identity.submitPlcOperationcom.atproto.identity.updateHandlecom.atproto.repo.applyWritescom.atproto.repo.createRecordcom.atproto.repo.putRecordcom.atproto.repo.deleteRecordcom.atproto.repo.describeRepocom.atproto.repo.getRecordcom.atproto.repo.importRepo (Works "okay". Use with extreme caution.)com.atproto.repo.listRecordscom.atproto.repo.listMissingBlobscom.atproto.server.activateAccountcom.atproto.server.checkAccountStatuscom.atproto.server.confirmEmailcom.atproto.server.createAccountcom.atproto.server.createInviteCodecom.atproto.server.createInviteCodescom.atproto.server.deactivateAccountcom.atproto.server.deleteAccountcom.atproto.server.deleteSessioncom.atproto.server.describeServercom.atproto.server.getAccountInviteCodescom.atproto.server.getServiceAuthcom.atproto.server.refreshSessioncom.atproto.server.requestAccountDeletecom.atproto.server.requestEmailConfirmationcom.atproto.server.requestEmailUpdatecom.atproto.server.requestPasswordResetcom.atproto.server.resetPasswordcom.atproto.server.updateEmailcom.atproto.sync.getBlobcom.atproto.sync.getBlockscom.atproto.sync.getLatestCommitcom.atproto.sync.getRecordcom.atproto.sync.getRepoStatuscom.atproto.sync.getRepocom.atproto.sync.listBlobscom.atproto.sync.requestCrawlcom.atproto.sync.subscribeReposcom.atproto.label.queryLabelscom.atproto.moderation.createReportapp.bsky.actor.getPreferencesapp.bsky.actor.putPreferencesMIT. server/static/pico.css is also MIT licensed, available at https://github.com/picocss/pico.
Vow is based on Cocoon. Many thanks for the solid foundation.
| Feature | Vow | Cocoon |
|---|---|---|
| Language | Go | Go |
| SQLite (metadata) | ✅ | ✅ |
| SQLite blockstore | ❌ removed | ✅ |
| PostgreSQL support | ❌ removed | ✅ |
| S3 blob storage | ❌ removed | ✅ |
| IPFS repo block storage | ✅ (Kubo) | ❌ |
| IPFS blob storage | ✅ (Kubo) | ❌ |
| Email 2FA | ❌ removed | ✅ |
| BYOK (keyless PDS) | ✅ | ❌ |
| Passkey signer | ✅ | ❌ |
For in-depth specifications, flows, trade-offs, and maintenance considerations, see specs.md.
FAQs
Unknown package
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
RubyGems and Bundler 4.0.13 introduced an opt-in cooldown feature that delays newly published gems during dependency resolution.

Security News
pnpm 11.5 now recognizes npm staged publish approvals in release metadata, preventing those releases from being mistaken for lower-trust package publishes.

Security News
Federal audit finds NIST lacked a plan to clear the NVD backlog, wasted funds on duplicate work, and delayed use of CISA data.