this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

First staging release?

+98 -118
+3
CHANGELOG.md
··· 12 12 - Remove bearer token authentication fallback from AppView [#26](https://issues.opake.app/issues/26.html)s 13 13 14 14 ### Added 15 + - Add SEO audit for web application [#263](https://issues.opake.app/issues/263.html) 16 + - Add web and AppView hosting [#262](https://issues.opake.app/issues/262.html) 17 + - Add web UI with AppView and SPA [#113](https://issues.opake.app/issues/113.html) 15 18 - Add mobile responsive layout for cabinet [#268](https://issues.opake.app/issues/268.html) 16 19 - Rewrite sharing page to reuse cabinet file browser components [#289](https://issues.opake.app/issues/289.html) 17 20 - Add web inbox for incoming grants [#150](https://issues.opake.app/issues/150.html)
+2
Containerfile.web
··· 17 17 FROM web-deps AS web-builder 18 18 19 19 ARG VITE_APPVIEW_URL=https://appview.opake.app 20 + ARG VITE_SITE_URL=https://opake.app 20 21 ENV VITE_APPVIEW_URL=$VITE_APPVIEW_URL 22 + ENV VITE_SITE_URL=$VITE_SITE_URL 21 23 22 24 COPY web/ ./ 23 25 COPY --from=wasm-builder /build/web/src/wasm/opake-wasm/ ./src/wasm/opake-wasm/
+1
tools/generate-og-images.mjs
··· 94 94 { slug: "sharing-dids", title: "Sharing & DIDs", description: "Share files using decentralised identifiers without a central authority." }, 95 95 { slug: "keyrings", title: "Keyrings & Groups", description: "Manage secure group sharing for families, teams, and research groups." }, 96 96 { slug: "pairing", title: "Multi-Device Magic", description: "Securely transfer your identity keypair to new devices using your PDS as a relay." }, 97 + { slug: "cli", title: "The CLI Manual", description: "Complete command reference for the Opake CLI — identity, files, sharing, and more." }, 97 98 { slug: "glossary", title: "Glossary", description: "A quick-hit reference for the terminology and acronyms we use in Opake." }, 98 99 { slug: "faq", title: "FAQ", description: "Common questions about privacy, security, and how Opake compares to alternatives." }, 99 100 ];
web/public/og/cli.png

This is a binary file and will not be displayed.

web/public/opake-logo-with-background.png

This is a binary file and will not be displayed.

