Skip to content

Commit 62ff443

Browse files
Merge pull request #4 from effect-native/copilot/add-todo-folder-for-16colos
2 parents b4708ab + 26ac78b commit 62ff443

File tree

2 files changed

+400
-0
lines changed

2 files changed

+400
-0
lines changed

TODO/16colors-tui-bbs-viewer.md

Lines changed: 346 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,346 @@
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

Comments
 (0)