Can CeylanVienna-based, globally curious.

Learn

Concepts & how-tos.

Real decisions from real projects, explained with the professional terminology behind them.

AllAI & ToolsArchitectureBackendFrontendTestingProduct Thinking
Frontend·intermediate

Do not build masks from translucent polygons

A map overlay looked like fog-of-war in theory, but overlapping transparent buffers created ugly rings. The fix was to treat it as one composited mask, not many semi-transparent shapes.

2026-05-30

Testing·intermediate

Test what the toast cannot prove

A form can say Saved while the database holds stale coordinates, missing fields, or old cache data. The fix is to make E2E tests verify the saved record, not just the success message.

2026-05-15

Backend·intermediate

Batch email sends before rate limits look like caps

A newsletter send to 13 people reported 5 accepted and 8 failed. It looked like a hidden recipient cap. The real problem was parallel API calls hitting a provider rate limit.

2026-05-08

AI & Tools·intermediate

Send a read-only agent first

One agent spent three hours chasing a build error. A second agent read the migrations against the query code in two minutes and found the real bug. The lesson isn't about which AI is smarter, it's about audit-first workflows.

2026-05-06

Product Thinking·intermediate

Two AI agents need one live memory file

If two AI coding agents share a repo but not a single mutable memory layer, the user becomes the message bus. Here is the failure mode, why it happens, and the operating model that fixes it.

2026-04-29

Architecture·intermediate

Make workflow state additive before making it authoritative

When migrating a system to a new state model, the instinct is to replace the old state immediately. The safer path is additive rollout: the new state coexists with the old, falls back to it when absent, and only becomes authoritative once it is proven in production.

2026-04-25

Product Thinking·beginner

Manual means manual posting, not manual preparation

In multi-platform publishing workflows, 'manual' platforms are often under-served because automation feels unnecessary. But manual posting and manual preparation are different things. Automating the preparation, content, assets, copy, is always worth doing, even when the final post is made by hand.

2026-04-25

AI & Tools·beginner

Use a working-memory file as the handoff layer between AI coding sessions

AI coding agents forget everything between sessions. A working-memory.md file kept in the repo solves this, it's the shared brain that survives model switches, overnight gaps, and multi-agent collaboration.

2026-04-25

AI & Tools·intermediate

Default-first fallback orchestration for AI generation pipelines

AI generation routes that call a single provider are brittle. Default-first fallback orchestration makes them resilient: try the configured primary, fall back automatically on failure, record what actually ran, and let users override for one run without changing the default.

2026-04-25

Architecture·intermediate

Preventing a single channel from becoming the accidental default in multi-channel systems

In multi-platform publishing and notification systems, whichever channel was implemented first tends to become the silent default. Other channels get skipped without error. The fix is making required outputs explicit from the start, not implicit from what exists.

2026-04-25

Product Thinking·intermediate

The distribution map pattern: one config that drives all publishing outputs

Multi-platform publishing workflows accumulate per-platform hacks over time. The distribution map pattern replaces them with a single declarative config: topic → platform list, which becomes the source of truth for what gets generated and where it goes.

2026-04-25

Backend·beginner

Separate the editorial date from the publish timestamp, they mean different things

Content systems routinely conflate two different concepts: the date the author wrote something, and when it was actually published. Treating them as one field causes sorting bugs, broken date displays, and incorrect analytics. They need to be separate from the start.

2026-04-25

AI & Tools·intermediate

How to split work across two AI agents without merge conflicts

When two AI agents work on the same codebase in parallel, file-level collisions are inevitable without a deliberate coordination pattern. Protected lanes and explicit ownership boundaries solve this without requiring real-time communication.

2026-04-25

Architecture·intermediate

Lazy backfill: roll out new data shapes without a migration script

When you add a new required field to stored records, the instinct is to write a migration script that processes everything upfront. A better approach normalizes on read, detect missing fields, fill them lazily, write once, then stable.

2026-04-25

Backend·intermediate

The data isolation audit: every endpoint must be scoped to the requesting user

The most common multi-tenant security bug is an endpoint that returns the right data for the right user, most of the time. A systematic audit ensures user_id filtering is never accidentally omitted.

2026-04-18

Backend·intermediate

Never use Promise.all() with the GitHub Contents API

The GitHub Contents API requires each file commit to complete before the next one starts. Parallel commits produce 409 conflicts, and the error message doesn't make it obvious why.

2026-04-18

Backend·intermediate

APScheduler vs Celery: choosing the right background job tool

APScheduler is the right tool for one background job on a fixed schedule. It becomes the wrong tool the moment you need per-user workloads, priority queues, or retry logic.

2026-04-18

Product Thinking·intermediate

Category-aware scoring: why one median across mixed data produces noise

Computing a single price median across a mixed dataset produces false positives. Segment by category, subcategory, and relevant attributes before scoring, or your deals aren't deals.

2026-04-18

Architecture·intermediate

Catch data conflicts before code review, not after

Two features touching the same database table is a conflict waiting to happen. A feature registry and a mandatory conflict check forces the conversation before the code is written.

2026-04-18

Backend·intermediate

Why parallelising your scraper will get you silently banned

Anti-bot systems don't always return 403s. Sometimes they return empty results, and your logs look clean. Here's why sequential requests are the architecture, not a workaround.

2026-04-18

Backend·beginner

Scheduled publishing without a cron: runtime-evaluated date filters

You don't need a cron job to make content appear on schedule. Evaluate the scheduled date at request time and the content becomes visible automatically, no deployment, no job, no database update required.

2026-04-18

Backend·intermediate

Cache AI API results by content hash to prevent cost explosions

Users upload the same image multiple times. AI APIs charge per call. A cache keyed on SHA-256 of the input bytes ensures you pay for each unique input once, not once per upload.

2026-04-18

AI & Tools·beginner

The apps that read all your messages, and you installed them yourself

A universal messaging bridge ran silently on my Mac for months, relaying WhatsApp messages through its own servers. Here's what happened, how to check if you're affected, and how to remove it.

2026-04-18

Frontend·intermediate

Building a web app for future native migration: constraints from day one

If you're planning to wrap your web app in a native shell later, the constraints aren't optional from day one. Web-only APIs baked into your components will block the migration.

2026-04-18

Architecture·beginner

Soft deletes aren't just for audit trails, they're your sales pipeline

When you hard-delete a record, you lose the sales lead. Inactive records in a marketplace platform are your best prospects, enforce soft delete at the database role level, not in application code.

2026-04-18

Architecture·intermediate

When the bug isn't a bug: diagnosing runtime barriers before debugging

Some failures aren't bugs in your code, they're structural mismatches between your runtime and the capability you're trying to use. Recognising this distinction saves days of misdirected debugging.

2026-04-18

Backend·beginner

Financial data APIs fail silently, design for None, not for errors

Rate-limited financial data APIs don't raise exceptions. They return empty DataFrames and None values while your logs show no errors. Every metric computation must handle this explicitly.

2026-04-18

Backend·beginner

Layering data sources: accept both APIs as fallback, don't choose one

Financial data from a single free API is unreliable. Layer a secondary source on top, not as a replacement, but as a fallback when the primary returns None. You get resilience without complexity.

2026-04-18

Architecture·beginner

Sequential vs Parallel Execution: when faster is the wrong answer

The instinct is always to run things in parallel. Here's why that instinct can get you banned, blocked, or with corrupted data.

2026-04-13

Frontend·beginner

The no-build frontend: when you don't need React

Most internal tools and personal dashboards don't need a JavaScript framework. Here's the case for plain HTML and when the complexity earns its keep.

2026-04-13