Sketchy Place is a live personal scrapbook page for the things that usually get scattered across apps: runs, repositories, music, posts, projects, and trips. It turns those feeds into a hand-drawn dashboard with cached data, real-time updates, and a secured admin board for keeping the whole page curated.
- Fitness: Strava-backed mileage doodles, recent activities, activity summaries, training detail, and route/map sketches where activity geometry is available.
- Projects: GitHub profile details, a contribution chart styled like GitHub but drawn with a looser sketchbook feel, and editable project showcase cards.
- Music: Spotify currently-listening state, recent tracks, playlist-aware playback detail, and listening stats designed for short refresh cycles.
- Vacations: Polaroid-style travel notes with hand-drawn place outlines, dates, and small story fragments.
- Posts and blogs: Markdown-driven entries that can be published, hidden, edited, and arranged from the admin side.
The site is meant to feel like a desk covered in paper, tape, cutouts, map scribbles, and live notes.
- Hand-drawn cards, torn-paper shadows, sketchy charts, and imperfect layout rotations.
- A restrained orange, black, and white visual system with occasional data-specific accents.
- Frontend updates through a Server-Sent Events stream so connected browsers can refresh when the backend detects changed content.
- Lightweight local persistence through SQLite, so the public page remains fast even when integrations are unavailable or rate-limited.
The private admin panel is the control board for the site. It supports secured editing for profile content, project cards, posts, vacations, and visibility toggles. The public page reads from the cached database, while admin edits and fetch jobs publish change events for connected clients.
Sketchy Place currently supports:
- GitHub: public activity, profile data, repositories, and contribution calendar data.
- Spotify: live playback, recent tracks, playlist-aware listening context, and short-interval refreshes.
- Strava: activity ingestion, summary metrics, and route data for map doodles.
Spotify is intentionally refreshed more often than the other integrations because songs change every few minutes. GitHub can refresh through the scheduler or webhook. Strava is treated as lower-frequency activity data.
server.pyserves the public site, admin routes, JSON APIs, OAuth callbacks, webhooks, and/api/events.static/contains the browser app and visual system.cron/contains one-shot fetchers, OAuth helpers, and the scheduler.data/sketchy_place_cache.dbis the local runtime cache and content database.
Create local configuration:
Copy-Item .env.example .envEdit .env and set at least:
SKETCHY_ADMIN_USERNAME=your-name
SKETCHY_ADMIN_PASSWORD=a-long-random-password
Start the site:
python server.pyOpen:
http://127.0.0.1:8000
Run the integration scheduler in a second terminal:
python -B cron\scheduler.pyRun all fetchers once:
python cron/fetch_all.pyGitHub webhook target:
POST http://YOUR_PUBLIC_TUNNEL/api/webhooks/github
Set GITHUB_WEBHOOK_SECRET before enabling this endpoint. Unsigned webhooks are rejected unless SKETCHY_ALLOW_UNSIGNED_WEBHOOKS=1 is set for local testing.
OAuth helpers:
python -B cron\oauth_setup.py strava-url
python -B cron\oauth_setup.py strava-code CODE_FROM_CALLBACK
python -B cron\oauth_setup.py spotify-url
python -B cron\oauth_setup.py spotify-code CODE_FROM_CALLBACKSupported .env variables:
PORT: local server port.SKETCHY_ADMIN_USERNAME: admin username.SKETCHY_ADMIN_PASSWORD: required admin password.SKETCHY_FETCH_INTERVAL_SECONDS: legacy fallback for the GitHub scheduler interval.GITHUB_FETCH_INTERVAL_SECONDS: GitHub scheduler interval; defaults to 900 seconds.SPOTIFY_FETCH_INTERVAL_SECONDS: Spotify scheduler interval; defaults to 15 seconds.STRAVA_FETCH_INTERVAL_SECONDS: Strava scheduler interval; defaults to 86400 seconds.GITHUB_USERNAME: fetches public GitHub events and updates the GitHub widget.GITHUB_TOKEN: optional token for higher GitHub API rate limits.GITHUB_WEBHOOK_SECRET: HMAC secret for/api/webhooks/github.LASTFM_USERNAME: labels the music widget.SPOTIFY_CLIENT_ID,SPOTIFY_CLIENT_SECRET,SPOTIFY_REFRESH_TOKEN: Spotify OAuth values for current/recent playback.SPOTIFY_TRACK: static fallback for the Spotify/Last.fm widget.STRAVA_CLIENT_ID,STRAVA_CLIENT_SECRET,STRAVA_REFRESH_TOKEN: Strava OAuth values.STRAVA_REDIRECT_URI,SPOTIFY_REDIRECT_URI: OAuth callback URLs; default tohttp://127.0.0.1:8000/oauth/callback.
