Back to Home

Engineering notes & blog

implementation decisions from my projects, plus reflections on building software.

Building Palora's Verified Questions and Spaced Reviews

October 9, 2026

A walkthrough of Palora's resumable document pipeline, task-specific Gemini/Groq routing, source verification, and transactional SM-2 review updates.

Next.jsTypeScriptPrismaAISpaced repetitionSM-2

Building Resona's Offline Android Library and Playback

October 4, 2026

A practical walkthrough of Resona's Kotlin MediaStore channel, shared Flutter playback controller, audio_service controls, and SQLite queue restoration.

FlutterAndroidMediaStoreaudio_serviceSQLite

Designing Muru's Browser-Side Credential Encryption

October 4, 2026

How Muru separates account login from vault unlocking, encrypts passwords and locked note bodies in the browser, and preserves those boundaries in backups.

Next.jsReactTypeScriptSupabasePostgreSQL

Keeping Sailing Instruments Independent of Three.js

October 4, 2026

How shared wind conventions, point-of-sail boundaries, and pure calculations keep a browser sailing HUD consistent.

Three.jsTypeScriptViteWebGLGLSL

Replaying Keystrokes to Verify Typing Scores

October 4, 2026

Why fat-fingers regenerates a typing target and replays timed events instead of accepting a client-reported leaderboard score.

Next.jsReactTypeScriptTailwind CSSGoogle Gemini AI

Sharing Supabase Subscriptions Across Ligtas Map Views

October 4, 2026

How Ligtas Dagupan shares realtime table subscriptions while TanStack Query owns cached map data and refreshes.

Next.jsReactTypeScriptTailwind CSSSupabase

Keeping Photo Stickers Stable Across Preview and Export

October 4, 2026

How Xnap stores normalized sticker positions and sizes, then uses one compositor for photo-strip exports.

ReactNext.jsTypeScriptFramer MotionTailwind CSS

Evolving a Flutter Habit Model Without Breaking Older Records

October 4, 2026

How Reset converts legacy motivation strings and date representations into a consistent Dart model at the persistence boundary.

FlutterFirebaseDartGoogle Gemini AIREST API

A Zod Contract for Streamed AI Task Plans

October 4, 2026

How Break-it-Down gives generated subtasks a defined shape, and where structural validation stops short of plan quality.

ReactNext.jsVercel AI SDKZodFramer Motion

Making Internship Time Tracking Explicit About Asia/Manila

October 4, 2026

How Curricula separates elapsed work duration from local date labels and applies explicit application rules to internship logs.

ReactNext.jsTypeScriptConvexTailwind CSS

Ownership Checks Beyond an Indexed Snippet Query

October 4, 2026

Why Snipr verifies stored snippet and folder owners during mutations even when its read queries already use a user index.

ReactNext.jsTypeScriptConvexTailwind CSS

Giving Refunds and Transfers Different Budget Semantics

October 4, 2026

How Budgio applies distinct balance and category-spending rules to expenses, refunds, income, and transfers.

Next.jsReactTypeScriptTailwind CSSSupabase

Separating Durable Task State from Discord Message Delivery

October 4, 2026

How Pip Bot records approval and rejection before attempting Discord updates, and what remains unresolved when notification delivery fails.

Node.jsMongoDBDiscord API / Discord.js

Separating Retro Presentation from File-Based Blog Content

October 4, 2026

How IWBlog keeps local Markdown articles and Last.fm listening metadata separate from its nostalgic windowed interface.

ReactNext.jsTypeScriptSWRFramer Motion

Rebuilding Derived Cycle Records After Log Edits

October 4, 2026

How Ovulab reconciles tracker-generated cycle records while keeping manually entered history outside the derived-record cleanup.

Next.jsReactTypeScriptTailwind CSSSupabase

Distinguishing NFT Trait Metadata from Enforced Contract Rules

October 4, 2026

A source review of Glitch Freak showing where client-generated trait labels end and Sui Move marketplace rules begin.

Sui MoveReactNext.jsTypeScriptTailwind CSS

Modeling Marketplace Proceeds Separately from Music Metadata

October 4, 2026

How Beats separates music-object fields from listing payments and seller withdrawals in its inspected Sui Move modules.

Sui MoveReactNext.jsTypeScriptTailwind CSS

Building an Image Gallery from Gatsby's File Graph

October 4, 2026

How Velvet Gallery queries filesystem images, requests processed variants, and renders them through GatsbyImage.

Gatsby 5ReactGraphQLGatsby Plugin ImageSharp

From a Hand Image to a Gesture Label in LinguaAR

October 4, 2026

A source walkthrough of LinguaAR hand cropping, aspect-preserving resizing, static-label classification, and the client/server contract to verify.

FlutterDartMachine LearningPython (Flask)MediaPipe

The Era of Vibe Coding: Shipping Fast, Breaking Things, and the Trap of the AI Autopilot

April 16, 2026

Prompting your way to a shipped product is the new normal. But what happens when the 'vibes' run out and you actually have to engineer the underlying logic?

AI DevelopmentVibe CodingIndie HackingTech PhilosophySoftware Architecture

Hello World: Who I Am and What I Build

April 14, 2026

A reflection on my growth from an IT student and intern into a full-stack developer, and the engineering principles that guide how I build.

IntroductionSoftware EngineeringFull-StackWeb3Portfolio

Waking Up the Inner Developer: The Discipline of Continuous Learning

April 14, 2026

Why surviving in tech isn't about mastering a single tool, but building the habit of failing fast, shipping often, and learning continuously across all disciplines.

Information TechnologyContinuous LearningCareer DevelopmentTech PhilosophyIndie Hacking