A beautiful, modern portfolio website showcasing real-time presence across multiple platforms. Features live status panels from Spotify, Steam, GitHub, Discord, and Roblox, combined with a glassmorphism design and interactive audio player.
Authorship Note: This project was created by a human with approximately 15-20% AI assistance for ideation, wording, and refinements.
- ๐จ Modern UI - Modern frosted-glass aesthetic with smooth animations
- ๐ป Synchronized Ghost Loaders - Elegant skeleton loading screens that reveal all statuses simultaneously
- ๐ต Local Audio Player - Built-in music player with visualizer
- ๐ Live Status Panels - Real-time data from:
- ๐ต Spotify (currently playing song)
- ๐ GitHub (profile stats & repositories)
- ๐ฎ Steam (player status & game)
- ๐ฌ Discord (status & activities via Lanyard)
- ๐ฎ Roblox (presence status)
- ๐ฑ PWA Support - Install as app + offline caching
- ๐ Responsive Design - Works on desktop, tablet, mobile
- ๐ Privacy Mode - Global kill-switch for all data with a native browser prompt authentication
- ๐ก๏ธ Robust Fallbacks - Graceful error handling UI with default Offline states when APIs are unreachable
| Technology | Purpose |
|---|---|
| HTML5 | Semantic markup |
| CSS3 | Modern styling & animations |
| JavaScript (ES6+) | Interactivity & API calls |
| Cloudflare Workers | Serverless API layer |
| KV Storage | Token caching & settings |
| Font Awesome 6.5.1 | Icon library |
.
โโโ ๐ index.html # Main HTML
โโโ ๐ 404.html # Custom error page
โโโ ๐จ styles.css # Global styles
โโโ โ๏ธ app.js # Main JavaScript
โโโ ๐ง sw.js # Service Worker
โโโ ๐ manifest.json # PWA manifest
โโโ ๐ projects.json # Project data
โโโ ๐ค robots.txt # Search engine rules
โโโ ๐บ๏ธ sitemap.xml # XML sitemap
โโโ ๐ CNAME # Custom domain configuration
โโโ ๐ผ assets/ # Static assets
โ โโโ pfp.* # Profile pictures
โ โโโ audio.mp3 # Background music
โ โโโ nobara-icon.* # OS icons
โ โโโ *.svg # Social icons
โโโ ๐ api/ # Cloudflare Workers
โ โโโ spotify.js # Spotify integration
โ โโโ github.js # GitHub integration
โ โโโ steam.js # Steam integration
โ โโโ discord.js # Discord integration
โ โโโ roblox.js # Roblox integration
โ โโโ admin.js # Admin endpoint
โ โโโ wrangler.*.toml # Worker configurations
โโโ ๐ .github/workflows/ # CI/CD pipelines
โโโ deploy.yml # GitHub Actions deployment
Simply open index.html in your browser.
# Python 3
python -m http.server 8000
# Or Node.js
npx http-serverThen visit: http://localhost:8000
The live status panels require Cloudflare Workers to fetch real-time data.
-
Create Cloudflare Workers Project
- Visit dash.cloudflare.com
- Create a new Workers project
-
Create KV Namespace
wrangler kv:namespace create "STATE" -
Deploy Workers
- Copy each
.jsfile fromapi/folder - Deploy to Cloudflare (or use Wrangler CLI)
- Copy each
-
Add Secrets to Dashboard
SPOTIFY_CLIENT_ID = "..." SPOTIFY_CLIENT_SECRET = "..." SPOTIFY_REFRESH_TOKEN = "..." GITHUB_TOKEN = "..." STEAM_API_KEY = "..." STEAM_ID = "..." DISCORD_ID = "..." ROBLOX_USER_ID = "..." ADMIN_PASSWORD = "..."
Admin password (SHA-256): The
ADMIN_PASSWORDsecret must store a SHA-256 hash of the admin password, not the plaintext. Generate the hash locally withecho -n "your-password" | sha256sum(take the hex output, drop the trailing-), or compute it in a Worker withcrypto.subtle.digest('SHA-256', ...). Use a strong, high-entropy password. Note: this is a source/config change only - no deploy is part of this cleanup.
- Update API URLs
- Edit
app.jsto point to your deployed workers - Example:
https://workers.example.com/spotify
- Edit
Each worker requires specific environment variables and API credentials.
| Worker | Data | Secrets |
|---|---|---|
| spotify.js | ๐ต Playing song | SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET, SPOTIFY_REFRESH_TOKEN |
| github.js | ๐ Profile & repos | GITHUB_TOKEN, GITHUB_USERNAME |
| steam.js | ๐ฎ Player status | STEAM_API_KEY, STEAM_ID |
| discord.js | ๐ฌ Status & activities | DISCORD_ID |
| roblox.js | ๐ฎ Presence status | ROBLOX_USER_ID |
| admin.js | ๐ Privacy Mode toggle | ADMIN_PASSWORD |
All workers respect a global Privacy Mode flag:
KV Namespace: STATE
Key: PRIVACY_MODE
Value: "true" | "false"
When enabled, all APIs return:
{
"privacyMode": true,
"message": "Privacy Mode Active"
}Edit styles.css to customize:
- Primary color:
--primary - Background:
--bg - Other variables:
--text,--border,--card-bg,--glass-bg(seestyles.css:root)
Edit index.html:
- Name, bio, links in the hero section
- Social media URLs
- Contact information
Edit projects.json to add/remove projects:
{
"projects": [
{ "repo": "NexVid", "type": "archive", "order": 1 },
{ "repo": "Biography", "type": "current", "order": 2 },
{ "repo": "Exam-Scraper", "type": "active", "order": 3 },
{ "repo": "Broadcast-generator", "type": "collab", "order": 4 }
]
}repomust match the GitHub repository name exactly (app.js matchesconfigMapagainstrepo.name).typeis one ofarchive,current,active, orcollab(used asdisplayType; falls back toactive).orderis an integer sort order (lower values appear first).
- Local music playback with visualizer
- Play/pause controls
Real-time data updates (configurable interval):
- Spotify: Album art, song title, artist, progress
- GitHub: Profile picture, repos, followers, stats, and animated skeletons for recent activity
- Steam: Avatar, username, current game, status
- Discord: Status indicator, current activity, avatar
- Roblox: Presence status, avatar, game location
Note: Status panels use a coordinated loading mechanism, ensuring Discord, Steam, and Roblox data fetches are fully settled before gracefully revealing the content together from a skeleton state.
| Platform | Link |
|---|---|
| Discord | @alciaforlife |
| GitHub | @Piotrunius |
| contact@piotrunius.dev |
This project is licensed under the MIT License.
Feel free to use, modify, and distribute this code as long as you include the original license.
- Font Awesome - Icon library
- Cloudflare - Workers & KV storage
- Lanyard - Discord status API
- The open-source community
Made with โค๏ธ by Piotrunius