Raw dev logs, daily progress, and behind-the-scenes of building things.
Today was all about burning wood, the fireplace, the smell of it lingering in the cold air, that quiet comfort it gives. I love that feeling.
The day didn’t start ideally. We woke up to a small kitchen accident and ended up searching for the nearest hospital for an emergency check. Thankfully it wasn’t serious, just one of those moments that shakes the morning a bit.
The weather turned out warm and sunny: normally something I’d enjoy, but today it felt strange, not fitting the mood of this little getaway. I was so ready for a gloomy day...
Still we leaned into coziness:

I didn’t have much energy left for anything creative, but I did flip through the books I brought, especially Tiny Experiments, which I’m still really enjoying. It’s a reminder I often need:
better done than perfect.
It’s a mindset that’s shaped everything I’ve built in the last years, and it keeps working.
Today, I let myself just go with the flow and do nothing productive, and maybe that was exactly the point.
Today was mostly a work day: tying up the last updates, sending messages, closing loops before stepping away for the weekend. By the time everything was wrapped, we drove three hours out of Berlin to a small cabin, the kind of place where the quiet hits you as soon as you open the door.

Not much creativity today, just a long transition from busy brain to still air.
But there’s something valuable in that too, the way your system slowly shifts gears.
Right now it’s just silence, trees, and the soft feeling of arriving somewhere slower.
I’m hoping the next two days become a gentle reset: reading, thinking, touching the kit pages I printed, maybe taking a few photos, maybe doing nothing at all.
A small pause between weeks.
A breath.
Today I polished the final details of the Space Explorer Kit and added a credits & contact page with all our socials and info.
I also made a small expansion to one of the activity pages. I thought about adding a 30th activity just to round the number, but it felt forced, so I let it go.
Right now the kit has 29 activity pages, plus instructions, samples, and extras, a total of 46 PDF pages. A real kit.
I also printed everything to do a physical check and immediately saw that the astronaut mask was way too small for a kid (though it fit our CPO = chief paw officer perfectly...)

I updated the layout, and the new size looks just right.
Seeing the printed pages made everything feel real. My printer ink is basically gone, but it was worth it: this was the first real draft, and I wanted to feel the weight, the textures, the scale.
Tomorrow I’m leaving for a small weekend getaway. My laptop screen is completely broken (perfect timing), so maybe it’s a sign to stay away from screens for a bit and do more physical work. I’ll take the printed kit with me, play around with the pages, maybe shoot some listing photos, watch things, rest, and find new inspiration.
Tomorrow will definitely be a rest day.
Today I added the parent instruction pages and asked for a few early feedbacks.
One suggestion stood out: the planet orbit exercise might work even better if kids first learned the order of the planets, just to make the activity more intuitive.
So we added a new riddle-matching exercise to introduce the planets in the correct order from the sun. After that, the orbit cut-and-glue activity comes in naturally.

This bumped the activity pages from 28 → 29… and honestly now I want to make it 30 :D
I’ll think about one more small activity while polishing the final details.
Today I finished the full set of page concepts for the Space Explorer Kit!
After adding the control panel and the little alien friend cutouts, everything finally feels cohesive. What’s left now are the detail cleanups and the instruction pages for parents: the last pieces before calling it complete.

The kit will have 30+ pages in total, with 28 activity pages, which feels like a solid first edition. If I ever want to expand later, I can. But for now, I want to wrap this up and move toward the next step.
My goal for the weekend is to prepare the first listing draft on Shopify.
It’s getting close and it’s exciting to see this idea turning into something real. After that I will take a bit break from this to explore other ideas further and then come back with a party edition or a complete new kit.
Today I returned to Kit of Happiness and picked up right where I left off: polishing the final pages of the Space Explorer Kit.
I added the postcard activity page, a tiny space flag, mazes, and a full crossword puzzle. The kit is starting to feel complete now. It’s funny, it feels a bit like coding a game but in a printable world, and I genuinely enjoy moving between creativity and logic like this.
I also coded a tiny helper website using Google Gemini 3, which I’m exploring more lately. It now generates crosswords and mazes for me, and I think I’ll reuse this tool for the next kits too. A small system that will save me hours later.

It feels really good to be back in this creative flow again.
If nothing unexpected comes up this week, I truly hope the first version will be ready.
Today was all about finalising the new partnership config structure.
I created new iOS and Android releases after moving our banner configuration fully to our backend API. We already had a small remote-config endpoint for the top alert banner, so I extended it to also serve the banner/ad config. For now it’s basically a JSON dump, but that’s enough to unblock us, the main goal was removing the need for app-store releases for every banner change.
After verifying everything in the app and also including a few bug fixes from current version, we built 3.2.2 and shipped it to both stores.
Android was approved almost instantly.
iOS is still in review, but hopefully it lands tomorrow.
In the meantime, I also added a simple admin dashboard on the backend to manage the JSON. It’s not a polished UI, just a text input for the config but it works. This is exactly the type of scrappy tooling you need when speed matters; the nice UI can always come later, the output won’t change anyway.

