An outdoor activity finder and trip planner, built from concept to an active
invite-only closed beta. The philosophical inverse of engagement-maximizing apps:
one button that gets you outside in under 30 seconds.
The problem
Most apps fight to keep you on the screen. The thing people actually want from
an outdoors app is the opposite: to close it and go do something. But choosing
where to go is its own friction. Too many options, none matched to how much time,
energy, or motivation you have right now.
What I built
A recommendation flow that takes your mood, time, energy, and location and returns
nearby walks, parks, trails, viewpoints, and quiet streets, fast. Around it sits the
rest of a real product: interactive map exploration, saved favorites, full
trip-planning workflows for bigger adventures, and an account-free demo anyone can
try. I designed the whole thing first (information architecture, flows, wireframes,
high-fidelity screens), then built it end to end. Grasstile supports 11 languages
across 15 routed locale variants.
Result
Reached an active invite-only closed beta with an account-free public demo. Planning
and account access require an invitation, and purchases are unavailable. The product
deliberately avoids streaks, badges, and guilt mechanics. Its goal is to help people
choose something worthwhile and then leave the screen.
What I learned
Building the full stack alone forces ruthless scoping: every feature has to earn the
maintenance it costs. Wiring up internationalization (next-intl) and an AI
recommendation layer early was far cheaper than retrofitting them, and designing
against engagement metrics made the product decisions clearer, not harder.
LandingHow it worksChoose in 30 secondsDemo inputDemo result
A French-language activity and movement tracker, built as my final CÉGEP projet
intégrateur with a school partner.
The problem
The brief was a capstone activity tracker, with two real constraints: it had to
run as a native mobile app on a tight school timeline, and it had to be fully
French, not an English app with translated labels. A tracker also has an awkward
demo problem: how do you show live GPS and sensor data to a room full of people
who are sitting still?
What I built
A React Native app, French-first from the ground up, that reads the device sensors
to track live speed, pace, distance, altitude, and elevation gain. Firebase handles
auth (email/password, Google sign-in, and an email-verification flow). Around the
tracker sits a full app: quick-start session types (walk, run, sport, quick test),
daily/weekly/monthly stats, session history, in-app notifications, and a profile
area. My answer to the demo problem was a simulation mode that
fakes sensor data so the whole flow can be shown indoors, without going for a run.
I owned the design and front-end build and split delivery with a school partner.
Result
Delivered as the final projet intégrateur and distributed as an installable Android
APK. It works end-to-end: sign in, start a session, watch live sensor data, save it,
and review it in history. The simulation mode means anyone can try the full flow
from their desk.
What I learned
My first cross-platform mobile build and my first time wiring up Firebase auth and
reading raw device sensors, so much of it was learning the mobile lifecycle,
permissions, and managed-auth patterns under a deadline. Splitting delivery with a
partner also taught me to scope and hand off cleanly instead of holding the whole
thing in my head.
WelcomeHome · weekly statsExplorer · next sessionQuick-start typesStart a sessionLive sensor trackingSession historyIn-app notifications
Personal blog with long-form writing on travel, technology, and design.
Part dev journal, part opinionated storytelling. Built on Next.js with MDX
for content, Tailwind for styling, deployed on Vercel.
A dice roller for Dungeons & Dragons. Rolls any combination of dice
types (d4 through d20) with a clean interface. Because sometimes you
don't have a bag of dice nearby.
Client-side password generator with adjustable length and character sets,
cryptographic randomness through the Web Crypto API, strength feedback,
copy-to-clipboard, and an in-session history. Dungeon-themed because passwords apparently needed lore.