Inspiration
We wanted to build a puzzle game that could be understood in seconds but remain interesting for many levels. The core idea came from arrow-removal puzzles: an arrow can leave the board only when nothing blocks the space in front of its arrowhead.
From that simple rule, we designed an endless dependency puzzle. Removing one path opens an exit for another, so every board becomes a chain of spatial decisions rather than a speed or reaction challenge.
What it does
Purrl: Endless Arrow Path is an endless puzzle game that runs directly inside a Reddit post.
Each level contains straight, L-shaped, and double-bend arrow paths. Players must inspect the direction of every arrowhead and remove paths in a valid order. A blocked arrow stays on the board, while a valid bent path straightens and slides toward its exit.
The experience intentionally has no timers, lives, consumable items, or hint buttons. Progress is based entirely on understanding the board.
The difficulty increases gradually:
- Early levels introduce the rule with compact 12-arrow boards.
- Later levels add more bends, denser layouts, and deeper dependency chains.
- Level 50 and beyond contain up to 64 arrows.
- Milestone levels use recognizable frame, cross, corridor, and island layouts.
- A global leaderboard ranks players by their highest completed level.
Progress and leaderboard results persist through the player's authenticated Reddit account.
How we built it
Purrl was built with Devvit Web, TypeScript, React, Phaser, Hono, and Devvit Redis.
Phaser powers the interactive puzzle board, including procedural path rendering, full-path pointer detection, invalid-move feedback, path-straightening animations, and completion effects. React manages the surrounding interface and game lifecycle.
The server uses the authenticated Reddit user identity instead of accepting identity information from the client. Redis stores generated puzzles, player progress, temporary attempts, and leaderboard data.
Each level is generated deterministically. The generator:
- Selects and transforms a board template.
- Packs non-overlapping orthogonal paths.
- Creates valid exit dependencies.
- Builds an acyclic removal graph.
- Validates direction variety, bend quotas, path separation, initial exits, and dependency depth.
- Retries deterministically if a candidate fails a quality requirement.
The server validates the complete removal sequence before advancing the player. It also rejects expired, duplicate, concurrent, incomplete, or unrealistically fast submissions.
Challenges we ran into
The largest challenge was generating boards that were simultaneously dense, readable, varied, and guaranteed to be solvable.
Early generators produced repetitive layouts, arrows pointing in similar directions, or paths that visually overlapped. Increasing the number of arrows also made mobile interaction difficult. We solved these problems by introducing multiple board templates, rotations, reflections, direction-balance checks, controlled bend quotas, minimum path spacing, and full-path hit testing.
Another challenge was making bent arrows feel natural when removed. Sliding the complete bent shape looked awkward, so valid paths now progressively straighten toward their arrowhead before leaving the board.
Building a trustworthy endless progression system on a serverless platform was also challenging. Attempts needed expiration, ownership checks, duplicate-submission protection, rate limits, and atomic progress updates. Moving this state into Redis allowed the game to remain consistent across refreshes and concurrent requests.
Accomplishments that we're proud of
- Created an endless difficulty curve that reaches 64 arrows by level 50.
- Built deterministic puzzles shared by all players at the same level.
- Generated dense straight and bent paths without centerline overlaps.
- Added persistent progression and a highest-level global leaderboard.
- Implemented server-authoritative validation and concurrency protection.
- Added automated coverage for 1,000 generated boards across the difficulty curve.
- Made the complete game loop playable inside a Reddit post on desktop and mobile.
What we learned
We learned that procedural puzzle generation is less about random placement and more about designing and validating a constraint system.
We also learned that visual readability, input behavior, animation, and game rules must be developed together. A mathematically valid puzzle is not useful if players cannot clearly identify its paths or reliably select them on a phone.
Finally, Devvit showed us how Reddit identity, interactive posts, server routes, and Redis persistence can work together to create a shared game experience without requiring a separate account system.
What's next for Purrl
Next, we plan to continue balancing high-level boards, improve the first-time-player introduction, expand milestone layouts, and add optional community challenges while keeping the core one-sentence rule unchanged.
Built With
- devvit
- eslint
- hono
- phaser.js
- react
- redis
- typescript
- vite
- vitest
Log in or sign up for Devpost to join the conversation.