# Abhishek Sharma > Full-stack developer. I build web apps, Android apps, and AI systems. > This site holds my projects, the work I abandoned, and what I write about building things. 16 write-ups, 30,412 words, 79 questions answered, all from production incidents. Every post is also available as raw markdown at the same URL with `.md` appended. The complete text of every post is at https://www.abhisheksan.com/llms-full.txt. ## Pages - [About](https://www.abhisheksan.com/about): who I am, what I work on, and my GitHub activity - [Projects](https://www.abhisheksan.com/projects): what I have built and shipped - [Graveyard](https://www.abhisheksan.com/graveyard): projects I killed, and why - [Writing](https://www.abhisheksan.com/writing): posts on building software - [Contact](https://www.abhisheksan.com/contact): how to reach me ## Projects - [Polaris](https://www.abhisheksan.com/projects/polaris): a project operating system for claude code. Claude Code, TypeScript, Agents, Developer Tooling. 2026 (source: https://github.com/abhisheksharm-3/polaris) - [Credify](https://www.abhisheksan.com/projects/credify): hackathon-winning media verification platform. NextJs, TypeScript, TailwindCSS, FastAPI, Python. 2024 (live: https://verifiedbycredify.vercel.app/, source: https://github.com/abhisheksharm-3/credify) - [Flockr](https://www.abhisheksan.com/projects/flockr): modern household management platform. Kotlin, Jetpack Compose, Android, Supabase, PostgreSQL. 2025 (live: https://github.com/abhisheksharm-3/flockr/releases, source: https://github.com/abhisheksharm-3/flockr) - [Inquora](https://www.abhisheksan.com/projects/inquora): chat with any file, even youtube videos. NextJs, TypeScript, TailwindCSS, RAG. 2025 (live: https://inquora.vercel.app/, source: https://github.com/abhisheksharm-3/inquora) - [Retask](https://www.abhisheksan.com/projects/retask): minimalist android to-do app. Jetpack Compose, Android, Room, Kotlin. 2025 (live: https://github.com/abhisheksharm-3/retask/releases, source: https://github.com/abhisheksharm-3/retask) - [GetResume](https://www.abhisheksan.com/projects/getresume): gemini-powered resume parser. NextJs, TypeScript, TailwindCSS, FastAPI, Python. 2024 (live: https://getresumes.vercel.app/, source: https://github.com/abhisheksharm-3/get-resume) - [Resummarize](https://www.abhisheksan.com/projects/resummarize): ai-powered note summarizer. NextJs, TypeScript, TailwindCSS, Supabase. 2025 (live: https://re-summarize.vercel.app/, source: https://github.com/abhisheksharm-3/resummarize) - [Votegrity](https://www.abhisheksan.com/projects/votegrity): blockchain voting dapp. Web3, Solidity, NextJs, TypeScript. 2024 (live: https://votegrity.vercel.app/, source: https://github.com/abhisheksharm-3/votegrity) - [Kalendar](https://www.abhisheksan.com/projects/kalendar): ai-native scheduling app. NextJs, TypeScript, TailwindCSS, Gemini API, Appwrite. 2024 (live: https://kalendarapp.vercel.app/, source: https://github.com/abhisheksharm-3/kalendar) - [Poetica](https://www.abhisheksan.com/projects/poetica): llm-powered poetry generator. NextJs, TypeScript, TailwindCSS, FastAPI, Python. 2024 (live: https://poetica-ai.vercel.app/, source: https://github.com/abhisheksharm-3/poetica) - [QuickGist](https://www.abhisheksan.com/projects/quickgist): fast code snippet sharing (react + go). Go, React, TypeScript, TailwindCSS. 2024 (live: https://quickgist.vercel.app/, source: https://github.com/abhisheksharm-3/quickgist) - [LiveHealthy](https://www.abhisheksan.com/projects/livehealthy): health predictor (react + flask + ml). Flask, React, Machine Learning. 2024 (live: https://livehealthy.vercel.app/, source: https://github.com/abhisheksharm-3/livehealthy) ## Earlier work Learning projects, kept for the record. - [Nahmachine](https://www.abhisheksan.com/projects/nahmachine): a site that helps you say 'no' (2025) - [Nostra](https://www.abhisheksan.com/projects/nostra): restaurant site built with react + appwrite (2023) - [Foodix](https://www.abhisheksan.com/projects/foodix): mern-based food delivery prototype (2024) - [Aestoti](https://www.abhisheksan.com/projects/aestoti): pomodoro timer built with sveltekit (2024) - [Sanklp-Hotel](https://www.abhisheksan.com/projects/sanklp-hotel): hotel ui clone from figma design (2023) - [TokyoTaste](https://www.abhisheksan.com/projects/tokyotaste): static restaurant landing page (html + css) (2023) - [VisualAlg](https://www.abhisheksan.com/projects/visualalg): graph algorithm visualizer (2024) - [Overcastly](https://www.abhisheksan.com/projects/overcastly): vanilla js weather app (2023) - [REST-Countries](https://www.abhisheksan.com/projects/rest-countries): rest countries api challenge (sveltekit) (2024) - [TacTicPlay](https://www.abhisheksan.com/projects/tacticplay): ai tic tac toe (minimax) (2023) ## Writing - [stripe pause: release the schedule before the trial](https://www.abhisheksan.com/writing/stripe-pause-release-schedule-before-trial): a pause built on trial_end is undone by any subscription schedule still attached to the subscription. release the schedule first, then write trial_end. (2026-08-26, 11 min) - [the over-broad boolean that zeroed a token pool](https://www.abhisheksan.com/writing/one-boolean-zeroed-a-teams-token-pool): a product-classification flag that also matched the per-seat tier routed monthly renewals through managed-tier logic and granted whole orgs zero ai tokens. (2026-07-03, 10 min) - [facebook reels isn't a platform, it's a flag](https://www.abhisheksan.com/writing/facebook-reels-ayrshare-one-target-two-variants): facebook shorts isn't a real format. the work was modeling one publish target reached two ways, kept coherent with a reel flag and a mutual-exclusivity rule. (2026-06-23, 10 min) - [provisioning stripe subscriptions before ach settles](https://www.abhisheksan.com/writing/stripe-ach-subscriptions-settlement-grace-period): ach debits take days to clear, so a subscription can't wait for settlement. provision on payment_intent.processing, with a grace period for later failures. (2026-06-18, 12 min) - [the data wasn't in documents](https://www.abhisheksan.com/writing/rag-to-duckdb-excel-text-to-sql): designed a pageindex tree index and graphrag pipeline for organizational knowledge. discovered the data was excel rows. rebuilt around duckdb and text-to-sql. (2026-06-08, 11 min) - [langgraph hitl with postgres checkpoints and sse](https://www.abhisheksan.com/writing/langgraph-hitl-postgres-checkpoints-sse): wiring LangGraph interrupt() and Command(resume=) into a FastAPI pipeline: a compiled graph singleton, a dedicated checkpoint pool, and resumable SSE streaming. (2026-06-05, 13 min) - [why fastapi background tasks disappear mid-execution](https://www.abhisheksan.com/writing/fastapi-asyncio-task-garbage-collected): asyncio.create_task() holds a weak reference to the task object. if nothing else does, the gc cancels the task silently while it's still running. (2026-06-04, 7 min) - [why 247 of 299 articles got deindexed in 2 weeks](https://www.abhisheksan.com/writing/content-pipeline-batch-publishing-deindexing): 249 articles published on april 24. google indexed all of them, then dropped 247 within 2 weeks. the git history and gsc data made the cause clear. (2026-06-02, 9 min) - [when two of my pages cannibalize the same query](https://www.abhisheksan.com/writing/detecting-keyword-cannibalization-self-refresh-queue): search console showed two of my own urls ranking for one query, so the learning phase flags the weaker page and queues it to refresh on the next run. (2026-05-28, 10 min) - [giving an agent pipeline memory that changes its output](https://www.abhisheksan.com/writing/agent-pipeline-memory-system-prompt-experiment-loop): semantic, episodic and procedural memory in pgvector, pulled by the current goal into each run's system prompt, then refilled by an experiment loop. (2026-05-22, 11 min) - [publishing articles to a repo with the git data api](https://www.abhisheksan.com/writing/publishing-articles-github-git-data-api): the pipeline commits many generated files at once through github's git data api with no clone: build blobs and a tree, commit, move the ref, open a pr. (2026-05-21, 10 min) - [one door for every llm call: fallbacks and caching](https://www.abhisheksan.com/writing/llm-router-openrouter-fallback-prompt-caching): every model call in this pipeline runs through one function: openrouter-native fallback chains, anthropic prompt caching, and a cheaper dev-mode path. (2026-05-20, 8 min) - [what the transformer paper taught me about rag](https://www.abhisheksan.com/writing/transformer-principles-in-rag-retrieval-design): encoder embeddings, l2 norm as attention's scaling trick, multi-resolution retrieval as residual connections, and context over fine-tuning. (2026-05-18, 11 min) - [scoring an agent's own writing before it publishes](https://www.abhisheksan.com/writing/validation-gate-scoring-pipeline-output): the last step before publishing scores an article on three axes with an LLM, then runs deterministic checks in python that the model score can never override. (2026-05-13, 11 min) - [react native tts false interrupts and synthesis latency](https://www.abhisheksan.com/writing/react-native-tts-hardware-aec-interruption): rms fires on speaker output. VOICE_COMMUNICATION fixes android; whisper VoiceChat handles ios. piper: xnnpack + warmup. kokoro: forward() not stream(). (2026-05-08, 14 min) - [canvas lms self-hosted: polling submissions without kinesis](https://www.abhisheksan.com/writing/canvas-lms-self-hosted-sqs-polling): canvas self-hosted gave us only rest polling. the fix was a spring + sqs poll chain with watermarks for a 15k/month qms pipeline. (2026-04-20, 10 min) ## Questions answered in these posts - how do you pause a Stripe subscription without canceling it? Answered in https://www.abhisheksan.com/writing/stripe-pause-release-schedule-before-trial - why does a Stripe subscription charge immediately after I set trial_end? Answered in https://www.abhisheksan.com/writing/stripe-pause-release-schedule-before-trial - what is the difference between releasing and canceling a Stripe subscription schedule? Answered in https://www.abhisheksan.com/writing/stripe-pause-release-schedule-before-trial - does resuming a paused Stripe subscription restore credits and tokens? Answered in https://www.abhisheksan.com/writing/stripe-pause-release-schedule-before-trial - how do you schedule a Stripe subscription quantity decrease without breaking a later pause? Answered in https://www.abhisheksan.com/writing/stripe-pause-release-schedule-before-trial - why did a Stripe subscription renewal grant an organization zero tokens? Answered in https://www.abhisheksan.com/writing/one-boolean-zeroed-a-teams-token-pool - what made the tier-classification flag match the wrong product? Answered in https://www.abhisheksan.com/writing/one-boolean-zeroed-a-teams-token-pool - why did the same bug produce two different symptoms on two branches? Answered in https://www.abhisheksan.com/writing/one-boolean-zeroed-a-teams-token-pool - how do you stop a billing webhook from silently writing a zero-token pool? Answered in https://www.abhisheksan.com/writing/one-boolean-zeroed-a-teams-token-pool - why test the second renewal instead of just the first payment? Answered in https://www.abhisheksan.com/writing/one-boolean-zeroed-a-teams-token-pool - is Facebook Shorts a real publishing format? Answered in https://www.abhisheksan.com/writing/facebook-reels-ayrshare-one-target-two-variants - why must Facebook Feed and Facebook Reels be mutually exclusive in a single post? Answered in https://www.abhisheksan.com/writing/facebook-reels-ayrshare-one-target-two-variants - what makes a video qualify as a Facebook Reel through Ayrshare? Answered in https://www.abhisheksan.com/writing/facebook-reels-ayrshare-one-target-two-variants - how do you share platform-selection rules across multiple UIs without a circular import? Answered in https://www.abhisheksan.com/writing/facebook-reels-ayrshare-one-target-two-variants - how do you test Reels publishing when the API has no sandbox? Answered in https://www.abhisheksan.com/writing/facebook-reels-ayrshare-one-target-two-variants - why provision access on payment_intent.processing instead of payment_intent.succeeded for ACH? Answered in https://www.abhisheksan.com/writing/stripe-ach-subscriptions-settlement-grace-period - what is the difference between payment_intent.processing and payment_intent.succeeded? Answered in https://www.abhisheksan.com/writing/stripe-ach-subscriptions-settlement-grace-period - how do you stop Stripe from automatically canceling a subscription when an ACH payment fails? Answered in https://www.abhisheksan.com/writing/stripe-ach-subscriptions-settlement-grace-period - how do you avoid provisioning a subscription twice when both a synthesized and a real invoice event fire? Answered in https://www.abhisheksan.com/writing/stripe-ach-subscriptions-settlement-grace-period - how do you test ACH settlement timelines without waiting days for real payments? Answered in https://www.abhisheksan.com/writing/stripe-ach-subscriptions-settlement-grace-period - why convert Excel to Parquet instead of querying it directly? Answered in https://www.abhisheksan.com/writing/rag-to-duckdb-excel-text-to-sql - what happens when Claude generates invalid SQL? Answered in https://www.abhisheksan.com/writing/rag-to-duckdb-excel-text-to-sql - how do you handle Excel files with merged cells or inconsistent formatting? Answered in https://www.abhisheksan.com/writing/rag-to-duckdb-excel-text-to-sql - can this work alongside prose documents if the organisation has both? Answered in https://www.abhisheksan.com/writing/rag-to-duckdb-excel-text-to-sql - why DuckDB instead of SQLite for this use case? Answered in https://www.abhisheksan.com/writing/rag-to-duckdb-excel-text-to-sql - why compile the graph once instead of rebuilding it per request? Answered in https://www.abhisheksan.com/writing/langgraph-hitl-postgres-checkpoints-sse - why does the checkpointer need a separate database connection pool? Answered in https://www.abhisheksan.com/writing/langgraph-hitl-postgres-checkpoints-sse - what is GraphBubbleUp and when does it get raised? Answered in https://www.abhisheksan.com/writing/langgraph-hitl-postgres-checkpoints-sse - how does Command(resume=) know which interrupt() point to resume from? Answered in https://www.abhisheksan.com/writing/langgraph-hitl-postgres-checkpoints-sse - what happens when the SSE client disconnects mid-run? Answered in https://www.abhisheksan.com/writing/langgraph-hitl-postgres-checkpoints-sse - can the pipeline resume after a FastAPI process restart? Answered in https://www.abhisheksan.com/writing/langgraph-hitl-postgres-checkpoints-sse - does asyncio.create_task() guarantee a task runs to completion? Answered in https://www.abhisheksan.com/writing/fastapi-asyncio-task-garbage-collected - does this affect FastAPI's built-in BackgroundTasks? Answered in https://www.abhisheksan.com/writing/fastapi-asyncio-task-garbage-collected - how do you detect this in production without asyncio debug mode? Answered in https://www.abhisheksan.com/writing/fastapi-asyncio-task-garbage-collected - what happens to fire_task tasks when FastAPI shuts down? Answered in https://www.abhisheksan.com/writing/fastapi-asyncio-task-garbage-collected - does google index all articles from a content pipeline on launch day? Answered in https://www.abhisheksan.com/writing/content-pipeline-batch-publishing-deindexing - what is google cluster pruning and how does it cause deindexing? Answered in https://www.abhisheksan.com/writing/content-pipeline-batch-publishing-deindexing - does changing publication dates after google crawls an article hurt indexing? Answered in https://www.abhisheksan.com/writing/content-pipeline-batch-publishing-deindexing - if 247 articles got deindexed, can they be recovered? Answered in https://www.abhisheksan.com/writing/content-pipeline-batch-publishing-deindexing - what is keyword cannibalization and why does it hurt search rankings? Answered in https://www.abhisheksan.com/writing/detecting-keyword-cannibalization-self-refresh-queue - how do you detect cannibalization from Google Search Console data? Answered in https://www.abhisheksan.com/writing/detecting-keyword-cannibalization-self-refresh-queue - how do you decide which of two competing pages to keep? Answered in https://www.abhisheksan.com/writing/detecting-keyword-cannibalization-self-refresh-queue - why queue a refresh for a later run instead of fixing the page immediately? Answered in https://www.abhisheksan.com/writing/detecting-keyword-cannibalization-self-refresh-queue - does consolidating cannibalizing pages mean deleting one of them? Answered in https://www.abhisheksan.com/writing/detecting-keyword-cannibalization-self-refresh-queue - how do you make an LLM agent actually use its long-term memory? Answered in https://www.abhisheksan.com/writing/agent-pipeline-memory-system-prompt-experiment-loop - what is the difference between semantic, episodic and procedural memory for an agent? Answered in https://www.abhisheksan.com/writing/agent-pipeline-memory-system-prompt-experiment-loop - why validate an experiment at both 7 and 30 days instead of once? Answered in https://www.abhisheksan.com/writing/agent-pipeline-memory-system-prompt-experiment-loop - how do you stop a content pipeline from citing the same facts every time? Answered in https://www.abhisheksan.com/writing/agent-pipeline-memory-system-prompt-experiment-loop - what happens to accumulated agent memory if the vector store is unavailable? Answered in https://www.abhisheksan.com/writing/agent-pipeline-memory-system-prompt-experiment-loop - why use the github git data api instead of the contents api to publish files? Answered in https://www.abhisheksan.com/writing/publishing-articles-github-git-data-api - how do you commit multiple files in a single github commit over the api? Answered in https://www.abhisheksan.com/writing/publishing-articles-github-git-data-api - can you open a github pull request programmatically without cloning the repo? Answered in https://www.abhisheksan.com/writing/publishing-articles-github-git-data-api - how do you make programmatic pull request creation idempotent? Answered in https://www.abhisheksan.com/writing/publishing-articles-github-git-data-api - how do you safely update a typescript index file when publishing generated content? Answered in https://www.abhisheksan.com/writing/publishing-articles-github-git-data-api - why route every LLM call through a single function instead of the provider SDK? Answered in https://www.abhisheksan.com/writing/llm-router-openrouter-fallback-prompt-caching - how do OpenRouter fallback chains differ from client-side retries? Answered in https://www.abhisheksan.com/writing/llm-router-openrouter-fallback-prompt-caching - why does litellm break OpenRouter fallback model ids? Answered in https://www.abhisheksan.com/writing/llm-router-openrouter-fallback-prompt-caching - how much does Anthropic prompt caching save on a multi-call pipeline? Answered in https://www.abhisheksan.com/writing/llm-router-openrouter-fallback-prompt-caching - how do you develop against an LLM pipeline without spending money on every run? Answered in https://www.abhisheksan.com/writing/llm-router-openrouter-fallback-prompt-caching - why should an embedding model be encoder-based and not a decoder LLM? Answered in https://www.abhisheksan.com/writing/transformer-principles-in-rag-retrieval-design - why L2-normalize embeddings before cosine similarity? Answered in https://www.abhisheksan.com/writing/transformer-principles-in-rag-retrieval-design - what does multi-resolution chunking have to do with residual connections? Answered in https://www.abhisheksan.com/writing/transformer-principles-in-rag-retrieval-design - why inject org context at runtime instead of fine-tuning the model? Answered in https://www.abhisheksan.com/writing/transformer-principles-in-rag-retrieval-design - why treat an LLM quality score of 7.0 as uncertain instead of a hard pass? Answered in https://www.abhisheksan.com/writing/transformer-principles-in-rag-retrieval-design - why not just trust the LLM's score to decide whether to publish? Answered in https://www.abhisheksan.com/writing/validation-gate-scoring-pipeline-output - what are the deterministic checks that can override the model's score? Answered in https://www.abhisheksan.com/writing/validation-gate-scoring-pipeline-output - how does the validator judge whether an article fits a specific org? Answered in https://www.abhisheksan.com/writing/validation-gate-scoring-pipeline-output - what is the marginal zone and why not use a hard pass/fail threshold? Answered in https://www.abhisheksan.com/writing/validation-gate-scoring-pipeline-output - how do the hard checks and the model score combine into a pass or fail? Answered in https://www.abhisheksan.com/writing/validation-gate-scoring-pipeline-output - why does rms amplitude detection trigger false interrupts during tts playback on android? Answered in https://www.abhisheksan.com/writing/react-native-tts-hardware-aec-interruption - what does AudioSource.VOICE_COMMUNICATION do differently from AudioSource.MIC? Answered in https://www.abhisheksan.com/writing/react-native-tts-hardware-aec-interruption - how does ios handle echo cancellation for voice interrupts? Answered in https://www.abhisheksan.com/writing/react-native-tts-hardware-aec-interruption - do you still need a threshold check after switching to VOICE_COMMUNICATION? Answered in https://www.abhisheksan.com/writing/react-native-tts-hardware-aec-interruption - why can't you use nnapi or coreml as the onnx provider for piper? Answered in https://www.abhisheksan.com/writing/react-native-tts-hardware-aec-interruption - why use forward() instead of stream() for kokoro on android? Answered in https://www.abhisheksan.com/writing/react-native-tts-hardware-aec-interruption - why doesn't self-hosted canvas lms support real-time event streaming? Answered in https://www.abhisheksan.com/writing/canvas-lms-self-hosted-sqs-polling - can you use canvas lms webhooks in a self-hosted deployment? Answered in https://www.abhisheksan.com/writing/canvas-lms-self-hosted-sqs-polling - what is a self-feeding sqs queue and why use it instead of a cron job? Answered in https://www.abhisheksan.com/writing/canvas-lms-self-hosted-sqs-polling - how do you handle duplicate submissions when polling the canvas api? Answered in https://www.abhisheksan.com/writing/canvas-lms-self-hosted-sqs-polling ## Contact - Email: abhishek@abhisheksan.com - GitHub: https://github.com/abhisheksharm-3 - LinkedIn: https://linkedin.com/in/abhisheksan/ - X: https://x.com/iabhisheksan