page.tsx81 lines · main
1import { DocsShell } from '../../components/shell';
2
3export const metadata = { title: 'storage' };
4
5export default function StoragePage() {
6 return (
7 <DocsShell>
8 <h1 className="font-mono text-2xl tracking-tight">storage (S3)</h1>
9 <p className="mt-2 font-mono text-sm text-[var(--color-text-muted)]">
10 per-project private buckets on briven MinIO. this is <strong className="text-[var(--color-text)]">file</strong>{' '}
11 storage for your app — not the SQL database (that is{' '}
12 <a className="underline" href="/doltgres">
13 Doltgres
14 </a>
15 ) and not platform disaster-recovery backups.
16 </p>
17
18 <div className="mt-6 rounded-md border border-[var(--color-border-subtle)] bg-[var(--color-surface)] p-4 font-mono text-xs text-[var(--color-text-muted)]">
19 <strong className="text-[var(--color-text)]">three different “keys”.</strong> auth uses{' '}
20 <code>pk_briven_auth_…</code>. server data uses <code>brk_…</code>. storage uses{' '}
21 <code>brvn…</code> access keys for one bucket only. never mix them.
22 </div>
23
24 <h2 className="mt-12 font-mono text-lg">what you get</h2>
25 <ul className="mt-3 list-disc pl-5 font-mono text-sm text-[var(--color-text-muted)] space-y-2">
26 <li>
27 endpoint: <code>https://s3.briven.tech</code>
28 </li>
29 <li>
30 bucket: <code>proj-…</code> (one per project)
31 </li>
32 <li>scoped S3 keys from the dashboard (secret shown once)</li>
33 <li>
34 public files at <code>https://media.briven.tech/media/&lt;projectId&gt;/&lt;fileId&gt;</code>
35 </li>
36 <li>soft-delete + restore (dashboard Recently deleted, or MCP restore tools)</li>
37 <li>image resize URLs (imgproxy) when configured</li>
38 </ul>
39
40 <h2 className="mt-12 font-mono text-lg">dashboard</h2>
41 <ol className="mt-3 list-decimal pl-5 font-mono text-sm text-[var(--color-text-muted)] space-y-2">
42 <li>
43 open{' '}
44 <a className="underline" href="https://briven.tech">
45 briven.tech
46 </a>{' '}
47 → your project → <em>Storage</em>
48 </li>
49 <li>
50 create a key → copy endpoint, bucket, access key, secret immediately
51 </li>
52 <li>put them in your app server env (never in the browser for secret keys)</li>
53 </ol>
54
55 <h2 className="mt-12 font-mono text-lg">cli</h2>
56 <p className="mt-3 font-mono text-sm text-[var(--color-text-muted)]">
57 <code>briven setup</code> (new project) and <code>briven connect</code> (existing) always
58 mint a project S3 key into <code>.env.local</code> when possible. see{' '}
59 <a className="underline" href="/connect">
60 connect
61 </a>
62 .
63 </p>
64
65 <h2 className="mt-12 font-mono text-lg">mcp</h2>
66 <p className="mt-3 font-mono text-sm text-[var(--color-text-muted)]">
67 with a project MCP key: <code>storage_upload_url</code>, <code>storage_list_files</code>,{' '}
68 <code>storage_delete_file</code>, <code>storage_list_deleted</code>,{' '}
69 <code>storage_restore_file</code>, <code>storage_mint_key</code>, and related tools. all
70 scoped to <em>this</em> project only.
71 </p>
72
73 <h2 className="mt-12 font-mono text-lg">security</h2>
74 <ul className="mt-3 list-disc pl-5 font-mono text-sm text-[var(--color-text-muted)] space-y-2">
75 <li>a project key cannot list another project&apos;s bucket (isolation)</li>
76 <li>prefer presigned upload URLs from the browser instead of proxying bytes</li>
77 <li>revoke keys that leaked in chat or screenshots</li>
78 </ul>
79 </DocsShell>
80 );
81}