Something became very clear to me:
I pivoted based on a real opportunity and executed fast.
This is the founder muscle I’ve been building for years.
Launch the first Kit of Happiness product.
🚨 Temettü got a real partnership interest
→ shifted gears immediately
→ built the full partnership infrastructure in ~5 days
→ shipped a production app update (3.2.2)
→ implemented a proper Ad/Banner system
→ wrote tracking + partner documentation
→ prepared Temettü to monetize properly with custom partnerships
This wasn’t “I didn’t follow my plan.”
This was responding to real opportunity with precision which is exactly what indie makers/studios need in order to grow.
A good week.
Today I looked into how to properly detect when an item is actually visible on the screen in React Native, because the current banner tracking I've recently added fires on load even for components that never appear in the viewport. Not great for accurate analytics.
I explored a few directions:
onLayout isn't enough; it triggers even if the item is off-screen.measure() / measureInWindow() to get the element’s positiononScroll to listen for viewport changesI also checked a few libraries (react-native-inviewport, react-native-intersection-observer) but they’ll need performance testing in long lists.
It’s a small detail but for banner impressions, these details matter.
The global standard comes from the IAB (Interactive Advertising Bureau) and like Google, Meta etc. follows as well. An ad impression should be counted only when:
These prevent “fake” impressions and inflated metrics.
A valid impression must meet all:
| Condition | Requirement |
|---|---|
| Visibility | At least 50% on screen |
| Duration | Minimum 1s visible |
| Frequency | Logged once per load |
| Valid state | App active, component actually in viewport |
AdMob and all certified SDKs do this inside the SDK.
Since we’re using custom banners, we have to recreate the logic ourselves.
I built everything around three core hooks opting out an external library:
useInViewuseAdAnalyticsuseCTAAnalyticsAll coordinated through the global useScrollTracking provider. The system now detects real viewport visibility using measureInWindow(), calculates visible-area percentage, enforces the ≥50% visibility rule, and ensures the ad stays visible for 1 continuous second before counting it as a valid impression.
I also added app-state checks (foreground only), fast-scroll detection to block fake impressions, and automatic timer resets any time a condition breaks. Clicks are only logged if a valid impression exists, and everything uses a shared impression_id so multi-partner sheets can link CTA → item clicks cleanly.
Metadata handling is now consistent (placement index/position, partner order, campaign details). Overall, the system mirrors how Google/Meta handle viewability but fully custom and built specifically for our app.
Accurate impressions → correct CTR → honest reporting → trustworthy campaigns.
Now we can have these dashboards in Posthog with impression/click properties → automatic funnels & insights:
I’ll turn this into a full technical case study later, but these are the core notes and base implementation from today.
The second day of React Summit US 2025: Day 2 was fully remote setup and it felt much more technical and unexpectedly repetitive, with several talks circling around the React Compiler, memoization, React Scan, and performance profiling.
Even though the talks went in many directions from AI-assisted design workflows to performance tips, RPi experiments, and UI patterns, the day carried one clear theme: the ecosystem is pushing toward faster, smarter, more intentional React.
The hydration talk was nice, showing how selective, viewport-based hydration can solve real SSR performance issues. The design system session added a nice contrast, reminding how much thoughtful engineering goes into truly global UI. And the creative frontend talk closed the day beautifully:
Frontent is where math meets art, where science meets engineering, where curiosity turns into creation.

Cristobal Chao’s talk was the emotional highlight for me. It captured exactly why frontend has always felt like home, the place where creativity and logic meet.
The final slide said:
Do something to make money
Do something you love
One day those two things will be the same
Your job is to keep closing the gap.
It landed perfectly.
This is why I show up every day to create, even on rest days. Because creating is the one place where I feel fully alive.
Tomorrow, I’ll be ready to dive into the next thing again and I’ll dive deeper into all these ideas in a proper blog post soon.
Today became a full rest + learning day thanks to betterment days that my company provides 3 days a year, and I spent it catching up with the all talks from React Summit US 2025: Day 1.
It turned into one of those rare days where you slow down but still feel creatively recharged.
A few themes stood out across the talks:
The future of React is leaning heavily into compilers, cross-platform DOM, and React Server Components.
Frameworks like TanStack Start and Redwood SDK are challenging the classic SSR/SPA split.
DX vs UX conversations, and the realization that RSC shipped through frameworks, not React itself.
New AI-powered workflows, from design-to-code pipelines to editor integrations, showing how quickly the tooling is evolving.
Talks around why reading code still matters, and how AI accelerates execution but can never replace taste or intention.
Design for one React idea was interesting, meaning that no context, syntax change but a unified format for React Web or for React Native as an example. I'm curious about it's practical usage.

Today I also learned something unexpectedly useful:
👉 You can toggle JavaScript enabled/disabled state easily using a Chrome extension.
Why do I care?
Because I’ve been wondering how oneweek.dev behaves especially for SEO but I was so lazy to priotize. And… surprise:
It’s not visible at all when JS is disabled.
Zero content.
Just a blank page.
Not great for a simple static site.
It should render without JavaScript, this happens because one layout uses use client at the top, I probably dragged a client component too high in the tree.
This means:
I've quickly fixed it between sessions but I need to take a look further for our other websites.
More detailed notes will come later in a full blog post, but for today, this was exactly the reset I needed.
A quiet day of absorbing new ideas, thinking ahead, and getting inspired again. Tomorrow I will be able to watch the second day live.
Showing 1-10 of 35 entries
Showing 1-30 of 35 entries