Case study
Portfolio Achievement System
An event-driven achievement system featuring hidden challenges, persistent progress, tamper detection, and cross-application SSH integration.

Technology
- Next.js
- React
- TypeScript
- Go
- SQLite
- Web Crypto API
- CSS Animations
- SSH
- Role
- Sole developer
- Year
- 2026
- Status
- In active use
Overview
Making a portfolio worth exploring
Most developer portfolios are designed to be browsed. Visitors look through a few projects, read a case study, and perhaps get in touch. I wanted to give people a reason to explore further.
What started as a few hidden Easter eggs gradually evolved into a persistent, event-driven achievement system. Visitors can unlock achievements by reading case studies, discovering hidden interactions, experimenting with developer tools, and even connecting to a separate SSH-based portfolio. The goal was to reward curiosity without interrupting the normal browsing experience.
- 14 achievements spanning the portfolio and SSH application
- Cross-application integration between Next.js and Go
- An unnecessarily cinematic finale and exclusive Sealy Mode reward
Architecture
One engine for every achievement
Rather than implementing achievement checks independently across React components, I built a centralized, event-driven engine. A declarative registry defines each achievement's identifier, metadata, rarity, and unlock requirements, while application events report relevant interactions to the engine.
This separation keeps achievement evaluation independent from its presentation. Reading a case study, activating the Konami code, discovering a hidden route, or clicking a particular link can all use the same underlying mechanism.
The engine handles unlocking, partial progress, persistence, and notifications consistently. Achievements appear in a dedicated drawer, with undiscovered challenges represented by cryptic hints rather than revealing their exact requirements.
The final completionist achievement, Touch Grass., dynamically evaluates the other achievements, so introducing a new challenge doesn't require manually updating a separate completion checklist.
- 01
Define
Declare achievements and their unlock requirements in a centralized registry.
- 02
Observe
Emit events when visitors perform relevant interactions.
- 03
Evaluate
Check events against unlock conditions and accumulated progress.
- 04
Persist & notify
Save progress locally and display achievement notifications.
State management
Progress that survives a refresh
Achievement progress is stored in localStorage, allowing visitors to return later without losing previously unlocked rewards. The engine restores persisted state during initialization and maintains partial progress for achievements that require more than one interaction.
Some achievements accumulate activity over time. No Life, for example, tracks time spent with the browser tab visible, while Lore Master requires reading every available case study.
Persisting progress client-side avoids introducing user accounts or a dedicated achievement backend. Visitors can participate without registering or signing in.
However, this also means the stored data cannot be considered trustworthy. The browser belongs to the visitor, and anything persisted there can be inspected, modified, or deleted. That limitation led to one of the more entertaining parts of the implementation.
- Persistent achievement progress across visits
- No accounts or registration required
- Browser lifecycle-aware progress tracking
Integrity checks
Making cheating an achievement
Because achievement progress is stored in the browser, visitors can inspect and manipulate it through developer tools. Instead of trying to prevent every possible modification, I turned casual tampering into another hidden achievement: Cheater, Cheater!
The persistence layer uses SHA-256 checksums to detect unexpected changes to stored progress. Validation occurs when data is restored and at relevant browser lifecycle events, including returning to the tab.
This is deliberately not a security boundary. Since both the data and checksum exist client-side, a determined visitor can modify or bypass them. The purpose is to recognize simple tampering while avoiding false positives caused by legitimate state changes.
The result is an integrity mechanism that exists largely to reward people for attempting to bypass an achievement system that awards imaginary trophies.
- SHA-256 checksums detect unexpected changes to persisted progress
- Validation during loading and relevant browser lifecycle events
- Hidden Cheater, Cheater! achievement rewards casual tampering
- Client-side integrity checking without unrealistic security claims
Cross-application integration
Connecting Next.js and Go over SSH
Terminally Online is an achievement that requires visitors to connect to a separate SSH-based version of my portfolio, built in Go using Wish, Bubble Tea, and Lip Gloss.
The challenge was associating a browser visitor with a successful SSH session without introducing accounts, authentication, or an additional identity service.
The website generates a short random token and embeds it into the username of the SSH command copied by the visitor. When the Go application receives a successful interactive connection with a recognized token-bearing username, it hashes the token and records the result in the shared SQLite database.
Next.js can then check for the corresponding record and unlock the achievement. Visitors connecting to the SSH portfolio normally, without a token, retain full access.
The mechanism is deliberately lightweight. The token is a correlation identifier, not an authentication credential, and exists solely to confirm a low-stakes achievement.
- 01
Generate token
The browser creates and persists a short random correlation token.
- 02
Copy SSH command
The token is inserted into the SSH username.
- 03
Connect
The visitor opens an interactive session with the Go SSH portfolio.
- 04
Record
Go hashes the token and stores the successful connection in SQLite.
- 05
Verify
Next.js checks the shared database and unlocks Terminally Online.
The technical challenge
When IPv4 and IPv6 ruined the plan
My original solution for Terminally Online involved matching browser and SSH visitors through hashed IP addresses stored in SQLite.
The approach seemed reasonable until the network environment got involved. The website operates behind Cloudflare, while the SSH service is accessed separately. A browser could connect over IPv6 while the SSH client used IPv4, producing entirely different addresses for the same visitor.
Hashing the addresses did nothing to solve the mismatch.
I explored ways to work around the problem, but each approach introduced more complexity into a feature that was supposed to be a small Easter egg.
The eventual solution was almost embarrassingly simple: SSH already supports usernames. Encoding a short correlation token in the username eliminated the dependency on IP addresses entirely.
It was a useful reminder that simplifying the problem is often more effective than engineering around a flawed assumption.
- Initial approach: visitor correlation using hashed IP addresses
- Problem: IPv4 and IPv6 prevented reliable matching
- Solution: short correlation tokens embedded in SSH usernames
The finale
An unnecessarily cinematic reward
Completing every other achievement unlocks Touch Grass., the final achievement in the system.
Rather than displaying a normal notification, I built a full-screen Star Wars-inspired opening crawl featuring a starfield, perspective-scrolling text, and a dramatic soundtrack.
The cinematic recounts the visitor's journey through the portfolio while repeatedly questioning why they have spent so much time doing any of it.
The animation required more attention than expected. The initial implementation moved the text through the readable area too quickly, then spent an excessive amount of time letting it disappear into the distance. I adjusted the perspective and travel calculations so the text remained readable for most of the sequence.
The finale can be skipped or replayed without affecting achievement progress. Once completed, it reveals the ultimate reward.
A color scheme and a cat.
- Full-screen Star Wars-inspired opening crawl
- Perspective animation synchronized with a dramatic soundtrack
- Skippable and replayable without modifying achievement progress
- Exclusive reward revealed after completing the finale
What I learned
Sometimes the simplest solution is a username
What started as a few Easter eggs became a surprisingly useful exercise in software architecture, browser state management, and communication between applications.
The centralized achievement engine helped keep features extensible without tying their logic to individual components. Client-side persistence required a realistic understanding of integrity and trust boundaries. The SSH integration pushed me to solve a cross-application correlation problem without introducing unnecessary authentication infrastructure.
The biggest lesson came from the failed IP-based approach. It was technically interesting, but depended on assumptions about network behavior that did not hold in practice. Using SSH usernames produced a simpler and more reliable solution with fewer moving parts.
More importantly, the project reminded me why I enjoy building personal software in the first place. Not every feature needs a business justification. Sometimes the point is to experiment, solve interesting problems, and make something unexpectedly fun.
Will most visitors ever unlock the finale? Probably not.
But the entire system is there for anyone curious enough to find it.