Charan Teja Pampana

I like the part that breaks.

Then comes the slow bit, where I work out why.

I'm Charan. I build machine learning systems — models that read signals, look at pictures, and get things wrong in ways I find genuinely interesting. Python most days, C++ when I want to be humbled, TypeScript left over from a few years of browser extensions. Day three of a bug nobody else wants is usually where I'm most useful.

Inside: the list · what I know · four arguments · how to reach me

The list

Five things, newest first.

Not a highlights reel. This is what exists, and what I think of it now.

  • A model that scores sleep

    I trained something to read a night of brain activity and label the stages the way a technician would. It's good at deep sleep. It's bad at the shallow stage right after you drift off — which is the one human scorers argue about too. I find that oddly reassuring.

    Ongoing · EEG · PyTorch
  • A transformer, typed out by hand

    I rebuilt BERT from the paper instead of importing it. Slower, worse, and the most useful fortnight I've spent. I finally know what the attention mask is actually doing, which I had been nodding along about for a year.

    2025 · PyTorch
  • Looking at retinas

    Two models looking at the same photograph of an eye and voting on it. What I actually cared about was getting it to show me where it looked, so a doctor could disagree with it. A model nobody can argue with is a model nobody should trust.

    2025 · Vision
  • Exam proctoring, in a browser tab

    A Chrome extension that watched students during online exams. Real people sat real papers through it, which is the fastest and most uncomfortable way to learn what you got wrong. I'd think a lot harder about it now.

    2023 · TypeScript
  • Notifications that arrive once

    One message, to the right person, at the moment it happened, exactly once. I budgeted two weeks. It took most of the contract, and taught me what the word "delivered" is quietly hiding.

    2023 · Backend

No accuracy tables on this page. If a number mattered I'd rather tell you about it with the caveats attached.

ML / DLPyTorch◆CNNs◆GRUs / RNNs◆Transformers◆RL / MDPs◆Adversarial ML◆Differential Privacy◆FHE◆Kalman Filter◆HMM◆CSP / Classical AI◆QLoRA◆LoRA◆4-bit NF4 quantization◆DataParallel◆fp16 / bf16 tuning◆CVCLIP◆DenseNet◆ResNet◆YOLOv8-seg◆density-map regression◆MODNet◆BiRefNet◆BEN2◆RMBG-2.0◆T-Rex Label◆ML / DLPyTorch◆CNNs◆GRUs / RNNs◆Transformers◆RL / MDPs◆Adversarial ML◆Differential Privacy◆FHE◆Kalman Filter◆HMM◆CSP / Classical AI◆QLoRA◆LoRA◆4-bit NF4 quantization◆DataParallel◆fp16 / bf16 tuning◆CVCLIP◆DenseNet◆ResNet◆YOLOv8-seg◆density-map regression◆MODNet◆BiRefNet◆BEN2◆RMBG-2.0◆T-Rex Label◆
Bio-AI / Domain MLProtein LMs (SaProt)◆ChemBERTa-2◆SMILES / drug encoding◆Uni-Mol◆Foldseek 3Di◆ColabFold◆pLDDT gating◆Stanford HIVdb◆DMS datasets◆Medical NER (SciSpacy, BioBERT)◆UMLS / SNOMED linking◆RAG / LLMGraphRAG◆MedRAG◆AMG-RAG◆FAISS◆Neo4j◆LangChain◆LlamaIndex◆bge embeddings◆local LLM serving (Qwen, Llama 3)◆Claude Code + custom skills◆n8n◆Gemini API◆OpenRouter◆Bio-AI / Domain MLProtein LMs (SaProt)◆ChemBERTa-2◆SMILES / drug encoding◆Uni-Mol◆Foldseek 3Di◆ColabFold◆pLDDT gating◆Stanford HIVdb◆DMS datasets◆Medical NER (SciSpacy, BioBERT)◆UMLS / SNOMED linking◆RAG / LLMGraphRAG◆MedRAG◆AMG-RAG◆FAISS◆Neo4j◆LangChain◆LlamaIndex◆bge embeddings◆local LLM serving (Qwen, Llama 3)◆Claude Code + custom skills◆n8n◆Gemini API◆OpenRouter◆
Web / Full-stackReact◆Next.js 15◆TypeScript◆Tailwind◆Node.js◆FastAPI◆Flask◆PySide6◆Supabase◆Neon Postgres◆Cytoscape.js◆vanilla JS (no-build)◆Infra / DevOpsDocker◆Oracle Cloud◆Caddy◆Railway◆GitHub Actions / CI-CD◆Tailscale◆Linux / shared GPU boxes◆self-hosting (Immich, n8n)◆3D / DesignBlender◆Shapr3D◆Tripo AI (img to 3D)◆hexagon / louver geometry◆boolean + pattern modeling◆AI image to video pipelines◆ASCII shaders◆Web / Full-stackReact◆Next.js 15◆TypeScript◆Tailwind◆Node.js◆FastAPI◆Flask◆PySide6◆Supabase◆Neon Postgres◆Cytoscape.js◆vanilla JS (no-build)◆Infra / DevOpsDocker◆Oracle Cloud◆Caddy◆Railway◆GitHub Actions / CI-CD◆Tailscale◆Linux / shared GPU boxes◆self-hosting (Immich, n8n)◆3D / DesignBlender◆Shapr3D◆Tripo AI (img to 3D)◆hexagon / louver geometry◆boolean + pattern modeling◆AI image to video pipelines◆ASCII shaders◆
Hardware / EmbeddedESP32◆XIAO ESP32C3◆Heltec LoRa 32 V3◆Meshtastic◆SSD1306 OLED◆LoRa IN865◆multi-voltage wiring◆MediaCanon 5D Mk IV◆FFmpeg◆H.265 / AV1 transcode◆hevc_videotoolbox◆AI image prompting◆cinematic composition◆Writing / DocsLaTeX◆TikZ◆Springer LNCS typesetting◆PPTX decks◆technical reports◆DSAPython◆Java◆backtracking◆heaps◆tries◆sliding window◆graph / matrix DFS◆Hardware / EmbeddedESP32◆XIAO ESP32C3◆Heltec LoRa 32 V3◆Meshtastic◆SSD1306 OLED◆LoRa IN865◆multi-voltage wiring◆MediaCanon 5D Mk IV◆FFmpeg◆H.265 / AV1 transcode◆hevc_videotoolbox◆AI image prompting◆cinematic composition◆Writing / DocsLaTeX◆TikZ◆Springer LNCS typesetting◆PPTX decks◆technical reports◆DSAPython◆Java◆backtracking◆heaps◆tries◆sliding window◆graph / matrix DFS◆

Arguments

Four things I'll argue about.

  1. Most of the job is not the model. It's the data, and the twenty small assumptions nobody wrote down.
  2. A number that gets better on the first try is a bug until proven otherwise. Something has usually leaked.
  3. If I can't say what the thing is doing, I don't have a working system. I have a lucky one.
  4. Deleting code counts as progress. Most of my good days are subtraction.

Write to me

If you got this far, say something.

Email is the one I actually read. The others I check on a schedule I'd rather not describe.