Back to projects

Season ended

PokeTree

A seasonal web service for exchanging anonymous Christmas letters and adding to a character collection whenever a letter is opened.

A seasonal Christmas web service where people share a tree, receive anonymous letters, and grow a collection whenever they open one. I proposed collection as the reason to return and worked on image assets, sharing UI, and several Go CRUD API routes.

Period
2025.12
Ownership
Return loop · sharing UI · Go CRUD APIs
Team
12-person team
Repository
Private repository

Sharing a tree and receiving anonymous letters

PokeTree was a seasonal web service where people shared a personal Christmas-tree link and received anonymous letters from friends. On Christmas, they could open each message and collect a character with it.

Receiving a letter was delightful, but the web service had no reliable way to announce the next one, so there was little reason to return after the first visit. Requiring an app installation for a short season was not practical.

Instead of building notification itself, I reframed its purpose as giving people a reason to return and attached character collection to the act of opening a letter.

Return loop

The reward stays attached to the core act of reading a letter

  1. 01

    Open letter

    The core service action

  2. 02

    Read message

    Receive an anonymous letter

  3. 03

    Add to collection

    A random character

  4. 04

    Return

    The next letter and collection progress

My first Go CRUD routes joined an existing server

PokeTree was my first contribution to a Go server. I needed to connect a real service flow from receiving a request through database work and returning a response, not just implement the screen action.

Other members owned the overall server and core letter APIs. Because this was my first server task, the priority was to understand the existing routing, handlers, database access, and response shapes, then fit my assigned CRUD routes into those conventions.

I traced the existing code from request to response and implemented several Go CRUD API routes. I followed each frontend action through its endpoint, handler, database work, and response as one end-to-end flow.

  • Mapped the assigned routes onto the existing Go server structure.
  • Traced the request, handler, database work, and response flow.
  • Implemented the assigned CRUD APIs according to the team's conventions.

The Go CRUD routes I worked on were integrated into a live seasonal service.

Tracing a request through an existing server structure made both my implementation scope and its surrounding responsibilities concrete, even on my first backend contribution.

PokeTree mobile screen

Letters and collection progress in one return loop

Anonymous letters were valuable when opened, but the web service could not reliably announce new arrivals, leaving little reason to return after the first visit.

An app install or a new notification system was too heavy for a short Christmas season. A separate mini-game would also pull attention away from the core action of reading a letter.

I reframed the goal from building notifications to creating a visible reason to return, then attached a random character reward to opening each letter.

  • Integrated character rewards into the existing letter-open flow.
  • Structured the collection as 80 regular characters plus one Christmas-Day unlock.
  • Connected collection state, the gallery screen, and character assets.

The collection ran with 80 regular characters and one Christmas-Day unlock. I did not isolate its effect on return visits.

Defining the user's next action before naming a feature helped me find a lighter solution inside the product's core flow.

The collection screen in use during the live season

GA4 recorded roughly 15,000 visitors. The seasonal collection ran with 80 regular characters and one Christmas-Day unlock.

Before building a feature, I now specify whether the goal is a return visit, a shared link, or an opened letter. My first Go CRUD routes also taught me to trace a button action through the HTTP request, handler, database query, response, and resulting screen update.

This figure counts visitors, not members or active users. The collection loop's standalone effect was not measured.

  • Prepare a dated GA4 evidence image
  • Add completion or return rates only if source data exists
  • Review the public-use boundary for character assets