Skip to content

Latest commit

ย 

History

2,132 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Piotrunius Portfolio

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.


โœจ Key Features

  • ๐ŸŽจ 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

๐Ÿ›  Tech Stack

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

๐Ÿ“‚ Project Structure

.
โ”œโ”€โ”€ ๐Ÿ“„ 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

๐Ÿš€ Getting Started

Local Development

Option 1: Direct File

Simply open index.html in your browser.

Option 2: Local Server

# Python 3
python -m http.server 8000

# Or Node.js
npx http-server

Then visit: http://localhost:8000

API Configuration

The live status panels require Cloudflare Workers to fetch real-time data.

Quick Setup

  1. Create Cloudflare Workers Project

  2. Create KV Namespace

    wrangler kv:namespace create "STATE"
  3. Deploy Workers

    • Copy each .js file from api/ folder
    • Deploy to Cloudflare (or use Wrangler CLI)
  4. 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_PASSWORD secret must store a SHA-256 hash of the admin password, not the plaintext. Generate the hash locally with echo -n "your-password" | sha256sum (take the hex output, drop the trailing -), or compute it in a Worker with crypto.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.

  1. Update API URLs
    • Edit app.js to point to your deployed workers
    • Example: https://workers.example.com/spotify

๐Ÿ”Œ API Workers

Each worker requires specific environment variables and API credentials.

Available Workers

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

Privacy Mode

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"
}

๐ŸŽจ Customization

Change Colors & Theme

Edit styles.css to customize:

  • Primary color: --primary
  • Background: --bg
  • Other variables: --text, --border, --card-bg, --glass-bg (see styles.css :root)

Update Profile Info

Edit index.html:

  • Name, bio, links in the hero section
  • Social media URLs
  • Contact information

Modify Project Data

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 }
  ]
}
  • repo must match the GitHub repository name exactly (app.js matches configMap against repo.name).
  • type is one of archive, current, active, or collab (used as displayType; falls back to active).
  • order is an integer sort order (lower values appear first).

๐Ÿ“ฑ Features in Detail

๐ŸŽต Audio Player

  • Local music playback with visualizer
  • Play/pause controls

๐Ÿ“Š Status Panels

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.


๐ŸŒ Live Site

https://piotrunius.dev/


๐Ÿ“– Documentation


๐Ÿ”— Contact & Links

Platform Link
Discord @alciaforlife
GitHub @Piotrunius
Email contact@piotrunius.dev

๐Ÿ“„ License

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.


๐Ÿ™ Acknowledgments


Made with โค๏ธ by Piotrunius

About

Personal Bio Page

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages