SHT 01AKINAYDIN.DEV — THE BENCH

MEASURED, THEN trusted

This is the technical bench of akinaydin.com — live instruments, honest readouts, real architecture. Nothing on this page is staged for effect; it's either running, or it says so.

  • FCP · MEASURED THIS LOAD
  • HTML
  • VIEWPORT
  • POINTER

A. AYDIN — SOFTWARE SOLUTIONS ARCHITECT — İZMİR / LIVERPOOL — BENCH REV 2

1.88 U2.40 UIRIDESCENT CHROME — SEE LIVE UNIT
FIG. 01 — THE MARK, FRONT ELEVATION · LIVE UNIT AT AKINAYDIN.COM ↗

SHEETS BELOW — SCROLL ↓

SHT 02 — The rig · schematic plotter

THE rig

The plotter, handed to you. Type a command and it drafts the real architecture of a real project — stroke by stroke, at constant pen speed, with the decisions redlined. This isn't a video of a diagram. It's the diagram, being drawn. And yes, the parser expects you to test it.

RIG — SCHEMATIC PLOTTER · REV 2

0 PX PLOTTED

Schematic plotter, idle.

RIG ONLINE — TYPE `help` OR TAP A CHIP.

SHT 03 — Signal lab · live training

THE lab

This is not a diagram of a neural network — it is one. A hand-written MLP trains on this bench, in your idle frames, and every gradient in it can be audited against a numerical check while you watch. The MSc isn't a line on a CV; it's the instrument below.

SIGNAL LAB — MLP-1218

2 → 32 → 32 → 2 · TANH / SOFTMAX · SGD+MOMENTUM

Step
0
Loss
Train acc
0.0%
Params
1218
Budget
Idle frames only

Training idle at step 0.

DTL 01–05 — Case files

CASE files

DTL 01FITNESS TECH · CO-FOUNDER · SPANISH MARKET

UNDER construction

STATUS: UNDER CONSTRUCTION — LIVE REVISIONCo-founder — product, architecture, companyPython lead-gen (Scrapling)No-build static webNode + Express + SQLite CRM

Problem

Boutique studios live and die on memberships but don't run acquisition systems — the market's default is an agency retainer and hope. The company sells the system instead: demand located, contacted, booked, and delivery measured against what the contract actually says.

Architecture

A four-stage acquisition machine, owned end to end. A Python lead engine (Scrapling, with an OpenStreetMap fallback) finds and qualifies studios city by city into SQLite and exports to outreach; no-build landing pages take the click to a booked call; and a multi-tenant Node + Express + SQLite CRM runs the funnel — pipeline board, daily queue, WhatsApp nurture sequences, reactivation — timestamping the exact events the money-back guarantee is written against.

LIVE SHEET: RUN draw fitescala ON THE RIG ↑

Decisions

  • NO-BUILD ON PURPOSE. The public sites are static HTML/CSS/JS with no build step — a React prototype was deliberately downgraded for instant loads and zero-ops hosting. Boring is a feature at this stage.
  • THE CRM DEFENDS THE CONTRACT. Delivery metrics map to specific contract clauses. Presented visits and sign-ups are timestamped because the guarantee is legal text, not marketing copy.
  • FLEXFLOW WAS THE SURVEY. Everything learned shipping FlexFlow's MVP in a three-person capstone — React Native delivery, Firebase economics, what a fitness user actually opens twice — is the data this drawing stands on.

Outcome

Both sites live, first client work in delivery, revision history real and dated. When there's a metric worth printing, it goes on this sheet and not before.

Revision history
REV A2026.07Sheet opened — topology at block level
REV B2026.07GymScale → FitEscala rebrand; gymscale.es + fitescala.com live; CRM in service

DTL 02DESKTOP · REAL-TIME COPILOT

THE COPILOT NOBODY ELSE CAN see

STATUS: BUILT — PRIVATE, SAAS CUT PLANNEDDesign, engineering, product — solo buildElectronReactTypeScriptWhisper (local)

Problem

Live interviews and meetings move faster than anyone can think on their feet, and every tool built to help is visible on screen — which disqualifies it the moment someone else can see it.

Architecture

An Electron shell renders a transparent, click-through overlay — content-protected so it never appears in a screen share or a recording. System audio streams to a local Whisper subprocess on the same machine: no cloud speech-to-text, the room's audio never leaves the laptop. The rolling transcript merges with a context dock (CV, job description, notes — PDF and DOCX parsed in-app) into a prompt that streams back through OpenRouter token by token, landing on the overlay as it's produced.

LIVE SHEET: RUN draw interview-ai ON THE RIG ↑

Decisions

  • INVISIBLE BY DESIGN. The overlay is content-protected and click-through — zero footprint on shared screens, so it never disqualifies the person using it.
  • TRANSCRIBE ON THE MACHINE. Speech-to-text is a local Whisper subprocess, not an API call — the most sensitive audio in the room never becomes someone else's server log.
  • FIRST TOKEN BEATS FULL ANSWER. Tokens stream to the overlay as the LLM produces them — a partial answer arriving now beats a complete one arriving late.

Outcome

A working desktop build — MIT open source for a stretch, private again while the SaaS cut is planned. The interface disappears; the answers don't.

SPECIMEN — MAIN PROCESS — OVERLAY WINDOW (EXCERPT, src/main/overlay.ts) · ts
overlayWindow = new BrowserWindow({
  width: 420,
  height: 600,
  // …
  // ⚡ CRITICAL: These make the window invisible to screen share
  transparent: true,
  frame: false,
  hasShadow: false,
  alwaysOnTop: true,
  skipTaskbar: true,
  // Window type affects screen capture exclusion
  type: 'panel',       // macOS: 'panel' is excluded from screen capture
  webPreferences: {
    nodeIntegration: false,
    contextIsolation: true,
    preload: path.join(__dirname, 'preload.js'),
  },
})

// ⚡ THIS IS THE KEY — excludes window from screen capture
overlayWindow.setContentProtection(true)

// Always on top with highest priority
overlayWindow.setAlwaysOnTop(true, 'screen-saver', 1)

// Visible on all virtual desktops/spaces
overlayWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true })
  • L12 macOS panel windows sit outside normal capture surfaces — belt and braces on top of content protection.
  • L21 Excludes the window from screen capture and recording — this is the whole trick.
  • L27 Follows the user across Spaces and full-screen apps — the copilot is wherever the interview is.

DTL 03SAAS · SUBMISSION PIPELINE · FOUNDATION PHASE

THE PAPERWORK BEHIND THE papers

STATUS: IN DEVELOPMENT — FOUNDATION PHASEArchitecture & engineeringNext.jsSupabase (EU)Python + FastAPIStripe

Problem

Academic submission pipelines run on email threads and spreadsheets — manuscripts, authors, versions and journal requirements drift out of sync the moment more than one person touches them. Before that pipeline can exist, the boring layer has to: identity, billing, abuse-resistance, data residency.

Architecture

Phase 0 is the spine, built first on purpose: a Next.js app on Supabase with EU data residency, ORCID sign-in next to email, phone-verified onboarding and card-required trials with atomic anti-abuse claims. A FastAPI worker takes jobs over an HMAC-signed, timestamped, replay-protected contract; every LLM path passes a layered guard with unit tests and zero-data-retention routing. The GROBID intake pipeline — parse every manuscript on arrival — is drawn on this sheet and scheduled next, not claimed as shipped.

LIVE SHEET: RUN draw researchgo ON THE RIG ↑

Decisions

  • FOUNDATION BEFORE FEATURES. Auth, billing, abuse-resistance and residency shipped before a single manuscript parses — the boring layer is the one you can't retrofit.
  • SIGN THE JOB, NOT THE HOPE. Web-to-worker jobs carry an HMAC signature and a timestamp — a forged or replayed job dies at the door, and a worker can die mid-job without losing the manuscript's place.
  • PARSE ON ARRIVAL — NEXT PHASE. GROBID runs at intake, not on demand, so every manuscript becomes structured data the moment it lands. Designed and scheduled; this sheet marks it PLANNED until it's real.

