Retro Bulletin Board Systems on atproto. Web app and TUI. lazy mirror of alyraffauf/atbbs atbbs.xyz
forums python tui atproto bbs
3
fork

Configure Feed

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

update docs/blurbs

+17 -20
+2 -2
README.md
··· 6 6 </p> 7 7 <img width="128" height="128" src="assets/logo.svg" alt="@bbs logo"> 8 8 <h1>@bbs</h1> 9 - <p>Bulletin boards on <a href="https://atproto.com">atproto</a>. Web app and terminal client.</p> 9 + <p>Build a community from your existing account. Tightly curated, fully portable, open by design. Built on <a href="https://atproto.com">atproto</a>.</p> 10 10 <img src="assets/screenshot.png" alt="@bbs screenshot" width="800"> 11 11 </div> 12 12 13 13 ## Features 14 14 15 - - **Web and terminal**: Use it in your browser or dial in from a TUI. 15 + - **Web and terminal**: Use it in your browser, dial in from a TUI, or connect via <a href="telnet://tel.atbbs.xyz">telnet</a>. 16 16 - **Serverless**: Run a BBS straight from your atproto account. No hosting required. 17 17 - **Replies and quotes**: Flat threads with inline quoting. 18 18 - **Attachments**: Upload files to threads and replies.
+1 -1
tui/screens/home.py
··· 43 43 "Bulletin boards on the Atmosphere.", classes="subtitle", id="hero-sub1" 44 44 ) 45 45 yield Static( 46 - "Run a BBS from your own account. No server required. Users own their posts, communities migrate freely.", 46 + "Build a community from your existing account. Tightly curated, fully portable, open by design.", 47 47 classes="subtitle", 48 48 id="hero-sub2", 49 49 )
-11
web/package-lock.json
··· 115 115 "resolved": "https://registry.npmjs.org/@atcute/identity/-/identity-1.1.4.tgz", 116 116 "integrity": "sha512-RCw1IqflfuSYCxK5m0lZCm0UnvIzcUnuhngiBhJEJb9a9Mc2SEf1xP3H8N5r8pvEH1LoAYd6/zrvCNU+uy9esw==", 117 117 "license": "0BSD", 118 - "peer": true, 119 118 "dependencies": { 120 119 "@atcute/lexicons": "^1.2.9", 121 120 "@badrap/valita": "^0.4.6" ··· 126 125 "resolved": "https://registry.npmjs.org/@atcute/identity-resolver/-/identity-resolver-1.2.2.tgz", 127 126 "integrity": "sha512-eUh/UH4bFvuXS0X7epYCeJC/kj4rbBXfSRumLEH4smMVwNOgTo7cL/0Srty+P/qVPoZEyXdfEbS0PHJyzoXmHw==", 128 127 "license": "0BSD", 129 - "peer": true, 130 128 "dependencies": { 131 129 "@atcute/lexicons": "^1.2.6", 132 130 "@atcute/util-fetch": "^1.0.5", ··· 380 378 "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", 381 379 "dev": true, 382 380 "license": "MIT", 383 - "peer": true, 384 381 "dependencies": { 385 382 "@babel/code-frame": "^7.29.0", 386 383 "@babel/generator": "^7.29.0", ··· 3317 3314 "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", 3318 3315 "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", 3319 3316 "license": "MIT", 3320 - "peer": true, 3321 3317 "dependencies": { 3322 3318 "csstype": "^3.2.2" 3323 3319 } ··· 3398 3394 "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", 3399 3395 "dev": true, 3400 3396 "license": "MIT", 3401 - "peer": true, 3402 3397 "dependencies": { 3403 3398 "fast-deep-equal": "^3.1.3", 3404 3399 "fast-uri": "^3.0.1", ··· 3600 3595 } 3601 3596 ], 3602 3597 "license": "MIT", 3603 - "peer": true, 3604 3598 "dependencies": { 3605 3599 "baseline-browser-mapping": "^2.10.12", 3606 3600 "caniuse-lite": "^1.0.30001782", ··· 6613 6607 "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", 6614 6608 "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", 6615 6609 "license": "MIT", 6616 - "peer": true, 6617 6610 "engines": { 6618 6611 "node": ">=0.10.0" 6619 6612 } ··· 6623 6616 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", 6624 6617 "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", 6625 6618 "license": "MIT", 6626 - "peer": true, 6627 6619 "dependencies": { 6628 6620 "scheduler": "^0.27.0" 6629 6621 }, ··· 7485 7477 "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", 7486 7478 "dev": true, 7487 7479 "license": "BSD-2-Clause", 7488 - "peer": true, 7489 7480 "dependencies": { 7490 7481 "@jridgewell/source-map": "^0.3.3", 7491 7482 "acorn": "^8.15.0", ··· 7920 7911 "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", 7921 7912 "dev": true, 7922 7913 "license": "MIT", 7923 - "peer": true, 7924 7914 "dependencies": { 7925 7915 "esbuild": "^0.25.0", 7926 7916 "fdir": "^6.4.4", ··· 8327 8317 "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", 8328 8318 "dev": true, 8329 8319 "license": "MIT", 8330 - "peer": true, 8331 8320 "bin": { 8332 8321 "rollup": "dist/bin/rollup" 8333 8322 },
+14 -6
web/src/pages/Home.tsx
··· 70 70 style={{ width: 276, imageRendering: "pixelated" }} 71 71 /> 72 72 <h1 className="text-lg text-neutral-400 mb-3"> 73 - Bulletin boards on the Atmosphere. 74 - </h1> 75 - <p className="text-neutral-500 max-w-md mx-auto"> 76 - Run a BBS from your own account. No server required. Users own their 77 - posts, communities migrate freely. Built on{" "} 73 + Bulletin boards on the{" "} 78 74 <a 79 75 href="https://atproto.com" 80 76 className="text-neutral-400 hover:text-neutral-300 underline underline-offset-2" 81 77 > 82 - atproto 78 + Atmosphere 83 79 </a> 84 80 . 81 + </h1> 82 + <p className="text-neutral-500 max-w-md mx-auto"> 83 + Build a community from your existing account. Tightly curated, fully 84 + portable, open by design. 85 85 </p> 86 86 </div> 87 87 ··· 167 167 <span className="text-neutral-500 select-none">$ </span>atbbs 168 168 </pre> 169 169 )} 170 + </div> 171 + 172 + <div className="border-t border-neutral-800 py-4"> 173 + <h2 className="text-neutral-300 mb-4">Or dial in via telnet</h2> 174 + <pre className="bg-neutral-900 border border-neutral-800 rounded px-4 py-3 text-neutral-400 text-xs"> 175 + <span className="text-neutral-500 select-none">$ </span>telnet 176 + tel.atbbs.xyz 177 + </pre> 170 178 </div> 171 179 </div> 172 180 );