Product launches, architecture decisions, tooling built, and infrastructure changes — documented as they happened. For the raw commit-level feed see /whats-new.
Apps catalog system + portfolio polish
Why →Released apps and pre-release projects were blurring together in one /apps grid, undermining the credibility of what was actually shipped. Splitting them by release state — and giving every project a real detail page — turns the portfolio from a list into a navigable product.
New /apps section with 9 dedicated catalog routes split by family and release state. The naming convention (*apps = released, *projects = pre-release) scales: same pattern for Android, web, CLI, and QA families.
38 statically-generated detail pages built via a shared CatalogProjectDetail component. Trade-off: kept /apps/web and /apps/android bespoke (Play badge + icons) rather than forcing them into the shared shell — preserves family-specific affordances.
Status + category filters on /apps/androidprojects via an extracted client component AndroidProjectsGrid; page itself stays server-rendered for metadata. This is the right split: keep metadata + data fetch server-side, extract only interactive grids to client.
OpenGraph images for 10 catalog routes via next/og. Validated that next/og's ImageResponse works under output: 'export' — generates PNG at build time, no runtime cost.
Structured data layer: ItemList on /apps index + each family; SoftwareApplication on every detail page; BreadcrumbList on all nested routes; Person on /#about with sameAs[GitHub, LinkedIn, Play]. Targets Google's rich-result eligibility for apps + knowledge panel.
Cross-linking: home LiveApps → /apps/android, home AppsInDev → /apps/androidprojects, blog posts ↔ apps by tag intersection (lib/related.ts scores normalized tag overlap).
About section: real photo, linkable stat cards, Hire me + Now CTAs, 2-row timeline (2012-2024 QA → 2024-Now SudarshanTechLabs). Replaces 3 dense paragraphs with scannable structure.
Honest copy pass across uses, now, About, AppsInDev, KonamiEgg, GitHubStats — replaced '21+ live apps' marketing claims with explicit '1 live, 21 in development' matching the new routing split.
Engineering health: Vitest + React Testing Library wired in (41 tests pass), 4 stateless components moved from client to RSC (Aurora, Stack, Timeline, MobileBottomNav), Lighthouse baseline expanded to cover /apps routes.
Why →A portfolio of 'I shipped X' bullets reads like every other indie dev site. Each card now states the specific technical decision behind a system — why Firebase Realtime DB over Firestore, why per-app keystore isolation, why Workers cold-start matters for the contact form. The point is to make trade-offs legible.
Upgraded all major sections with real engineering specificity — Systems, Timeline, Stack, ReleaseDiscipline, FeaturedApp.
MyFamilyTracker: Firebase Realtime DB vs Firestore decision documented — RT chosen for stream semantics at sub-second propagation; Firestore would have been over-billed at the read frequency this app needs.
Android Release Systems card: per-app keystore isolation prevents a single compromise from cascading across 22+ apps. Zero-manual-step workflow means a tagged commit produces a signed AAB without intervention.
QA Intelligence card: 18 device environments named explicitly — Fire OS, Android TV, Tizen, webOS, dedicated signage players — because 'cross-platform' is meaningless without the surface area called out.
AI Automation card: each plugin framed around the specific failure mode it was built to solve, not the framework it uses. DroidForge exists because signing was breaking releases, not because Claude Code exists.
Infrastructure Systems card: Firebase RT/Firestore tradeoff, Cloudflare Workers cold-start rationale, GitHub Pages as zero-infrastructure policy hosting — three boring decisions that compound.
Blog automation pipeline operational
Why →Solo dev + 22 apps = no time to write. The pipeline runs Telegram → GitHub Actions → MDX → PR auto-merge unattended, but topic-deduplication and editorial gates keep quality from collapsing into AI slop. Built it because the alternative was 'no blog at all'.
Telegram bot → GitHub Actions → MDX → PR auto-merge pipeline running fully unattended. Author intent enters via a Telegram message; the post lands on main within minutes.
Post generation structured around real engineering topics — QA strategy, Android systems, Kotlin patterns — drawn from a curated topic queue, not free-form LLM drift.
Duplicate topic detection via check-post-topic.mjs prevents regenerating existing content. Editorial gate (validate-post.mjs) blocks merges on missing frontmatter, broken links, or unsourced claims.
159 posts redistributed across Jan–Jun 2026 date range with no gaps or duplicates, so the archive reads like consistent output rather than burst-and-die.
KotlinSense — LSP bridge for AI coding sessions
KotlinSense Claude Code plugin shipped: bridges Kotlin Language Server diagnostics into AI coding sessions.
LSP-aware code suggestions now carry type information, import resolution, and real compile-time errors.
Built because AI code generation without LSP context produces suggestions that compile but fail at runtime in Kotlin.