200 lines
5.9 KiB
Markdown
200 lines
5.9 KiB
Markdown
# wttr.in Zig Rewrite Documentation
|
|
|
|
This directory contains comprehensive documentation for rewriting wttr.in in Zig.
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# Minimal setup (uses defaults)
|
|
./wttr
|
|
|
|
# With IP2Location fallback (optional)
|
|
IP2LOCATION_API_KEY=your_key_here ./wttr
|
|
|
|
# Custom cache location
|
|
WTTR_CACHE_DIR=/var/cache/wttr ./wttr
|
|
```
|
|
|
|
See [CACHE_CONFIGURATION.md](CACHE_CONFIGURATION.md) for detailed configuration options.
|
|
|
|
## External Services & API Keys
|
|
|
|
### Required Services (No API Key)
|
|
- **Met.no Weather API** - Primary weather data provider
|
|
- Free, open API from Norwegian Meteorological Institute
|
|
- No registration required
|
|
- Rate limit: Be respectful, use caching (built-in)
|
|
|
|
### Optional Services
|
|
- **IP2Location.io** - Fallback IP geolocation
|
|
- **API Key Required:** Sign up at https://www.ip2location.io/
|
|
- Free tier: 30,000 requests/month
|
|
- Only used when MaxMind GeoIP database lookup fails
|
|
- Set via `IP2LOCATION_API_KEY` environment variable
|
|
|
|
### Database Files (Auto-Downloaded)
|
|
- **MaxMind GeoLite2 City** - IP geolocation database
|
|
- Free database, automatically downloaded if missing
|
|
- No API key required
|
|
- Stored in `~/.cache/wttr/GeoLite2-City.mmdb` by default
|
|
|
|
## Current Implementation Status
|
|
|
|
### Implemented Features
|
|
- HTTP server with routing and middleware
|
|
- Rate limiting
|
|
- Caching system
|
|
- GeoIP database integration (libmaxminddb)
|
|
- Location resolver with multiple input types
|
|
- Weather provider (Met.no) with timezone-aware forecasts; core data structures use zeit.Time/zeit.Date for type-safe date/time handling
|
|
- Output formats: ANSI, line (1-4), JSON (j1), v2 data-rich, custom (%)
|
|
- Query parameter parsing
|
|
- Static help pages (/:help, /:translation)
|
|
- Error handling (404/500 status codes)
|
|
- Configuration from environment variables
|
|
- **Imperial units auto-detection**: Automatically uses imperial units (°F, mph) for US IP addresses and `lang=us`, with explicit `?u` and `?m` overrides
|
|
- **IP2Location fallback**: Optional fallback geolocation service with persistent cache
|
|
|
|
### Missing Features (To Be Implemented Later)
|
|
|
|
1. **Prometheus Metrics Format** (format=p1)
|
|
- Export weather data in Prometheus metrics format
|
|
- See API_ENDPOINTS.md for format specification
|
|
|
|
2. **PNG Generation**
|
|
- Render weather reports as PNG images
|
|
- Support transparency and custom styling
|
|
- Requires image rendering library integration
|
|
|
|
3. **Multiple Locations Support**
|
|
- Handle colon-separated locations (e.g., `London:Paris:Berlin`)
|
|
- Process and display weather for multiple cities in one request
|
|
|
|
4. **Language/Localization**
|
|
- Accept-Language header parsing
|
|
- lang query parameter support
|
|
- Translation of weather conditions and text (54 languages)
|
|
|
|
5. **Moon Phase Calculation**
|
|
- Real moon phase computation based on date
|
|
- Moon phase emoji display
|
|
- Moonday calculation
|
|
|
|
6. **Astronomical Times**
|
|
- Calculate dawn, sunrise, zenith, sunset, dusk times
|
|
- Based on location coordinates and timezone
|
|
- Display in custom format output
|
|
|
|
## Documentation Files
|
|
|
|
### [CACHE_CONFIGURATION.md](CACHE_CONFIGURATION.md) ⭐ NEW
|
|
Complete cache and external services documentation:
|
|
- External services (Met.no, IP2Location, MaxMind GeoLite2)
|
|
- API key requirements
|
|
- Cache locations and policies
|
|
- Expiration and eviction strategies
|
|
- Environment variables
|
|
- Configuration examples
|
|
|
|
### [TARGET_ARCHITECTURE.md](TARGET_ARCHITECTURE.md)
|
|
Target architecture for Zig rewrite:
|
|
- Single binary design
|
|
- Simplified caching (one layer)
|
|
- Pluggable weather provider interface
|
|
- Rate limiting middleware
|
|
- Module structure
|
|
- Testing strategy
|
|
- Performance targets
|
|
|
|
### [ARCHITECTURE.md](ARCHITECTURE.md)
|
|
Current system architecture documentation:
|
|
- Component breakdown (Go proxy, Python backend, static assets)
|
|
- Request flow diagrams
|
|
- API endpoints
|
|
- External dependencies
|
|
- Caching strategy
|
|
- Configuration
|
|
- Known issues
|
|
|
|
### [API_ENDPOINTS.md](API_ENDPOINTS.md)
|
|
Complete API reference:
|
|
- All endpoints with examples
|
|
- Query parameters
|
|
- Output formats
|
|
- Language support
|
|
- HTTP headers
|
|
- Rate limits
|
|
- Usage examples
|
|
|
|
### [DATA_FLOW.md](DATA_FLOW.md)
|
|
Detailed request processing flow:
|
|
- Step-by-step request handling
|
|
- Location resolution process
|
|
- Weather data fetching
|
|
- Rendering pipeline
|
|
- Caching mechanisms
|
|
- Error handling
|
|
- Performance optimizations
|
|
|
|
### [REWRITE_STRATEGY.md](REWRITE_STRATEGY.md)
|
|
Comprehensive rewrite plan:
|
|
- Goals and non-goals
|
|
- Phase-by-phase breakdown (10-11 weeks)
|
|
- Module organization
|
|
- Testing strategy
|
|
- Risk mitigation
|
|
- Success criteria
|
|
- Alternative approaches
|
|
|
|
## Quick Start
|
|
|
|
1. **Read ARCHITECTURE.md** - Understand the current system
|
|
2. **Read DATA_FLOW.md** - Understand how requests are processed
|
|
3. **Read REWRITE_STRATEGY.md** - Understand the rewrite plan
|
|
4. **Refer to API_ENDPOINTS.md** - When implementing specific endpoints
|
|
|
|
## Current System Summary
|
|
|
|
**Architecture:** Hybrid Python/Go
|
|
- Go proxy (port 8082): LRU caching, prefetching
|
|
- Python backend (port 8002): Weather logic, rendering
|
|
- External binaries: wego (Go), pyphoon (Python)
|
|
- External services: Geolocator (port 8004)
|
|
|
|
**Key Stats:**
|
|
- ~5000 lines of Python
|
|
- ~400 lines of Go
|
|
- 54 languages supported
|
|
- 12,800 entry LRU cache
|
|
- 1000-2000s cache TTL
|
|
- Zero unit tests (only integration tests)
|
|
|
|
**Main Challenges:**
|
|
1. ANSI weather rendering (currently done by wego)
|
|
2. PNG image generation (PIL + pyte)
|
|
3. GeoIP database parsing (MaxMind format)
|
|
4. 54 language translations
|
|
5. Multiple output formats (ANSI, HTML, PNG, JSON, Prometheus)
|
|
|
|
## Recommended Approach
|
|
|
|
**Option A: Incremental (Recommended)**
|
|
1. Replace Go proxy with Zig (2 weeks)
|
|
2. Test and deploy
|
|
3. Replace Python backend with Zig (8-9 weeks)
|
|
4. Full cutover
|
|
|
|
**Option B: Full Rewrite**
|
|
- All at once (10-11 weeks)
|
|
- Higher risk, but cleaner result
|
|
|
|
## Next Steps
|
|
|
|
1. Review documentation
|
|
2. Choose rewrite strategy
|
|
3. Set up Zig project structure
|
|
4. Begin implementation (start with HTTP server or Go proxy)
|
|
|
|
## Questions?
|
|
|
|
See REWRITE_STRATEGY.md "Questions to Answer" section for key decisions needed.
|