|
| 1 | +# 16colo.rs TUI - BBS-Style Artpack Viewer |
| 2 | + |
| 3 | +## Concept |
| 4 | + |
| 5 | +Build a terminal-based user interface (TUI) that emulates the experience of visiting an old 1990s BBS to download and view artpacks. The application should feel authentically retro while leveraging modern technology for reliability and performance. |
| 6 | + |
| 7 | +## Core Experience |
| 8 | + |
| 9 | +Users should feel like they've dialed into a classic BBS through a slow modem connection, experiencing the nostalgia of: |
| 10 | +- Character-by-character text drawing |
| 11 | +- Slow ANSI art reveals |
| 12 | +- Classic BBS menus and navigation |
| 13 | +- The anticipation of downloading artpacks |
| 14 | +- The satisfaction of browsing freshly downloaded art |
| 15 | + |
| 16 | +## Key Features |
| 17 | + |
| 18 | +### 1. Dual-Speed Architecture |
| 19 | + |
| 20 | +The application operates on two distinct speed layers: |
| 21 | + |
| 22 | +**Fast Layer (Backend)**: |
| 23 | +- Download artpacks from 16colo.rs at full modern internet speeds |
| 24 | +- Pre-fetch and cache data efficiently |
| 25 | +- Process and index metadata in the background |
| 26 | +- No actual delays in data transfer |
| 27 | + |
| 28 | +**Slow Layer (Presentation)**: |
| 29 | +- Emulate 2400-9600 baud modem speeds for visual rendering |
| 30 | +- Character-by-character text drawing |
| 31 | +- Line-by-line ANSI art reveals |
| 32 | +- Classic "downloading..." progress indicators with retro animations |
| 33 | +- Configurable speed settings (2400, 9600, 14400, 28800 baud) |
| 34 | + |
| 35 | +### 2. BBS Interface |
| 36 | + |
| 37 | +**Main Menu Style**: |
| 38 | +``` |
| 39 | +╔═══════════════════════════════════════════════════════════╗ |
| 40 | +║ 16COLO.RS BBS ║ |
| 41 | +║ ║ |
| 42 | +║ [A]rtpack Browser ║ |
| 43 | +║ [S]earch Archive ║ |
| 44 | +║ [R]andom Art ║ |
| 45 | +║ [D]ownload Manager ║ |
| 46 | +║ [F]avorites ║ |
| 47 | +║ [O]ptions (Connection Speed) ║ |
| 48 | +║ [Q]uit ║ |
| 49 | +║ ║ |
| 50 | +║ Choose an option: _ ║ |
| 51 | +╚═══════════════════════════════════════════════════════════╝ |
| 52 | +``` |
| 53 | + |
| 54 | +**Navigation**: |
| 55 | +- Classic single-key commands (A, S, R, D, F, Q) |
| 56 | +- Arrow key navigation in lists |
| 57 | +- Hotkeys for common actions |
| 58 | +- Status bar showing connection speed and time |
| 59 | + |
| 60 | +### 3. Artpack Browser |
| 61 | + |
| 62 | +**Browse by**: |
| 63 | +- Year (1990s-present) |
| 64 | +- Art group (ACiD, iCE, Blocktronics, etc.) |
| 65 | +- Artist name |
| 66 | +- Format type |
| 67 | +- Newest releases |
| 68 | + |
| 69 | +**Display**: |
| 70 | +- List view with metadata |
| 71 | +- Preview pane (rendered at emulated speed) |
| 72 | +- Artpack details (size, file count, release date) |
| 73 | +- Download indicator when pre-fetching |
| 74 | + |
| 75 | +### 4. Download Simulation |
| 76 | + |
| 77 | +**Visual Experience**: |
| 78 | +``` |
| 79 | +Connecting to 16colo.rs... |
| 80 | +[####################################] 100% |
| 81 | +
|
| 82 | +Downloading ACID-1996.ZIP... |
| 83 | +[#################### ] 67% (1.2MB/1.8MB) |
| 84 | +ETA: 00:45 @ 2400 baud |
| 85 | +
|
| 86 | +Extracting files... |
| 87 | +[####################################] 100% |
| 88 | +
|
| 89 | +138 files extracted successfully! |
| 90 | +``` |
| 91 | + |
| 92 | +**Actual Behavior**: |
| 93 | +- Artpack downloads immediately in background |
| 94 | +- Progress bar animates at emulated modem speed |
| 95 | +- Creates artificial ETA based on configured baud rate |
| 96 | +- Files are available instantly once "download" completes |
| 97 | + |
| 98 | +### 5. Art Viewer |
| 99 | + |
| 100 | +**Features**: |
| 101 | +- Full-screen ANSI art display |
| 102 | +- Reveal animation (line-by-line at configured speed) |
| 103 | +- Skip animation option (space bar) |
| 104 | +- Next/Previous navigation (arrow keys, vim keys) |
| 105 | +- Metadata overlay (F1 - artist, date, format, size) |
| 106 | +- Screenshot/export option |
| 107 | +- Return to browser (ESC) |
| 108 | + |
| 109 | +**Rendering**: |
| 110 | +- Use ansilust renderer for perfect CP437 display |
| 111 | +- Support all ansilust-compatible formats |
| 112 | +- Smooth scrolling for oversized art |
| 113 | +- Zoom in/out capability |
| 114 | + |
| 115 | +### 6. Connection Speed Settings |
| 116 | + |
| 117 | +**Emulated Speeds**: |
| 118 | +- 300 baud (ultra-slow, mostly for laughs) |
| 119 | +- 1200 baud (early modems) |
| 120 | +- 2400 baud (common 90s speed) |
| 121 | +- 9600 baud (faster 90s connection) |
| 122 | +- 14400 baud (V.32bis) |
| 123 | +- 28800 baud (V.34) |
| 124 | +- 56K (late 90s) |
| 125 | +- Instant (disable emulation) |
| 126 | + |
| 127 | +**What Speed Affects**: |
| 128 | +- ANSI art reveal speed |
| 129 | +- Menu text drawing speed |
| 130 | +- Progress bar animation speed |
| 131 | +- "Download" indicator timing |
| 132 | +- NOT actual data transfer (always instant) |
| 133 | + |
| 134 | +### 7. Aesthetic Details |
| 135 | + |
| 136 | +**Visual Elements**: |
| 137 | +- CP437 box-drawing characters |
| 138 | +- DOS color palette (16 colors) |
| 139 | +- Authentic ANSI art styling |
| 140 | +- Classic cursor blinking |
| 141 | +- Status indicators using ASCII art |
| 142 | +- Screen transitions (fade, scroll) |
| 143 | + |
| 144 | +**Sound Effects (Optional)**: |
| 145 | +- Modem handshake sound on startup |
| 146 | +- Key click sounds |
| 147 | +- Download progress beeps |
| 148 | +- "You've got art!" notification |
| 149 | + |
| 150 | +## Technical Architecture |
| 151 | + |
| 152 | +### Backend Components |
| 153 | + |
| 154 | +**Data Layer**: |
| 155 | +- 16colo.rs API integration |
| 156 | +- Local cache for downloaded artpacks |
| 157 | +- SQLite database for metadata indexing |
| 158 | +- Fast pre-fetch queue |
| 159 | +- Background sync service |
| 160 | + |
| 161 | +**Rendering Layer**: |
| 162 | +- Ansilust integration for art rendering |
| 163 | +- Character-by-character output buffer |
| 164 | +- Timing engine for speed emulation |
| 165 | +- Frame-based animation system |
| 166 | + |
| 167 | +**TUI Framework**: |
| 168 | +- vaxis (Zig TUI library) or similar |
| 169 | +- Event-driven input handling |
| 170 | +- Async I/O for non-blocking operations |
| 171 | +- Multi-threaded: UI thread + download thread |
| 172 | + |
| 173 | +### Speed Emulation Engine |
| 174 | + |
| 175 | +**Implementation**: |
| 176 | +```zig |
| 177 | +const BaudRate = enum { |
| 178 | + baud_300, |
| 179 | + baud_1200, |
| 180 | + baud_2400, |
| 181 | + baud_9600, |
| 182 | + baud_14400, |
| 183 | + baud_28800, |
| 184 | + baud_56k, |
| 185 | + instant, |
| 186 | +
|
| 187 | + pub fn charsPerSecond(self: BaudRate) f64 { |
| 188 | + return switch (self) { |
| 189 | + .baud_300 => 30.0, |
| 190 | + .baud_1200 => 120.0, |
| 191 | + .baud_2400 => 240.0, |
| 192 | + .baud_9600 => 960.0, |
| 193 | + .baud_14400 => 1440.0, |
| 194 | + .baud_28800 => 2880.0, |
| 195 | + .baud_56k => 5600.0, |
| 196 | + .instant => std.math.inf(f64), |
| 197 | + }; |
| 198 | + } |
| 199 | +
|
| 200 | + pub fn delayBetweenChars(self: BaudRate) u64 { |
| 201 | + // Returns nanoseconds between characters |
| 202 | + const cps = self.charsPerSecond(); |
| 203 | + if (std.math.isInf(cps)) return 0; |
| 204 | + return @intFromFloat(1_000_000_000.0 / cps); |
| 205 | + } |
| 206 | +}; |
| 207 | +``` |
| 208 | + |
| 209 | +**Character Output**: |
| 210 | +- Buffer complete output (pre-rendered) |
| 211 | +- Emit character-by-character with timing delays |
| 212 | +- Allow skip/fast-forward with key press |
| 213 | +- Instant mode for impatient users |
| 214 | + |
| 215 | +### File Organization |
| 216 | + |
| 217 | +``` |
| 218 | +TODO/ |
| 219 | +└── 16colors-tui-bbs-viewer.md (this file) |
| 220 | +
|
| 221 | +Future Implementation: |
| 222 | +src/ |
| 223 | +├── tui/ |
| 224 | +│ ├── main.zig # Application entry point |
| 225 | +│ ├── bbs_interface.zig # BBS-style menus |
| 226 | +│ ├── art_viewer.zig # Full-screen art display |
| 227 | +│ ├── browser.zig # Artpack browsing |
| 228 | +│ ├── speed_emulator.zig # Baud rate emulation |
| 229 | +│ └── effects.zig # Visual effects |
| 230 | +└── backend/ |
| 231 | + ├── sixteencolors_api.zig # API client |
| 232 | + ├── cache.zig # Local caching |
| 233 | + ├── downloader.zig # Background downloads |
| 234 | + └── indexer.zig # Metadata indexing |
| 235 | +``` |
| 236 | + |
| 237 | +## User Scenarios |
| 238 | + |
| 239 | +### Scenario 1: First-Time User |
| 240 | +1. Launch application (modem handshake sound plays) |
| 241 | +2. Main menu draws character-by-character |
| 242 | +3. User presses 'A' for Artpack Browser |
| 243 | +4. Browser menu animates in at configured speed |
| 244 | +5. User browses by year → 1996 |
| 245 | +6. Sees list of 1996 artpacks (ACiD, iCE, Fire, etc.) |
| 246 | +7. Selects ACiD 1996 |
| 247 | +8. "Downloading..." animation plays (artpack pre-cached instantly) |
| 248 | +9. File list appears |
| 249 | +10. User selects US-JELLY.ANS |
| 250 | +11. Art reveals line-by-line at 2400 baud speed |
| 251 | +12. User enjoys the nostalgia |
| 252 | + |
| 253 | +### Scenario 2: Power User |
| 254 | +1. Launch with instant mode enabled |
| 255 | +2. Main menu appears immediately |
| 256 | +3. User presses 'R' for random art |
| 257 | +4. Random artwork displays instantly |
| 258 | +5. User cycles through art rapidly with arrow keys |
| 259 | +6. User switches to 9600 baud for authentic feel |
| 260 | +7. Art reveals at medium speed |
| 261 | + |
| 262 | +### Scenario 3: Download Marathon |
| 263 | +1. User queues 20 artpacks for "download" |
| 264 | +2. Each downloads in background at full speed |
| 265 | +3. UI shows slow progress bars for nostalgia |
| 266 | +4. User browses already-downloaded art while "waiting" |
| 267 | +5. All artpacks available instantly once UI catches up |
| 268 | + |
| 269 | +## Development Phases |
| 270 | + |
| 271 | +### Phase 1: MVP |
| 272 | +- [ ] Basic TUI with main menu |
| 273 | +- [ ] Simple art viewer (no emulation) |
| 274 | +- [ ] 16colo.rs API integration |
| 275 | +- [ ] Local cache system |
| 276 | +- [ ] Browse by year/group |
| 277 | + |
| 278 | +### Phase 2: Speed Emulation |
| 279 | +- [ ] Implement baud rate emulation |
| 280 | +- [ ] Character-by-character rendering |
| 281 | +- [ ] Download progress animation |
| 282 | +- [ ] ANSI art line-by-line reveal |
| 283 | + |
| 284 | +### Phase 3: Full BBS Experience |
| 285 | +- [ ] Complete menu system |
| 286 | +- [ ] Search functionality |
| 287 | +- [ ] Favorites system |
| 288 | +- [ ] Enhanced visual effects |
| 289 | +- [ ] Configurable settings |
| 290 | + |
| 291 | +### Phase 4: Polish |
| 292 | +- [ ] Sound effects |
| 293 | +- [ ] Advanced navigation |
| 294 | +- [ ] Keyboard shortcuts |
| 295 | +- [ ] Statistics tracking |
| 296 | +- [ ] User preferences persistence |
| 297 | + |
| 298 | +## Why This Matters |
| 299 | + |
| 300 | +**Nostalgia**: Recreates authentic BBS experience for those who remember it. |
| 301 | + |
| 302 | +**Education**: Introduces younger users to BBS culture and history. |
| 303 | + |
| 304 | +**Preservation**: Makes 16colo.rs archive accessible and engaging. |
| 305 | + |
| 306 | +**Performance**: Demonstrates ansilust rendering capabilities. |
| 307 | + |
| 308 | +**Fun**: Delivers genuine enjoyment of the "slow reveal" aesthetic without actual slow downloads. |
| 309 | + |
| 310 | +**Practical**: Best of both worlds - modern speed with retro feel. |
| 311 | + |
| 312 | +## Implementation Notes |
| 313 | + |
| 314 | +- Use ansilust for rendering all ANSI art |
| 315 | +- Leverage Zig's async/await for non-blocking downloads |
| 316 | +- SQLite for local metadata and cache tracking |
| 317 | +- HTTP/2 for efficient API communication |
| 318 | +- Memory-efficient streaming for large artpacks |
| 319 | +- Configurable cache size and retention |
| 320 | +- Optional telemetry for popular artpacks |
| 321 | + |
| 322 | +## Inspiration |
| 323 | + |
| 324 | +- Classic BBS systems (1990s era) |
| 325 | +- ACiDView.exe (DOS art viewer) |
| 326 | +- terminal.shop (modern SSH BBS) |
| 327 | +- 16colo.rs website |
| 328 | +- Scene art culture |
| 329 | + |
| 330 | +## Future Enhancements |
| 331 | + |
| 332 | +- Multi-user support (shared viewing sessions) |
| 333 | +- Chat/comment system |
| 334 | +- Art upload capability |
| 335 | +- Collection management |
| 336 | +- Artpack statistics |
| 337 | +- Integration with other scene archives |
| 338 | +- Mobile TUI support (termux) |
| 339 | +- Web version with authentic terminal emulation |
| 340 | + |
| 341 | +--- |
| 342 | + |
| 343 | +**Status**: Concept/Planning Phase |
| 344 | +**Priority**: Medium (showcase project) |
| 345 | +**Dependencies**: Ansilust rendering engine |
| 346 | +**Target Audience**: ANSI art enthusiasts, retro computing fans, BBS nostalgia seekers |
0 commit comments