8 projects
Beniverse
My personal portfolio website with a cosmic theme where you navigate through an interactive solar system. Each orbiting planet takes you to a different section - About, Projects, Resume, Blog, and Experiments. ## The Concept I was tired of seeing the same portfolio layouts everywhere - hero section, about me, grid of projects, contact form. They work, but they're forgettable. I wanted something that felt more like *me* - someone who builds things for fun and gets nerdy about the details. The solar system idea started as a joke ('What if my portfolio was literally my own universe?') and I couldn't stop thinking about it. So here we are. ## Interactive Features **Orbital Navigation** - Five planets orbit the central star at different speeds and distances. Each planet represents a section of the site. Hover to see the label, click to navigate. The orbits use pure CSS animations with no JavaScript required for the movement. **Clickable Starfield** - The background isn't just decoration. Click any star and you'll get a random Chuck Norris-style quote about me. There are 50+ quotes covering both tech humor ('Ben Purdy can exit vim on the first try') and general absurdity ('Ben Purdy counted to infinity. Twice.'). It's a fun easter egg that rewards exploration. **Keyboard Navigation** - Full keyboard support for accessibility and power users. Press 1-5 to jump directly to any section, Escape to return home, and ? to see all shortcuts. No mouse required. ## Content Sections **About** - My background, interests, and what I'm currently working on. Includes social links to GitHub and LinkedIn. **Projects** - You're looking at this page right now! Each project has both a PM-friendly overview and a technical deep-dive. **Resume** - My work history at ThreatConnect and Premier Inc., education, and skills. Downloadable PDF version available. **Blog** - Technical posts about Python, React Native, tooling, and occasional philosophical tangents about software development. Filterable by category and searchable. **Experiments** - A showcase of the interactive features built into this site, like the starfield and keyboard navigation. ## Design Philosophy No frameworks, no bloat. The entire frontend is vanilla JavaScript and CSS. Pages load fast because there's nothing to load - no 500KB of React, no build step that takes 30 seconds. Just HTML served by Python with some CSS animations for visual polish. The cosmic theme uses a dark color palette with accent colors for each planet/section. Everything is responsive - the solar system scales down on mobile while keeping the planets clickable.
Idle Rampage
A mobile idle/incremental game for iOS and Android. Humanity's last stand against rogue machines! ## The Story The year is 2157. Humanity's automated defense systems went rogue, and now endless waves of machines threaten the last human settlements. You're the commander of a makeshift outpost, scavenging resources to build defenses and push back against the mechanical onslaught. As you upgrade buildings, you'll discover log entries from the original engineers who built these machines - slowly revealing what went wrong and who 'The Architect' really is. ## Core Gameplay Loop **Wave Combat** - Enemies spawn in waves, each stronger than the last. You deal damage by tapping (active play) or through your automated defenses (idle progress). Clear waves to earn scrap, the primary currency for building upgrades. **Building System** - Construct and upgrade 6 unique buildings: - *Scrap Works* - Generates passive scrap income over time - *Weak Point Scanner* - Increases critical hit chance and damage - *Training Facility* - Boosts tap damage for active players - *Shield Generator* - Provides damage reduction against enemy attacks - *Command Center* - Unlocks and enhances auto-damage systems - *Engineering Bay* - Improves all other building efficiency Each building has 4-5 evolution tiers with unique visual designs and exponentially scaling power. The first tier Scrap Works is a pile of salvage; the final tier is an automated mining complex. **Boss Fights** - Every 10 waves features a boss with significantly more HP and special abilities. Defeating bosses grants bonus scrap and rare blueprints. ## Progression Systems **100 Waves to Victory** - The campaign spans 100 waves with carefully tuned difficulty scaling: - Waves 1-12: Tutorial and early game (learn the mechanics) - Waves 13-50: Mid game (unlock all buildings, first prestige) - Waves 51-95: Late game (multiple prestiges required) - Waves 96-100: The Gauntlet (elite enemies, no breaks) - Wave 100: The Architect (final boss, 2.5 million HP) **Prestige System** - When progress stalls, prestige to reset your buildings but keep your blueprints. Blueprints unlock permanent upgrades: - Tap Power (+25% per level) - Auto Damage (passive DPS unlocks) - Production Boost (+15% building output) - Lucky Drops (better reward chances) - And 6 more upgrade trees ## Quality of Life Features **Offline Progress** - Close the app and come back to accumulated resources. Earn up to 8 hours of offline progress at 50% efficiency. Perfect for overnight farming. **Daily Rewards** - Log in daily for escalating bonuses. Consecutive logins increase the multiplier up to 7x. **Lucky Drops** - Random bonus rewards when clearing waves. Ranges from small scrap bonuses to rare blueprint fragments. **Strategic Depth** - Unlike many idle games, Idle Rampage rewards active decision-making. Which building do you upgrade next? When's the optimal time to prestige? Do you push for the next boss or farm the current wave?
Social Compromise
A civic technology platform designed to bridge political divides through structured, respectful conversation. ## The Problem Political discourse has become increasingly polarized. People retreat into echo chambers, only engaging with those who already agree with them. Social media algorithms optimize for outrage, not understanding. We've lost the ability to have productive conversations with people who see the world differently. ## The Solution Social Compromise creates a space for genuine dialogue across the aisle. It's not about changing minds - it's about understanding *why* people believe what they believe. ## Core Features **Anonymous Matching** - Enter a topic (immigration, healthcare, climate change, etc.) and your general position. The system matches you with someone holding a different view. No profile pictures, no names - just ideas. Anonymity removes social pressure and encourages honesty. **Real-Time Chat** - Have a live conversation with your match. A moderation system ensures civility - personal attacks and slurs are filtered, but strong disagreement is welcome. The goal is productive friction, not artificial harmony. **AI Practice Partners** - Not ready to talk to a real person? Practice first with an AI opponent powered by Claude. The AI can argue any position convincingly, helping you understand opposing viewpoints and refine your own arguments. It'll push back on weak logic without getting emotional. **Perspectives Library** - Browse well-researched arguments from multiple sides of contentious issues. Each perspective includes: - Core beliefs and values driving the position - Common arguments and evidence cited - Acknowledgment of trade-offs and downsides - Steelman (strongest) version of the argument **Media Framing Analysis** - See how the same story gets covered differently across the political spectrum. Compare headlines, framing, and emphasis from outlets like Fox News, CNN, NPR, and others. Understanding media bias is the first step to seeing through it. ## Conversation Guidelines Every chat includes gentle reminders: - Ask questions before making assumptions - Attack arguments, not people - Acknowledge good points, even from the other side - It's okay to say 'I don't know' or 'I'll think about that' ## Archived Discussions With user consent, productive conversations are anonymized and archived. These serve as examples of how civil discourse can work - real people finding common ground (or respectfully disagreeing) on difficult topics.
Five O'Clock Somewhere
It's always 5 o'clock somewhere. This app finds exactly where. ## The Concept A simple idea executed beautifully: at any given moment, there's a place on Earth where it's cocktail hour. This app finds that place, shows you a gorgeous photo, and gives you a drink recipe to match. ## How It Works The app tracks 26 locations around the globe, from Honolulu to Auckland, covering every timezone. When you visit, it calculates which location is currently in the 5-6 PM window and displays: - **The Location** - City name and country - **Beautiful Imagery** - Full-viewport background photo from Unsplash - **Local Time** - Current time at that location - **Signature Cocktail** - A drink that's quintessential to that region ## Featured Locations & Drinks Each location is paired with a culturally appropriate cocktail: - **Honolulu** - Mai Tai (rum, lime, orgeat, curacao) - **Tokyo** - Highball (whisky, soda, precision ice) - **Bangkok** - Thai Iced Tea Cocktail (rum, thai tea, condensed milk) - **Mumbai** - Mango Lassi Martini (vodka, mango, yogurt) - **Paris** - French 75 (gin, champagne, lemon, sugar) - **Rio de Janeiro** - Caipirinha (cachaca, lime, sugar) - **New York** - Manhattan (rye, sweet vermouth, bitters) - **Auckland** - Kiwi Crush (vodka, kiwi, lime, mint) - ...and 18 more locations worldwide ## Recipe Details Each cocktail includes: - Complete ingredient list with measurements - Step-by-step preparation instructions - Glassware recommendations - Garnish suggestions - Brief history or cultural context ## Auto-Refresh Leave the page open and it automatically updates every 5 minutes. Watch as cocktail hour travels around the world. Perfect for a bar display or conversation piece. ## No Account Required Just visit the site. No login, no tracking, no cookies. Share the link with friends and they'll see the same thing you see.
LitRPG Status
Track your real-life skills like a character in a LitRPG novel. ## The Inspiration If you've read LitRPG fiction (Cradle, Dungeon Crawler Carl, etc.), you know the appeal of watching numbers go up. Stats, levels, skill trees - there's something satisfying about quantified progress. This app brings that feeling to real-world skill development. ## How It Works **Log Your Practice** - Did something that improved a skill? Log it. Spent an hour learning TypeScript? That's XP in `software.frontend.typescript`. Practiced guitar? XP in `music.instrument.guitar`. The system uses dot notation for hierarchical skills. **Watch Skills Level Up** - As you accumulate XP, skills level up with satisfying visual feedback. Higher levels require exponentially more XP, mimicking the learning curve of real skills. **Skill Hierarchy** - Skills are organized in trees: ``` software backend python golang frontend react typescript devops kubernetes terraform ``` Parent skills automatically reflect your best child. If your Python is level 15 and your Go is level 8, your Backend skill shows level 15. ## The Decay Mechanic Here's where it gets interesting: **inactive skills decay**. Not using a skill? It gradually loses XP over time. And the decay accelerates - a skill you haven't touched in a week decays slowly, but one you've ignored for months decays rapidly. This isn't punishment - it's motivation. The decay creates urgency to maintain skills you care about and lets unimportant skills naturally fade. It also reflects reality: use it or lose it. ## Activity History Every XP gain is logged with timestamp and notes. Browse your recent activity to see patterns: Are you neglecting certain skills? Overinvesting in others? The history tells the story of your learning journey. ## Privacy First Your skill data is yours. Google OAuth for login (no passwords to manage), but all data stays on the server - no third-party analytics, no tracking. Self-hosted friendly. ## Why 'Status'? In LitRPG novels, checking your 'status' shows your character sheet. This app is your real-life status screen. Pull it up, see where you stand, and decide what to work on next.
Trivia Sprint
A fast-paced mobile trivia game that rewards quick thinking. ## The Concept Most trivia apps feel like homework. Slow, methodical, no energy. Trivia Sprint flips that - it's trivia as a sport. You're racing against the clock, building streaks, and feeling the pressure of each tick. Get it right fast, score big. Hesitate, and watch your bonus evaporate. ## Game Modes **Sprint Mode** - The core experience. 10 questions, 10 seconds each. Answer correctly to bank points; answer quickly to multiply them. A perfect run with fast answers scores 3x a slow perfect run. **Daily Challenge** - One new challenge every day, same questions for everyone. Compare your score on the leaderboard. Miss a day? It's gone forever. **Topic Deep Dive** - Pick a category and see how far you can go. Questions get progressively harder. How many can you answer before you miss three? ## Progression System **XP & Levels** - Every game earns XP. Level up to unlock new topics and cosmetics. Higher levels require more XP, but also show mastery. **Topic Unlocks** - Start with General Knowledge, History, and Science. As you level up, unlock specialized topics: - Level 5: Movies, Music, Sports - Level 10: Geography, Literature, Art - Level 15: Technology, Nature, Mythology - Level 20: Expert packs (harder questions) **Streak Bonuses** - Answer multiple questions correctly in a row for escalating multipliers. Miss one and the streak resets. High-risk, high-reward. ## Polish & Feel **Audio Feedback** - Satisfying sounds for correct answers, gentle buzzes for wrong ones. Music that builds tension as the timer runs low. **Smooth Animations** - Cards flip, scores fly, streaks flash. Everything moves at 60fps. The game *feels* fast. **Offline Play** - Questions are downloaded in batches. No internet? No problem. Play on the subway, on a plane, wherever. ## Monetization (Fair Model) **Free to Play** - All core gameplay is free, forever. No energy systems, no paywalls blocking progress. **Optional Purchases**: - *Hint Packs* - Get hints on hard questions - *Cosmetics* - Custom themes and avatars - *Premium Topics* - Niche categories for enthusiasts - *Ad Removal* - One-time purchase **Rewarded Ads** - Watch an ad, get a free hint. Your choice, never forced.
Combo Forge
A tool for fighting game enthusiasts to create, save, and share combos. ## For the FGC If you play fighting games seriously, you know the struggle. You find a sick combo on Twitter, try to write it down, and end up with illegible shorthand. Or you spend an hour in training mode, finally land something optimal, then forget it by next week. Combo Forge gives you a proper place to document, organize, and share your tech. ## Core Features **Combo Builder** - Visual interface for constructing combos. Select your game, pick your character, then chain together moves using standard notation. The builder validates as you go - no more 'is this even possible?' moments. **Notation Support** - Works with standard fighting game notation: - Numpad notation (236P, 623K, etc.) - Common abbreviations (QCF, DP, HCB) - Game-specific moves (Just Frame inputs, links, cancels) - Combo markers (>, xx, delay, micro-walk) **Damage Calculator** - See your combo's damage, meter gain, and scaling in real-time. Compare routes to find the optimal balance between damage and meter efficiency. **Character Databases** - Frame data, move properties, and hitbox information for supported games. Know exactly why your combo works (or doesn't). ## Organization & Sharing **Collections** - Group combos by character, game, or situation. Create collections like 'Sol BnBs', 'Anti-Air Confirms', or 'Tournament Winners'. **Tags & Search** - Tag combos with situations (corner, midscreen, counterhit, etc.) and search your library instantly. **Share Links** - Generate shareable links to individual combos or entire collections. Perfect for Discord, Twitter, or helping your local scene level up. **Import/Export** - Bulk export your combos as JSON. Import other people's collections. Backup your years of lab work. ## Supported Games Currently building support for: - Guilty Gear Strive - Street Fighter 6 - Tekken 8 - More planned based on community interest ## Community Features (Planned) - Public combo repository - Upvotes and comments - Character-specific leaderboards (highest damage, most practical) - Pro player combo collections
Python Utils
A comprehensive utility library that eliminates boilerplate from everyday Python code. ## The Problem Every project has the same utilities scattered around: that function to slugify strings, the one that safely gets nested dict values, the email validator you copied from Stack Overflow. You end up with a `utils.py` file that grows organically and becomes unmaintainable. This library is my answer: a well-organized, thoroughly tested collection of utilities I actually use, packaged for reuse. ## Design Principles **Static Methods Only** - No classes to instantiate. Just import and call: ```python from utils import String String.slugify(text='Hello World!') # 'hello-world' ``` **Keyword-Only Arguments** - Every method uses keyword-only args for clarity. No guessing what positional arguments mean: ```python # Clear what each argument does Dict.deep_get(obj=config, path='database.host', default='localhost') ``` **Zero Core Dependencies** - The base utilities have no external dependencies. Optional features (HTTP, Pydantic integration) require their respective packages. ## Utility Categories ### String Utilities (22 methods) - **Case Conversion**: snake_case, camelCase, PascalCase, kebab-case - **Slugify**: URL-safe string conversion - **Truncate**: Smart truncation with ellipsis - **Hashing**: MD5, SHA256, SHA512 - **Extraction**: Extract emails, URLs, numbers from text - **Padding**: Left, right, center padding ### Integer Utilities (15 methods) - **Properties**: is_even, is_odd, is_prime, is_perfect_square - **Math**: factorial, GCD, LCM, power_of_two - **Conversion**: to_roman, from_roman, to_words - **Formatting**: bytes_to_human (1048576 -> '1 MB') ### Dict Utilities (18 methods) - **Deep Access**: deep_get, deep_set with dot notation - **Merge**: deep_merge for nested dicts - **Transform**: map_keys, map_values, filter - **Case Convert**: snake_case_keys, camel_case_keys (recursive) - **Flatten/Unflatten**: Nested dict <-> flat with dot keys ### Iterable Utilities (22 methods) - **Chunking**: Split lists into fixed-size batches - **Grouping**: Group by key function - **Aggregation**: sum_by, avg_by, count_by - **Finding**: first, last, find_all with predicates - **Filtering**: unique, compact (remove None/empty) ### Datetime Utilities (28 methods) - **Parsing**: ISO, RFC3339, custom formats - **Arithmetic**: add_days, add_months, add_years - **Boundaries**: start_of_day, end_of_month, start_of_week - **Human**: 'human_time' for relative dates ('3 days ago') - **Comparison**: is_weekend, is_business_day, days_between ### Validator Utilities (14 methods) - **Format**: is_email, is_url, is_uuid, is_phone - **Financial**: is_credit_card (Luhn algorithm) - **Geographic**: is_latitude, is_longitude, is_timezone - **Content**: is_empty, is_numeric, is_hex_color ### Path Utilities (12 methods) - **Read/Write**: text, lines, JSON with encoding handling - **Operations**: copy, move, delete with safety checks - **Info**: size, modified_time, extension, exists ### Logger Utilities Structured JSON logging with context: ```python from utils import Logger log = Logger.create(name='myapp') with log.context(user_id='123', request_id='abc'): log.info(message='Processing request') # Output: {"timestamp": "...", "level": "INFO", # "message": "Processing request", "user_id": "123"} ``` ## Testing **1,114 tests** covering all utilities, edge cases, and error conditions. Tests run in under 5 seconds. ## Installation ```bash pip install bp-utils # Core utilities pip install bp-utils[http] # Adds Session utilities pip install bp-utils[pydantic] # Adds Pydantic validators pip install bp-utils[all] # Everything ```