+11 -6
web/src/components/content/chapter.tsx
··· 143 143 readonly children: ReactNode; 144 144 } 145 145 146 + function extractText(node: ReactNode): string { 147 + if (typeof node === "string") return node; 148 + if (typeof node === "number") return String(node); 149 + if (node == null || typeof node === "boolean") return ""; 150 + if (Array.isArray(node)) return node.map(extractText).join(""); 151 + if (typeof node === "object" && "props" in node) 152 + return extractText((node.props as { children?: ReactNode }).children); 153 + return ""; 154 + } 155 + 146 156 export function CodeBlock({ language, title, children }: CodeBlockProps) { 147 - const code = 148 - typeof children === "string" 149 - ? children.trim() 150 - : Array.isArray(children) 151 - ? (children as string[]).join("") 152 - : ""; 157 + const code = extractText(children).trim(); 153 158 154 159 return ( 155 160 <div className="border-border-accent/30 my-4 overflow-hidden rounded-lg border">
+46 -88
web/src/content/docs/cli.mdx
··· 7 7 8 8 ## Installation 9 9 10 - The CLI is built in Rust and distributed via `cargo`. Ensure you have Rust 1.75+ installed. 10 + The CLI is built in Rust and requires building from source. You'll need Rust 1.75+ and Git. 11 11 12 - <CodeBlock language="sh">cargo install --path crates/opake-cli</CodeBlock> 12 + <CodeBlock language="sh">git clone https://tangled.org/sans-self.org/opake.app</CodeBlock> 13 13 14 - This puts the `opake` binary in your `~/.cargo/bin/` directory. 14 + <CodeBlock language="sh">cd opake.app && cargo install --path crates/opake-cli</CodeBlock> 15 + 16 + This puts the `opake` binary in your `~/.cargo/bin/` directory. Pre-built binaries and crates.io publishing are planned. 15 17 16 18 --- 17 19 ··· 21 23 22 24 ### Login 23 25 24 - <CodeBlock language="sh"> 25 - # Standard OAuth login 26 - opake login you.bsky.social 26 + <CodeBlock language="sh">opake login you.bsky.social</CodeBlock> 27 27 28 - # Explicit PDS override 29 - 30 - opake login you.bsky.social --pds https://pds.example.com 31 - 32 - # Legacy app-password fallback 28 + Override the PDS or fall back to legacy app-password auth: 33 29 34 - opake login you.bsky.social --legacy 30 + <CodeBlock language="sh">opake login you.bsky.social --pds https://pds.example.com</CodeBlock> 35 31 36 - </CodeBlock> 32 + <CodeBlock language="sh">opake login you.bsky.social --legacy</CodeBlock> 37 33 38 34 ### Managing Accounts 39 35 40 - <CodeBlock language="sh"> 41 - # List all authenticated accounts 42 - opake accounts 36 + <CodeBlock language="sh">opake accounts</CodeBlock> 43 37 44 - # Set the default identity for future commands 45 - 46 - opake set-default bob.other.com 38 + <CodeBlock language="sh">opake set-default bob.other.com</CodeBlock> 47 39 48 - # Use a specific account for a single command 40 + Use a specific account for a single command with `--as`: 49 41 50 - opake ls --as alice.example.com 51 - 52 - </CodeBlock> 42 + <CodeBlock language="sh">opake ls --as alice.example.com</CodeBlock> 53 43 54 44 --- 55 45 ··· 59 49 60 50 ### Upload & Download 61 51 62 - <CodeBlock language="sh"> 63 - # Encrypt and upload a file 64 - opake upload photo.jpg --tags vacation,beach 52 + <CodeBlock language="sh">opake upload photo.jpg --description "Beach vacation"</CodeBlock> 53 + 54 + <CodeBlock language="sh">opake download photo.jpg -o ~/Downloads/copy.jpg</CodeBlock> 65 55 66 - # Download and decrypt to a specific location 56 + Decrypt and stream to stdout without saving locally: 67 57 68 - opake download photo.jpg -o ~/Downloads/copy.jpg 58 + <CodeBlock language="sh">opake cat notes.txt</CodeBlock> 69 59 70 - # Decrypt and stream to stdout (no local save) 60 + ### Organization 71 61 72 - opake cat notes.txt 62 + <CodeBlock language="sh">opake ls --long</CodeBlock> 73 63 74 - </CodeBlock> 64 + <CodeBlock language="sh">opake mkdir Photos</CodeBlock> 75 65 76 - ### Organization 66 + <CodeBlock language="sh">opake tree</CodeBlock> 77 67 78 - <CodeBlock language="sh"> 79 - # List files and directories 80 - opake ls --long 68 + ### Metadata 81 69 82 - # Create a virtual directory 70 + View or modify a document's metadata after upload: 83 71 84 - opake mkdir Photos 72 + <CodeBlock language="sh">opake metadata photo.jpg</CodeBlock> 85 73 86 - # Visualize your vault hierarchy 74 + <CodeBlock language="sh">opake metadata photo.jpg --rename "sunset.jpg"</CodeBlock> 87 75 88 - opake tree 76 + <CodeBlock language="sh">opake metadata photo.jpg --add-tag vacation --add-tag beach</CodeBlock> 89 77 78 + <CodeBlock language="sh"> 79 + opake metadata photo.jpg --description "Golden hour at Scheveningen" 90 80 </CodeBlock> 91 81 92 82 --- ··· 97 87 98 88 ### Direct Sharing (Grants) 99 89 100 - <CodeBlock language="sh"> 101 - # Share a file with another DID or handle 102 - opake share secret.pdf bob.bsky.social 90 + <CodeBlock language="sh">opake share secret.pdf bob.bsky.social</CodeBlock> 103 91 104 - # List all grants you have issued 92 + <CodeBlock language="sh">opake shared</CodeBlock> 105 93 106 - opake shared 107 - 108 - # Check your inbox for incoming shares 109 - 110 - opake inbox 111 - 112 - # Revoke a grant by its URI 113 - 114 - opake revoke at://did:plc:123/app.opake.grant/tid456 94 + <CodeBlock language="sh">opake inbox</CodeBlock> 115 95 116 - </CodeBlock> 96 + <CodeBlock language="sh">opake revoke at://did:plc:123/app.opake.grant/tid456</CodeBlock> 117 97 118 98 ### Group Sharing (Keyrings) 119 99 120 - <CodeBlock language="sh"> 121 - # Create a new group keyring 122 - opake keyring create "The Collective" 100 + <CodeBlock language="sh">opake keyring create "The Collective"</CodeBlock> 123 101 124 - # Add a member to the group 102 + <CodeBlock language="sh">opake keyring add-member "The Collective" alice.bsky.social</CodeBlock> 125 103 126 - opake keyring add-member "The Collective" alice.bsky.social 127 - 128 - # Upload a file to the group vault 129 - 130 - opake upload internal-docs.zip --keyring "The Collective" 131 - 132 - </CodeBlock> 104 + <CodeBlock language="sh">opake upload internal-docs.zip --keyring "The Collective"</CodeBlock> 133 105 134 106 --- 135 107 ··· 137 109 138 110 ### Device Pairing 139 111 140 - <CodeBlock language="sh"> 141 - # Request identity transfer (on the NEW device) 142 - opake pair request 112 + <CodeBlock language="sh">opake pair request</CodeBlock> 143 113 144 - # Approve identity transfer (on the EXISTING device) 114 + Run the above on the **new** device, then approve on the **existing** device: 145 115 146 - opake pair approve 147 - 148 - </CodeBlock> 116 + <CodeBlock language="sh">opake pair approve</CodeBlock> 149 117 150 118 ### The Nuclear Option 151 119 152 - <CodeBlock language="sh"> 153 - # Logout of an account (removes local keys) 154 - opake logout alice.bsky.social 120 + <CodeBlock language="sh">opake logout alice.bsky.social</CodeBlock> 155 121 156 - # THE MINI NUKE: Delete every file in your vault, but keep your identity/keys 122 + <CodeBlock language="sh">opake rm -r /</CodeBlock> 157 123 158 - opake rm -r / 124 + <CodeBlock language="sh">opake purge --dry-run</CodeBlock> 159 125 160 - # THE FULL PURGE: Delete ALL Opake records from your PDS 161 - 162 - opake purge --dry-run 163 - opake purge --force 164 - 165 - </CodeBlock> 126 + <CodeBlock language="sh">opake purge --force</CodeBlock> 166 127 167 128 <Callout type="warning"> 168 - **The Mini Nuke:** Running `opake rm -r /` is the fastest way to clear your entire vault while 169 - keeping your cryptographic identity intact. Use it when you want a fresh start without needing to 170 - re-pair your devices. 129 + **The Mini Nuke:** Running `opake rm -r /` clears your entire vault while keeping your 130 + cryptographic identity intact. Use it when you want a fresh start without re-pairing devices. 171 131 </Callout> 172 132 173 133 <Callout type="info"> 174 - **Pro-Tip:** Most commands support the `--help` flag for detailed usage and sub-command options. 134 + **Pro-Tip:** Every command supports `--help` for detailed usage and sub-command options. 175 135 </Callout> 176 - 177 - Ready to learn about how these commands translate to the protocol? Check the [Technical Spec](/docs/protocol).
+24 -24
web/src/index.css
··· 29 29 font-weight: 300 600; 30 30 font-display: swap; 31 31 src: url("/fonts/cormorant-garamond-latin-normal.woff2") format("woff2"); 32 - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, 33 - U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, 34 - U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 + unicode-range: 33 + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, 34 + U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 35 35 } 36 36 37 37 @font-face { ··· 40 40 font-weight: 300 600; 41 41 font-display: swap; 42 42 src: url("/fonts/cormorant-garamond-latin-ext-normal.woff2") format("woff2"); 43 - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, 44 - U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, 45 - U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 43 + unicode-range: 44 + U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 45 + U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 46 46 U+A720-A7FF; 47 47 } 48 48 ··· 52 52 font-weight: 300 600; 53 53 font-display: swap; 54 54 src: url("/fonts/cormorant-garamond-latin-italic.woff2") format("woff2"); 55 - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, 56 - U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, 57 - U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 55 + unicode-range: 56 + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, 57 + U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 58 58 } 59 59 60 60 @font-face { ··· 63 63 font-weight: 300 600; 64 64 font-display: swap; 65 65 src: url("/fonts/cormorant-garamond-latin-ext-italic.woff2") format("woff2"); 66 - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, 67 - U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, 68 - U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 66 + unicode-range: 67 + U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 68 + U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 69 69 U+A720-A7FF; 70 70 } 71 71 ··· 75 75 font-weight: 300 600; 76 76 font-display: swap; 77 77 src: url("/fonts/inter-latin-normal.woff2") format("woff2"); 78 - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, 79 - U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, 80 - U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 78 + unicode-range: 79 + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, 80 + U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 81 81 } 82 82 83 83 @font-face { ··· 86 86 font-weight: 300 600; 87 87 font-display: swap; 88 88 src: url("/fonts/inter-latin-ext-normal.woff2") format("woff2"); 89 - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, 90 - U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, 91 - U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 89 + unicode-range: 90 + U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 91 + U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 92 92 U+A720-A7FF; 93 93 } 94 94 ··· 98 98 font-weight: 300 400; 99 99 font-display: swap; 100 100 src: url("/fonts/inter-latin-italic.woff2") format("woff2"); 101 - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, 102 - U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, 103 - U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 101 + unicode-range: 102 + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, 103 + U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 104 104 } 105 105 106 106 @font-face { ··· 109 109 font-weight: 300 400; 110 110 font-display: swap; 111 111 src: url("/fonts/inter-latin-ext-italic.woff2") format("woff2"); 112 - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, 113 - U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, 114 - U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 112 + unicode-range: 113 + U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 114 + U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 115 115 U+A720-A7FF; 116 116 } 117 117
+7
web/src/lib/docs-registry.ts
··· 51 51 "Securely transfer your identity keypair to new devices using your PDS as a relay.", 52 52 }, 53 53 { 54 + slug: "cli", 55 + title: "The CLI Manual", 56 + icon: "terminal", 57 + description: 58 + "Complete command reference for the Opake CLI — identity, files, sharing, and more.", 59 + }, 60 + { 54 61 slug: "glossary", 55 62 title: "Glossary", 56 63 icon: "book",
+2
web/src/routes/_public/docs/$slug.tsx
··· 10 10 import SharingDids from "@/content/docs/sharing-dids.mdx"; 11 11 import Keyrings from "@/content/docs/keyrings.mdx"; 12 12 import Pairing from "@/content/docs/pairing.mdx"; 13 + import Cli from "@/content/docs/cli.mdx"; 13 14 import Glossary from "@/content/docs/glossary.mdx"; 14 15 import Faq from "@/content/faq.mdx"; 15 16 ··· 22 23 "sharing-dids": SharingDids, 23 24 keyrings: Keyrings, 24 25 pairing: Pairing, 26 + cli: Cli, 25 27 glossary: Glossary, 26 28 faq: Faq, 27 29 };
+2
web/src/routes/cabinet/docs/$slug.tsx
··· 11 11 import SharingDids from "@/content/docs/sharing-dids.mdx"; 12 12 import Keyrings from "@/content/docs/keyrings.mdx"; 13 13 import Pairing from "@/content/docs/pairing.mdx"; 14 + import Cli from "@/content/docs/cli.mdx"; 14 15 import Glossary from "@/content/docs/glossary.mdx"; 15 16 import Faq from "@/content/faq.mdx"; 16 17 ··· 25 26 "sharing-dids": SharingDids, 26 27 keyrings: Keyrings, 27 28 pairing: Pairing, 29 + cli: Cli, 28 30 glossary: Glossary, 29 31 faq: Faq, 30 32 };