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 / DLPyTorchCNNsGRUs / RNNsTransformersRL / MDPsAdversarial MLDifferential PrivacyFHEKalman FilterHMMCSP / Classical AIQLoRALoRA4-bit NF4 quantizationDataParallelfp16 / bf16 tuningCVCLIPDenseNetResNetYOLOv8-segdensity-map regressionMODNetBiRefNetBEN2RMBG-2.0T-Rex LabelML / DLPyTorchCNNsGRUs / RNNsTransformersRL / MDPsAdversarial MLDifferential PrivacyFHEKalman FilterHMMCSP / Classical AIQLoRALoRA4-bit NF4 quantizationDataParallelfp16 / bf16 tuningCVCLIPDenseNetResNetYOLOv8-segdensity-map regressionMODNetBiRefNetBEN2RMBG-2.0T-Rex Label
Bio-AI / Domain MLProtein LMs (SaProt)ChemBERTa-2SMILES / drug encodingUni-MolFoldseek 3DiColabFoldpLDDT gatingStanford HIVdbDMS datasetsMedical NER (SciSpacy, BioBERT)UMLS / SNOMED linkingRAG / LLMGraphRAGMedRAGAMG-RAGFAISSNeo4jLangChainLlamaIndexbge embeddingslocal LLM serving (Qwen, Llama 3)Claude Code + custom skillsn8nGemini APIOpenRouterBio-AI / Domain MLProtein LMs (SaProt)ChemBERTa-2SMILES / drug encodingUni-MolFoldseek 3DiColabFoldpLDDT gatingStanford HIVdbDMS datasetsMedical NER (SciSpacy, BioBERT)UMLS / SNOMED linkingRAG / LLMGraphRAGMedRAGAMG-RAGFAISSNeo4jLangChainLlamaIndexbge embeddingslocal LLM serving (Qwen, Llama 3)Claude Code + custom skillsn8nGemini APIOpenRouter
Web / Full-stackReactNext.js 15TypeScriptTailwindNode.jsFastAPIFlaskPySide6SupabaseNeon PostgresCytoscape.jsvanilla JS (no-build)Infra / DevOpsDockerOracle CloudCaddyRailwayGitHub Actions / CI-CDTailscaleLinux / shared GPU boxesself-hosting (Immich, n8n)3D / DesignBlenderShapr3DTripo AI (img to 3D)hexagon / louver geometryboolean + pattern modelingAI image to video pipelinesASCII shadersWeb / Full-stackReactNext.js 15TypeScriptTailwindNode.jsFastAPIFlaskPySide6SupabaseNeon PostgresCytoscape.jsvanilla JS (no-build)Infra / DevOpsDockerOracle CloudCaddyRailwayGitHub Actions / CI-CDTailscaleLinux / shared GPU boxesself-hosting (Immich, n8n)3D / DesignBlenderShapr3DTripo AI (img to 3D)hexagon / louver geometryboolean + pattern modelingAI image to video pipelinesASCII shaders
Hardware / EmbeddedESP32XIAO ESP32C3Heltec LoRa 32 V3MeshtasticSSD1306 OLEDLoRa IN865multi-voltage wiringMediaCanon 5D Mk IVFFmpegH.265 / AV1 transcodehevc_videotoolboxAI image promptingcinematic compositionWriting / DocsLaTeXTikZSpringer LNCS typesettingPPTX deckstechnical reportsDSAPythonJavabacktrackingheapstriessliding windowgraph / matrix DFSHardware / EmbeddedESP32XIAO ESP32C3Heltec LoRa 32 V3MeshtasticSSD1306 OLEDLoRa IN865multi-voltage wiringMediaCanon 5D Mk IVFFmpegH.265 / AV1 transcodehevc_videotoolboxAI image promptingcinematic compositionWriting / DocsLaTeXTikZSpringer LNCS typesettingPPTX deckstechnical reportsDSAPythonJavabacktrackingheapstriessliding windowgraph / 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.