No description
- JavaScript 33.7%
- CSS 30.4%
- Python 18.5%
- HTML 17%
- Dockerfile 0.4%
|
|
||
|---|---|---|
| showcase_images | ||
| static | ||
| templates | ||
| .gitignore | ||
| app.py | ||
| config.json | ||
| docker-compose.yml | ||
| Dockerfile | ||
| LICENSE | ||
| README.md | ||
| requirements.txt | ||
Made using an AI agent - not made to be exposed to the internet
💕 ThingsRadar
Track how long since you last contacted anything — people, projects, games, habits — organized in lists.
Run with Docker
docker compose up -d --build
Then open http://localhost:5050 — you'll land on the list index.
Navigate to any list by URL: http://localhost:5050/friends, http://localhost:5050/sports, etc.
A list is created automatically the first time you add someone to it.
Features
- Grid of cards — avatar (your URL or auto-generated via DiceBear if none provided)
- Last Talked To and Last Seen IRL dates (date only, no time)
- Border color gradient: green (recent) → orange → red (past threshold), configurable per-list via ⚙️ settings (default 14 days)
- Multiple lists via routes:
/<list_name>(e.g./friends,/sports,/games) - Reversed mode — per-list toggle that flips colors (recent = red, old = green) and sort order (oldest first). Useful for things where recency is bad (e.g. "last time I had to fix this")
- Card size — per-list setting (small / medium / big) controls how large cards are in the grid
- Sortable: most recent contact (default), name A→Z, name Z→A, recently added
- Search bar to filter by name
- Duplicate name check — confirms before adding a name that already exists in the list
- Responsive grid — compact cards on mobile (2+ per row)
- Title is clickable — goes back to the home page
- Click a card → detail modal with inline editing (name, image, dates, notes) and quick-action buttons: "💬 Talked Now" and "👁️ Seen IRL Now"
- Add modal to input new people
- Tags — add comma-separated tags to any entry, filter by clicking tag chips in the tag bar
- Cute pinkish/red theme with emojis and ✨ sparkles on interactions
- JSON storage — one file per list in
data/, fully portable
Storage
data/
friends.json
sports.json
...
_meta.json ← per-list settings (threshold, reversed mode)
config.json ← global defaults (dicebear style, site name, default threshold)
API
| Method | Endpoint | Description |
|---|---|---|
GET |
/<list_name> |
Grid page |
GET |
/api/<list_name> |
All people in list |
POST |
/api/<list_name> |
Add person |
PUT |
/api/<list_name>/<id> |
Update person |
DELETE |
/api/<list_name>/<id> |
Delete person |
POST |
/api/<list_name>/<id>/talked/0 |
Mark talked today |
POST |
/api/<list_name>/<id>/seen/0 |
Mark seen IRL today |
GET |
/api/<list_name>/settings |
Get list settings |
PUT |
/api/<list_name>/settings |
Update list settings (threshold_days, reversed) |
GET |
/api/config |
Get global config |
PUT |
/api/config |
Update global config |
Without Docker
pip install -r requirements.txt
python app.py