Outcome

Foundation built and tested — six migrations, CI, database invariants under pgTAP. The pipeline phase is next; it launches when it's real, not before.

DTL 04AI AD STUDIO · TR/EN · HACKATHON → SAAS

SCORE BEFORE spend

STATUS: BUILT — SAAS CUT IN PREPDesign, engineering, product — solo buildNext.js + InngestSupabaseGemini / VeoElevenLabs

Problem

Ad creative in two languages at performance-marketing volume means a production team on retainer — and even then, every variant ships untested. The brief: make the machine produce the variants, and make it rank them before money touches them.

Architecture

A Next.js app orchestrates durable Inngest jobs across four studios. A Python scraper (with a hardened fetch path for hostile storefronts) reads the product page; Gemini writes strategy, copy and frames; Veo and Seedance render video; ElevenLabs voices it; Remotion cuts captions, watermark and CTA. Every variant then runs through a self-hosted neuro-prediction model (Meta's TRIBE v2) on Modal GPUs — spawned and polled, because a render farm doesn't fit inside an edge timeout. Supabase holds state behind RLS with short-lived signed media URLs; credits live in an append-only ledger with atomic charge and refund.

LIVE SHEET: RUN draw urunereklam ON THE RIG ↑

Decisions

  • EVERY STEP CAN DIE SAFELY. The pipeline is durable jobs with per-step failure handlers — a dead step refunds its credits idempotently and releases the run instead of stranding it mid-campaign.
  • FAIL-CLOSED MEDIA. Raw renders live in a private bucket with column-level SELECT revoked and short-lived signed URLs — no guessable media, free tier included.
  • SCORE BEFORE SPEND. No creative leaves the studio without a number on it — the neuro model ranks variants before a human bets budget on a hunch.

Outcome

Sixty commits from hackathon demo to sellable B2B build, TR/EN throughout, the scoring model self-hosted on GPU. The SaaS cut is in preparation; score-before-spend stays the rule.

SPECIMEN — INNGEST — FAILURE → IDEMPOTENT REFUND (EXCERPT, server/inngest/functions.ts) · ts
async function safeRefund(
  opts: Parameters<typeof refundCredits>[0],
): Promise<void> {
  try {
    await refundCredits(opts);
  } catch (err) {
    console.error(
      `[billing][RECONCILE-NEEDED] refund failed user=${opts.userId} ` +
        `amount=${opts.amount} ref=${opts.refType}:${opts.refId} ` +
        `key=${opts.idempotencyKey ?? "-"}`,
      err,
    );
  }
}

// … campaign/requested onFailure — retries exhausted, nothing fanned out:
await safeRefund({
  supa,
  userId: campaign.user_id,
  amount: campaignCreditCost({
    videoCount: brief.videoCount ?? 1,
    videoModel: brief.videoModel ?? "seedance",
    durationSec: brief.durationSec,
  }),
  refType: "campaign",
  refId: campaignId,
  idempotencyKey: `refund:campaign-all:${campaignId}`,
  description: "Kampanya başlatılamadı — otomatik kredi iadesi",
});
  • L8 A failed refund prints a RECONCILE-NEEDED marker instead of throwing — no silent credit loss, and the pipeline still releases.
  • L27 One idempotency key per event: the failure handler may retry, but the ledger writes the refund exactly once.
  • L28 The refund reason ships in Turkish because the product does — TR/EN end to end.

DTL 05MOBILE · ADHD MICRO-STEPS · PRODUCTION PREP

CUT SMALL ENOUGH TO start

STATUS: PRODUCTION PREP — STORE BOUNDDesign, engineering, product — solo buildExpo / React Nativeexpo-sqlite (offline-first)Supabase Edge FunctionsClaude

Problem

ADHD brains stall at starting, not remembering. A to-do app that stores the mountain unbroken is a guilt archive — the unit of work has to shrink below the activation threshold, and the tool has to work the second it's opened.

Architecture

An offline-first Expo app on local SQLite with versioned migrations; identity is invisible anonymous Supabase auth, so the first brain dump happens before any signup wall. Every AI call goes through an op-based edge proxy: the client sends an operation id and parameters — never a prompt, never a key — and the function enforces an op allowlist, per-IP rate limits, per-install daily quotas and a kill switch. Claude runs the breakdown; Whisper, proxied the same way, handles voice. RevenueCat gates the paywall; analytics are consent-gated and no-op unset.

LIVE SHEET: RUN draw pistochia ON THE RIG ↑

Decisions

  • THE APP HOLDS NO KEYS. Operation ids in, structured results out — the Anthropic key lives in the edge function with a kill switch, quotas and fail-closed limits in front of it.
  • OFFLINE-FIRST IS THE PRODUCT. Tasks live in on-device SQLite with real migrations — an ADHD tool that needs a network to show your next step has already failed.
  • NO SIGNUP BEFORE VALUE. Anonymous auth issues an identity silently; the account wall comes after the app has earned it.

Outcome

Fifty-two commits and counting — store assets, launch playbook, EAS builds and a Remotion promo cut. iPhone first; production is the next revision on this sheet.

SPECIMEN — EDGE PROXY — OP ALLOWLIST + KILL SWITCH (EXCERPTS, functions/anthropic-proxy/index.ts) · ts
// The legacy free-relay surface: any request still carrying these is either
// an outdated client or an abuse probe — reject outright.
const FORBIDDEN_KEYS = ['system', 'model', 'messages', 'maxTokens'] as const;

// …
const paused = Deno.env.get('AI_PAUSED');
if (paused === 'true' || paused === '1') {
  return jsonResponse({ error: 'ai_paused' }, 503);
}

// …
for (const key of FORBIDDEN_KEYS) {
  if (key in body) {
    return jsonResponse({ error: 'invalid_request' }, 400);
  }
}

const op = body.op;
if (typeof op !== 'string' || !(op in OPS)) {
  return jsonResponse({ error: 'invalid_op' }, 400);
}
const config = OPS[op]!;
  • L3 The client can't send a prompt, a model or a token ceiling — those live server-side in ops.ts. It can only name an allowlisted operation.
  • L6 AI_PAUSED is a kill switch: one env flip stops all AI spend without a redeploy.
  • L19 Unknown op → rejected. The Anthropic key never exists anywhere in the app bundle.

Prior art — shorter sheets

  • FlexFlow

    The graduation project, built by a team of three: a fitness app matching gym-goers with personal trainers — profiles on both sides, PT-assigned or self-built workout and diet plans, nearby gyms on a map, an in-app AI coach, calorie tracking against a nutrition API. My slice was the mobile client; a teammate carried the NestJS backend. The rehearsal that made FitEscala's decisions faster.

    STATUS: CAPSTONE MVP — RETIREDdraw flexflow
  • Smart Bed

    A hospital smart bed built in mixed Turkish–American student teams in a three-day sprint: bed sensors and an AI camera watch patient movement, and when a patient starts to rise, a wall-mounted nurse-call unit pushes an alert to the nurse's phone — before the fall, not after. Demoed to Bordatech; covered by Yaşar University's news portal (March 2024).

    STATUS: PROTOTYPE — DEMOEDdraw smartbed
  • Charisma AI

    A full SaaS surface built as a hobby and run live for a stretch: selfie plus assessment in, a Gemini-scored charisma profile out — coaching plan, daily check-ins with trend charts, an AI chat coach, Stripe tiers, cron reminder emails, sixteen migrations deep. Pulled from live deliberately; kept on the register as proof the whole surface fits in one pair of hands.

    STATUS: BUILT — RETIRED FROM LIVE
  • YouTube Automation

    One prompt in, a published YouTube video out: script, scene images, voiceover with word-level timestamps, AI video, Remotion render, SEO, thumbnail, upload — an agent-per-step pipeline that resumes from the exact step that failed, with live cost tracking per video. It worked; it also ate the focus the real products needed, so it went on the shelf deliberately.

    STATUS: WORKED — SHELVED
  • HorrorGuess

    A Turkish horror-guessing game built in two days with a friend: the model writes a ghost story under MUST/CAN/CANNOT constraints with JSON-Schema-enforced output, and the player names which of twenty authored creatures it describes. Constraint-driven prompting as a game mechanic.

    STATUS: BUILT — NOT LIVE
  • Chordinia

    A chord-and-lyric assistant for musicians with a real music-theory core — chord parsing, key detection, one-tap transposition, live mic pitch analysis — plus song recognition, lyrics and a social repertoire layer. Paused on purpose: one production push at a time.

    STATUS: PAUSED — PISTOCHIA FIRST
  • Kuluçka Vampir Köylü

    A moderator-and-phones app for Werewolf nights at a client's café: players join by QR, get blurred tap-to-reveal role cards, night actions resolve on the moderator's dashboard, and live vote tallies sync to every phone — with who-sees-what enforced in row-level security, not in the client. The café's nights turned out to run fine on paper cards; the app was retired without regret.

    STATUS: BUILT — NOT NEEDED
  • UberHelper

    A driver-side idea: where and when riders will be, drawn as hotspots on a map. What exists is an honest scaffold — map, tabs, live location, demo hotspot data; the demand model itself was never built. On the shelf, labeled exactly that.

    STATUS: SCAFFOLD — SHELVED
  • Airline Ticketing + AI Chat

    A ticketing API — flights, purchase, check-in, JWT auth — behind an Express gateway with per-IP rate limiting, plus an AI assistant that answers in natural language by consuming the same public REST contract through an adapter layer. Built hands-on in a pair coursework setting.

    STATUS: COURSEWORK — PAIR-BUILT
  • Hotel Booking Microservices

    Seven services behind one gateway — admin, search, booking, comments, notifications, an NLP agent — each with the store that fits it: Postgres for bookings, Mongo for reviews, Redis for cache, a message queue for mail. The 'can I run a real microservice estate?' exercise, built in the same pair setting as the airline system.

    STATUS: COURSEWORK — PAIR-BUILT
  • MiroFish — OSS Contribution

    A feature contribution to MiroFish, an open-source multi-agent prediction engine: a pluggable memory-backend abstraction (Zep Cloud ↔ self-hosted Graphiti + Neo4j behind one factory), a live USD cost tracker with an auto-abort ceiling, a subprocess watchdog, and an emergency-stop UI. The engine itself is upstream's work — this sheet claims the contribution, nothing more.

    STATUS: CONTRIBUTION — UPSTREAM ENGINE

SCH 01 — Calibration certificate

INSTRUMENT schedule

No skill cloud, no five-star ratings. This is a load schedule: what each instrument is rated for in my hands, stated the way I'd state it in an interview.

Skills as a calibration schedule with honest load ratings
InstrumentRatedService note
JavaScript / TypeScript, NodeDAILY LOADPrimary structure — most things on this bench stand on it. EVIDENCE ↑
Next.js / React, SupabaseDAILY LOADThe standing frame: ResearchGo, Ürünereklam, Anı Defteri, Charisma AI, a run of client sites — and both of these sites themselves (Next 16, React 19, TypeScript). EVIDENCE ↑
WebGL / Three.js (R3F), GSAPPROVEN IN SERVICEThe sibling site's hero carries it live — a crystal instrument with a pointer-tracked pose and a self-healing WebGL context. This bench plots in hand-drawn 2D canvas on purpose.
React Native / ExpoDAILY LOADFlexFlow was the capstone rehearsal (Firebase); Pistochia is the production build (Supabase, offline-first SQLite). RUN: draw pistochia
Python — pipelines, scraping, MLUNDER FORMAL TESTMSc-level, distinction track — and already in service: lead-gen and campaign pipelines that moved real budgets. The Lab above is the standing load test. RUN: run the Lab above — the gradient check is the load test
Growth systems — Meta Marketing APIPROVEN IN SERVICEA conference campaign taken from blind spend to a measured cost per lead — the postmortem is in the bench notes below. EVIDENCE ↑
SQL, API design, CI/CD, GitSTANDARD FIXINGSAssumed everywhere on this bench, listed once — migrations, invariants and pipelines live in the case files. EVIDENCE ↑
Accessibility engineeringPROVEN IN SERVICEAn EU-funded accessibility platform's worth — built and shipped; the name is held back here, not the credit.
C/C++, C#, Java, Flutter, Electron, IoTOCCASIONAL LOADUsed for real, not daily — the smart bed ran MicroPython on M5Stack, Chordinia runs Flutter, Interview AI ships in Electron. Occasional load, said honestly. RUN: draw smartbed

NTS 01 — Bench notes · now

BENCH notes

MEMO meta-blind-spend2026.06 #meta-api #postmortem

THE CAMPAIGN THAT OPTIMIZED BLIND

A conference needed registrations, so the account ran a conversion campaign — with no registration event wired to the pixel. Meta optimizes toward what it can see, and it could see nothing: one lookalike tier quietly drained nearly all of its spend into three countries that produced thousands of clicks and nothing of value. The fix wasn't a cleverer audience — it was giving the algorithm a real objective. Switching to native lead forms handed Meta an actual LEAD_GENERATION event to chase, and the same machine that had been burning budget started returning qualified academics at a cost per lead well under the going rate for EU B2B — measured in the campaign's final report, kept qualitative here on purpose. The lesson went on the sheet: an optimizer without a measurable objective isn't underperforming, it's aimless. Give it the number you actually want, or it will find a number you don't.

MEMO env-map-gpu2026.07 #webgl #postmortem

THE ENV MAP THAT KILLED THE GPU

The sibling build — akinaydin.com — wanted a live, reflective instrument: a hero object catching real environment light, updated continuously. The first version re-rendered an environment cube and ran it through PMREM generation on every single frame, to keep reflections perfectly current. It looked correct on a fast laptop, and then it didn't: mid-scroll, on ordinary hardware, the tab threw a WebGL "Context Lost" and the instrument went dark. The GPU wasn't struggling — it was drowning. The fix wasn't cleverer math, it was restraint: bake the environment once, fake the liveliness with a cheap intensity pulse instead of a full re-render, and — because contexts still get lost on real devices — add a remount that heals the canvas automatically instead of leaving a dead frame on the page. Spectacle has a budget like everything else. Spend it once, not sixty times a second.

MEMO idle-frame-trainer2026.07 #ml #performance

WHY THE TRAINER RUNS IN IDLE FRAMES

The MLP in the Lab above could train faster. Hand it to a worker, blast through the dataset with no throttle, and it converges in a fraction of the time. It doesn't run that way, on purpose. On this bench, the page is the product — a visitor scrolling past the Lab should never feel a dropped frame because a neural net is busy proving a point in the background. So the trainer steps in idle callbacks and frame slices instead: a few gradient updates when the browser has spare time, none when it doesn't. Convergence is visibly slower — you can watch the loss curve take its time instead of snapping to a minimum. That's the correct trade, not a limitation to apologize for. A demo that steals the frame budget from the thing it's demonstrating has already failed the brief, no matter how fast the network converges.

On the bench now

  • NOW 01Building FitEscala — co-founder, product and architecture, live revision. gymscale.es and fitescala.com are live.
  • NOW 02Pistochia — an ADHD micro-steps app, heading to the App Store. The current solo priority.
  • NOW 03MSc Artificial Intelligence (Machine Learning), LJMU — distinction track, dissertation in progress.
  • NOW 04Second BSc — Management & Information Systems, Anadolu University — running in parallel.
  • NOW 05Rebuilding the public GitHub register — it's thin, and I'd rather say so than hide the link: https://github.com/akinaydin0 ↗
  • NOW 06Improv theatre in İzmir — a client site that turned into a stage habit.

TRN 01 — Transmittal

START A project

Hiring, contracting, or arguing about architecture — one email.

EMAIL AKIN →

THE PUBLIC face

THE CINEMATIC SIDE — SELECTED WORK · SERVICES

OPEN AKINAYDIN.COM ↗

Bring me a problem that doesn't fit one discipline. Those are my favorite sheets.