Inside-Joke Website Platform
When the universe has it out for you, document it with style.
A polished, drama-filled platform for creating hidden easter egg websites. Perfect for friend groups, private galleries, and chaotic inside jokes.
- π Enhanced Security: CSRF protection, session timeouts, file locking
- π¨ Hero Customization: Custom background images and text
- π Improved File Handling: Size limits, type validation, WebP conversion
- π Dark Mode: Light/dark theme toggle in admin panel
- β‘ Performance: Optimized uploads and concurrent access handling
- π‘οΈ Hardened Protection: Security headers, input validation, position clamping
Complete Website Bundle (~25KB compressed)
- 20+ PHP files (public site + admin panel)
- Responsive CSS stylesheets (light/dark mode)
- Vanilla JavaScript (tears, hotspots, media picker)
- Configuration & security files
- Full documentation
# 1. Extract to web hosting root
tar -xzf sucky-life-website.tar.gz
# 2. Set permissions
chmod -R 755 data/
# 3. Visit your domain
# Auto-redirects to setup wizard
# 4. Complete 4-field setup
# - Site name
# - Domain
# - Admin password
# - Confirm password
# 5. Add screech audio
# Upload MP3 to /assets/audio/screech.mp3
# 6. Login and create your first egg!That's it! No database, no dependencies, no complex configuration.
- β Dramatic Hero Section with customizable text and background
- β Unleash the Screech button (loops audio with controls)
- β Animated Tears that repel from cursor
- β Hidden Easter Egg Hotspots placed anywhere on screen
- β Glass-Morphism Modals with media + rich content
- β Optional Password Gate for privacy
- β Animated Setup Wizard (first-run experience)
- β Visual Egg Placement Tool (click to position)
- β Rich Content Editor (HTML support)
- β Drag-and-Drop Media Uploads (images, videos, audio)
- β Automatic WebP Conversion (image optimization)
- β Draft System (hide eggs until ready)
- β Light/Dark Theme Toggle
- β Hero Customization (text + background image)
- β Settings Panel (site config + password management)
| Component | Technology |
|---|---|
| Backend | PHP 7.4+ with file-based JSON storage |
| Frontend | Vanilla JavaScript (zero frameworks) |
| Styling | CSS3 with backdrop-filter effects |
| Security | Bcrypt passwords, CSRF tokens, session management |
| Images | Automatic WebP conversion via GD |
| Storage | File-based (no database required) |
/your-web-root/
βββ admin/ # Admin panel (8 files)
β βββ api.php # AJAX endpoints with CSRF protection
β βββ index.php # Dashboard
β βββ login.php # Admin login
β βββ setup.php # First-run wizard
β βββ settings.php # Site configuration
β βββ egg-new.php # Create egg
β βββ egg-edit.php # Edit egg content
β βββ egg-place.php # Visual placement tool
β βββ logout.php # Session cleanup
βββ assets/
β βββ css/
β β βββ main.css # Public site styles
β β βββ admin.css # Admin panel styles (light/dark)
β βββ js/
β β βββ main.js # Tears, hotspots, modal logic
β β βββ admin-editor.js # Media picker, uploads
β β βββ theme-toggle.js # Dark mode switcher
β βββ audio/
β βββ screech.mp3 # β οΈ Required audio file
βββ data/ # Auto-created storage
β βββ index.php # Security protection (403)
β βββ config.json # Site configuration
β βββ error.log # Error logging
β βββ eggs/ # Egg JSON files
β βββ uploads/ # User-uploaded media
βββ config.php # Core functions & security
βββ index.php # Homepage
βββ gate.php # Password protection
βββ INSTALLATION.md # Setup guide
βββ README.md # This file
- PHP: 7.4 or higher
- Extensions: GD (for WebP conversion)
- Permissions: Writable
/datadirectory - Optional: Pretty URLs (mod_rewrite)
Check your environment:
php -v # Check PHP version
php -m | grep gd # Verify GD extension
ls -la data/ # Check permissions| Feature | Implementation |
|---|---|
| Password Hashing | Bcrypt (PASSWORD_DEFAULT) |
| CSRF Protection | Tokens on all state changes |
| Session Security | HttpOnly cookies, strict mode |
| File Locking | Prevents race conditions |
| Session Timeout | 30-minute inactivity limit |
| Input Validation | File types, sizes, positions |
| Output Escaping | htmlspecialchars() everywhere |
| Security Headers | X-Frame-Options, CSP, etc. |
| Upload Limits | 10MB max file size |
| Directory Protection | index.php blocks browsing |
- Login at
yourdomain.com/admin/login.php - Click "New Egg" on dashboard
- Enter a title (e.g., "The Coffee Incident")
- Add content:
- Caption (optional italic text)
- Body (supports HTML:
<p>,<strong>,<em>, etc.) - Alt text (accessibility)
- Upload media (optional):
- Image (auto-converts to WebP)
- Video (alternative to image)
- Audio (plays in modal)
- Click "Place on Site":
- Click anywhere to position hotspot
- Save placement
- Uncheck "Draft" to publish
- Test on homepage!
Settings β Site Settings:
- Change site name
- Update domain
- Customize hero text
- Upload hero background image
- Enable/disable password gate
- Set visitor password
Settings β Change Admin Password:
- Enter current password
- Set new password (min 8 chars)
- Confirm new password
"Minimalist Apple-adjacent polish, chaotic on purpose"
- Dark gradients and glass morphism
- Smooth animations with spring physics
- Premium feel with playful interactions
- Clean UI, hidden complexity
- Accessibility-first (ARIA labels, keyboard nav)
- π₯ Friend Group Inside Jokes
- πΈ Private Photo/Video Galleries
- π Interactive Storytelling
- π Event Scrapbooks
- π΅οΈ Dramatic Easter Egg Hunts
- π Memory Collections
- π¨ Creative Projects
- Verify all files extracted properly
- Check web server is running PHP 7.4+
- Ensure
config.phpis readable
# Fix permissions
chmod -R 755 data/
chown -R www-data:www-data data/ # Linux/Apache
chown -R _www:_www data/ # macOS# Check PHP upload limits
php -i | grep upload_max_filesize
php -i | grep post_max_size
# Verify GD extension
php -m | grep gd- Upload audio file to
/assets/audio/screech.mp3 - Check browser console for errors
- Verify file format is MP3
// Edit /assets/js/main.js around line 78
// Increase interval from 150ms to 300ms
tearInterval = setInterval(() => {
if (isPlaying && !isMuted) {
createTear();
}
}, 300); // Changed from 150// Edit /config.php around line 56
// Change timeout value (in seconds)
$timeout = 3600; // 1 hour instead of 30 minutesGood! This is intentional security. The /data/index.php file prevents direct access to your JSON files and uploads.
- β Change the default admin password
- β Set strong, unique passwords (min 12 chars)
- β Enable site password gate if privacy is needed
- β
Verify
/datadirectory returns 403 error
- π Keep PHP and server software updated
- πΎ Backup
/datadirectory regularly - π Monitor
/data/error.logfor issues - π Review uploaded files periodically
- π Rotate passwords every 6 months
# Disable error display
# Add to config.php after session_start():
ini_set('display_errors', 0);
error_reporting(0);
# Enable error logging
ini_set('log_errors', 1);
ini_set('error_log', DATA_PATH . '/error.log');| File | Description |
|---|---|
README.md |
Complete documentation (this file) |
INSTALLATION.md |
Step-by-step setup guide |
FEATURES.md |
Detailed feature overview |
Edit /assets/css/main.css:
/* Update gradient colors */
background: linear-gradient(135deg, #YOUR_COLOR_1 0%, #YOUR_COLOR_2 100%);
/* Update button colors */
.screech-button {
background: linear-gradient(135deg, #YOUR_COLOR_3 0%, #YOUR_COLOR_4 100%);
}Edit /assets/js/main.js:
// Line ~78: Change tear frequency
tearInterval = setInterval(() => {
createTear();
}, 150); // Lower = more tears
// Line ~87: Change tear speed
const duration = 2 + Math.random() * 2; // Adjust duration
// Line ~131: Change repulsion
const repelRadius = 100; // Larger = wider effect
const repelForce = 50; // Larger = stronger pushAdd to /assets/css/main.css:
@import url('https://fonts.googleapis.com/css2?family=Your+Font&display=swap');
body {
font-family: 'Your Font', -apple-system, BlinkMacSystemFont, sans-serif;
}- Use WebP: Already automatic for images
- Compress videos: Use HandBrake or FFmpeg before uploading
- Limit file sizes: Reduce max upload size in
admin/api.php - Clean old uploads: Periodically remove unused media
The file-based storage handles ~1000 eggs efficiently. Beyond that, consider:
- Implementing pagination in admin dashboard
- Adding search/filter functionality
- Migrating to SQLite for better performance
# Backup everything
tar -czf sucky-life-backup-$(date +%Y%m%d).tar.gz data/
# Backup just eggs and config
tar -czf eggs-backup-$(date +%Y%m%d).tar.gz data/eggs/ data/config.json# Restore full backup
tar -xzf sucky-life-backup-20250101.tar.gz
# Restore specific files
tar -xzf eggs-backup-20250101.tar.gz# Add to crontab for daily backups at 2 AM
0 2 * * * cd /path/to/site && tar -czf backups/backup-$(date +\%Y\%m\%d).tar.gz data/- Concurrent editing: While file locking prevents corruption, two admins editing the same egg simultaneously may overwrite changes
- No version history: Egg changes are permanent (backup before major edits)
- Single admin account: Only one admin user supported (use strong password!)
- No mobile placement: Egg placement tool requires desktop/laptop for precision
- Audio format: Only MP3 supported for screech audio
- Multiple admin accounts with roles
- Egg revision history
- Media library management (delete unused files)
- Export/import eggs
- Themes/templates
- Mobile-friendly placement tool
- Egg categories/tags
- Search functionality
- Analytics (egg views, clicks)
- SQLite migration path
Best sources for screech audio:
- Freesound.org (royalty-free sound effects)
- Record your own dramatic scream
- Use animal sounds (peacock screech works great!)
- Mix multiple sounds for unique effect
Audio specs:
- Format: MP3
- Bitrate: 128-192 kbps (balance quality/size)
- Duration: 3-10 seconds (loops automatically)
- Volume: Normalize to -14 LUFS
Great egg content:
- Story moments with photos/videos
- Voice messages or audio clips
- Memes with context
- Recipe cards
- Quotes with attribution
- Timeline events
- Behind-the-scenes content
- Reaction compilations
Effective hotspot placement:
- Cluster related eggs together
- Hide eggs in unexpected places
- Use visual cues (subtle hints in background)
- Vary position: corners, edges, center
- Test on different screen sizes
- Leave some easy to find, others challenging
This is a personal project template, but feel free to:
- Fork and customize for your needs
- Share improvements and bug fixes
- Create themes or extensions
- Submit detailed bug reports
MIT License - Feel free to use, modify, and distribute.
Attribution appreciated but not required.
Built with:
- β€οΈ Love for friends who've seen some stuff
- β Too much coffee
- π A flair for the dramatic
- π§ Vanilla tech (PHP + JavaScript + CSS)
Special thanks to:
- Everyone who's experienced a "sucky.life" moment
- Inside joke creators everywhere
- The friend groups who make life memorable
- Check
INSTALLATION.mdfor setup issues - Review
FEATURES.mdfor feature details - Search this README for your specific issue
- Check
/data/error.logfor error messages
Please include:
- PHP version (
php -v) - Error message from
/data/error.log - Steps to reproduce
- Expected vs actual behavior
May your inside jokes echo through eternity! π₯β¨
Built for moments that are too good not to document, too weird to explain, and too precious to forget. Whether it's documenting coffee disasters, immortalizing group chat legends, or creating an interactive memory book, sucky.life is here for your chaotic, beautiful, dramatic moments.
Now go forth and create some digital mayhem! π
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β sucky.life v2.0 β
β Inside-Joke Website Platform β
β β
β When the universe has it out for you, β
β document it with style. β
β β
β PHP + Vanilla JS + File-Based Storage β
β No Database β’ No Frameworks β’ No Complexity β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Version 2.0 | PHP 7.4+ | Zero Dependencies | Production Ready