## What inspired me

I have tried a lot of productivity tools, and most of them never really worked for me. They often felt too strict, too generic, or like another dashboard that I would eventually ignore.

Perch is a desktop focus companion that tries to make the experience more personal. You choose what you want to work on, what usually distracts you, and what sites or tools are okay. Then a small pixel-art mascot stays nearby while you work. If you drift, it reacts. If you come back, it settles down.

The mascot can also be custom-made from a photo, pet, drawing, or anything else. That makes the reminder feel more personal than a normal notification.

## How I built it

Perch is built with Electron, React, and TypeScript. It uses a Chrome extension for browser signals and SQLite to keep session history locally.

Most activity decisions happen locally using the active application, browser title, approved sites, and distraction sites. If Perch still cannot tell what is happening after a period of time, GPT-5.6 can look at the active window and help classify the activity as on-task, distraction, or drift.

Perch also creates task-aware mascot messages. At the start of a session, GPT-5 mini generates short message variations based on what the user is working on. That helps the mascot feel less repetitive and makes its reactions fit the session better.

Custom mascots are generated with Gemini Nano Banana Pro. The user uploads a photo, then Perch creates a calm sprite plus concerned, upset, breakdown, and hello-wave versions.

## What I learned

This was my first real Electron desktop app. I have built web apps before, but desktop development made me think much more about native permissions, windows, local storage, multiple processes, and how the app behaves outside of a browser.

I also learned a lot from building a full project with Codex. Codex helped me move faster through planning, implementation, debugging, testing, and refining the product. It was especially useful when the project involved many connected parts, like Electron windows, browser signals, local data, AI calls, and mascot behavior.

## Biggest challenge

The hardest part was making the mascot work correctly across different macOS desktops.

At first, the mascot would appear on one desktop but not follow when I switched workspaces. I had to dig into Electron windows, macOS panels, always-on-top behavior, focus, and fullscreen workspaces.

Another challenge was focus tracking while moving the mascot. If someone is distracted on YouTube and drags the mascot, Perch should not suddenly think they are back on task. It also should not get more upset just because the user moved it.

The solution was to treat Perch and desktop clicks as transparent. Perch keeps the last real app or website state until it sees another actual app or browser tab.

Built With

Share this project:

Updates