# Newsroom — gaganmalik.io

Last-Updated: 2026-06-13

Recent 8 posts include full text; older posts are summaries with URLs.

## Newsroom

### Release v1.21.21 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-21-21)

Answer-engine optimization at scale: tiered llms corpus, ai.txt, @id-linked entity graph, IndexNow, and a public knowledge API—plus Core Web Vitals fixes, social preview repair, a new writing, and PWA polish. Ships as Git tag v1.21.21.

Answer-engine optimization at scale: tiered llms corpus, ai.txt, @id-linked entity graph, IndexNow, and a public knowledge API—plus Core Web Vitals fixes, social preview repair, a new writing, and PWA polish. Ships as Git tag v1.21.21.

Release 1.21.21 makes gaganmalik.io legible to answer engines, not just search crawlers. The site now publishes a spec-aligned llms.txt index, tiered corpora (llms-stories.txt, llms-newsroom.txt), an ai.txt companion, and a public GET /api/knowledge/summary endpoint with a canonical @graph for agents. Person, Article, FAQPage, Speakable, ProfilePage, and HowTo JSON-LD share stable @id URIs so author and publisher nodes link across pages. robots.txt advertises corpus URLs; the sitemap lists them with fresh lastmod; IndexNow runs postbuild when INDEXNOW_API_KEY is set.

Performance and discovery also ship in this tag. Pricing, success stories, and About use one-hour ISR to cut TTFB; Speed Insights upgrades to v2 for reliable mobile vitals. Social link previews were repaired (normalized 1200×630 OG covers, share descriptions on Article JSON-LD). The essay Minimum Viable Movement is published with a cleaned cover asset. iOS visitors get a gated Add to Home Screen hint after engagement, not on every load.

#### Added

- AEO: tiered llms.txt / llms-full.txt / llms-stories.txt / llms-newsroom.txt / ai.txt + localized llms-hi/ar/es indexes

- GET /api/knowledge/summary — public canonical entity JSON for AI agents

- lib/json-ld-entity.ts — unified Person @id, FAQPage, Speakable, ProfilePage, HowTo, linked Article author/publisher

- Pricing FAQPage + Speakable + HowTo JSON-LD; sr-only pricing summary for answer queries

- scripts/indexnow-notify.ts (postbuild when INDEXNOW_API_KEY is configured)

- Newsroom writing: Minimum Viable Movement

- PWA iOS install hint (5 sessions + engagement gate)

- project-documentation/AEO_MONITORING.md

#### Changed

- robots.txt route with llms/ai discovery comments and expanded AI crawler allowlist

- llms-full.txt slimmed (~6 KB index) — full bodies moved to tiered files

- OG images normalized to true 1200×630 PNG; cache bust v=4 on MVM cover

- Article JSON-LD uses getPostShareDescription (not subtitle[0])

- @vercel/speed-insights ^2.0.0; ISR revalidate=3600 on pricing, about, stories routes

#### Fixed

- react-hooks/set-state-in-effect in use-pwa-ios-install-hint.ts

- Broken WhatsApp/Instagram link previews from mismatched OG dimensions and descriptions

---

### Minimum Viable Movement
[Read more](https://www.gaganmalik.io/en/newsroom/minimum-viable-movement)

By Gagan Malik

By Gagan Malik

I was in the open desk area of a coworking space, one ear on my laptop, watching Airbnb's Summer Release livestream, the usual designer-led theatre where trips and host tools arrive like product drops, when my phone started to buzz. Then buzz again. Family WhatsApp. Seventeen notifications in under a minute. I told myself I would open it after the keynote. I lasted maybe ten seconds. I could not resist. I dipped my head, pretended to adjust my headphones, and opened the thread. The spice hit immediately. My mother had forwarded an Instagram reel from Gurgaon. My father, loyal to the ruling party, had already replied: "The Court was taken out of context." A cousin had sent three fire emojis. Someone I did not recognise had written, "Finally a party for us."

I thought: I am six thousand miles away, why is this my problem. Then I thought: my father is defending a judge who called young Indians vermin. I tapped the reel. A cockroach in a suit. A slogan for the lazy and unemployed. A name that only makes sense if you know *janta* means the people. Someone had registered a **Cockroach Janta Party (CJP)**, a people's party for the vermin, a parody of the party my father votes for, and the comments under my mother's forward were already treating the insult like a badge. I began to type something that would have backed him up. Deleted it. I did not have the energy for that argument. I put the phone face down, pretended to watch the rest of the Airbnb keynote, and went back to nodding when the presenter paused. That afternoon I only knew that a story had started in India without me. I did not yet know how fast it would move.

What followed took seven days. A political narrative launched at product speed. Power did not keep pace.

#### It shipped over a weekend

On 15 May 2026, the Chief Justice of India told a bench there were "youngsters like cockroaches" who could not find work, and "parasites of society" who attack the system. [indianexpress](https://indianexpress.com/article/legal-news/cji-surya-kant-clarifies-cockroaches-remark-fake-degrees-row-10692979/) His office said the remark was misquoted and aimed at fake degrees. The clip travelled anyway. The next day **Abhijeet Dipke**, thirty, posted from Boston: "What if all cockroaches come together?" He was not in a ward office. He was at Boston University, finishing a master's in public relations, with years in opposition-party memes behind him and a Google Form that asked whether you were unemployed, lazy, chronically online, and able to rant professionally. By the end of the week he had a parody of the ruling party's name, an insect in a suit, a five-point manifesto, and a website polished enough for television. He says the movement is independent of any party he once worked for. His critics say the training shows. What is not in dispute is timing: he shipped the narrative while the insult was still hot. [bbc](https://www.bbc.com/news/articles/cz72y11jjq1o)

The people the bench insulted were not in Boston. **Rohan**, who finished at IIT Kharagpur last year, is still on the placement portals he opened as an undergraduate. On a call from Pune he told me he now tells relatives he is "in process" instead of "between things." Same forty silent inboxes. Same father asking, quietly, whether the degree was worth it. The Chief Justice had not named him. He had named a category. Rohan signed the CJP membership form because choosing the insult felt less humiliating than receiving it from the country's highest court. **Shreeum**, twenty-five, needed no introduction by me. Within days of launch, reporting quoted her saying she did not feel politically represented, that she had turned to Instagram after failing to find suitable work, and that young Indians were tired of lives that felt "pre-decided and premeditated." [economictimes](https://economictimes.indiatimes.com/news/economy/policy/cockroach-janta-party-how-an-insect-jibe-united-indias-disgruntled-jobless-youth/articleshow/131271889.cms) One woman. One sentence for a generation that parties treat as a metric. From my day job I have a label I dislike for Abhijeet's stunt: a minimum viable movement. Not a party with booths. A story that ships before shame cools. Rohan and Shreeum are not shareholders. They are the audience the story sells back to itself.

#### Twenty million is the wrong dashboard

About **80,000** form sign-ups by 19 May. **14.5 million** on Instagram by 21 May, ahead of the ruling party at roughly **8.7 million** and the main opposition at roughly **13.2 million** on the same app. **Nearly 20 million** by 22 May, and about **218,000** on X before India withheld the account. [straitstimes](https://www.straitstimes.com/asia/south-asia/india-seeks-to-stamp-out-viral-cockroach-youth-party) The figures are a week old and still obscene. Govern by follower graph and you rewrite the playbook. Govern by ballot and Rohan is still refreshing his inbox. Shreeum is still filming. Nothing else moved.

#### Followers are not votes

It is tempting to reach for Tahrir or Zuccotti Park. The Arab Spring filled squares and toppled leaders where institutions were thin; Occupy shifted American discourse on inequality and then stalled at law. [voa](https://www.voanews.com/a/arab-activists-little-in-common-between-occupy-wall-street-arab-spring-131594593/173273.html) Activists in Cairo said at the time that lazy comparisons with New York insulted both struggles. The CJP is a third creature. Satire first. AI-built collateral. A Chief Justice as trigger, not a bailout or a dictator's police. India's Gen Z are not camping for months. They occupy a feed for days, wear costumes for cameras, and leave. What rhymes with older uprisings is narrow: networked anger, leaderless optics, a state unsure whether to ignore, co-opt, or crush. What does not rhyme is the prize. Tahrir could name a president. Occupy could name a bank. This movement names a mood and stops.

#### The architect sat in Boston

Indian politics still runs on proximity: local police, party enforcers, agency visits, a withheld account inside the country while the post keeps travelling. Abhijeet Dipke lit the fuse from Massachusetts because the product is narrative on American platforms aimed at Indian phones. Crackdown reporting described handles run from abroad, backup accounts registered overseas, followers overwhelmingly at home. [firstpost](https://www.firstpost.com/explainers/cockroach-janta-party-x-account-blocked-national-security-concern-14014043.html) You no longer need to sleep in the same city as your voters to move them. The playbook is too slow for the feed and too blunt when it reaches for national security while the architect sits in another timezone and Rohan and Shreeum act inside India. Abhijeet told interviewers he expects arrest the moment he lands at Delhi airport. [republic-jail](https://www.republicworld.com/india/delhi-police-will-take-me-to-tihar-jail-why-cockroach-janta-party-founder-fears-arrest-in-india-2026-05-21-125246) Perhaps that is theatre. Perhaps he is right to be afraid. The centre of gravity was never a party office. It was a dorm room the ruling party could not knock on.

#### What the feeds got right

Akash, on his show, said what I had been saying in product meetings: a tiny team can now ship logo, site, and demands at feed speed while legacy parties argue over who prints the banner. Faye asked whether this was joke, meme, or warning, listed exam leaks and flat pay, and named uprisings that actually changed governments before admitting she did not know if reels alone can change India. [deshbhakt](https://www.youtube.com/watch?v=6fhFI8o3PPQ) Both are right about the instrument. Neither fixes the ceiling. Shreeum was not in a cockroach mask that week. She was in the comment thread, turning unemployment into content because the labour market offered no better script. Rohan went to a clean-up drive in Pune because a friend dared him, left early, and said the antennae made him visible to neighbours who already thought he was wasting his degree. A form in Boston ticked past another lakh. That cost him an afternoon. It did not buy him a seat at the table my father's generation still fights over on WhatsApp.

Beneath the jokes sit the old failures: jobs, leaked papers, inflation, the lie that a degree is a queue ticket. Read the manifesto past the memes and you find serious demands. [ft](https://www.ft.com/content/2bfed8a4-8ea0-4627-b7a8-e9ca46945239) I am not mocking them. I am saying the feed is not the building. The main opposition still could not speak at Gen Z speed, so a joke ate their lunch. [indiatoday](https://www.indiatoday.in/india/story/cockroach-janta-party-gen-z-opposition-vacuum-india-2918380-2026-05-28) That humiliates everyone with a legacy badge. It does not crown the insect.

#### When they blocked the account

The state stopped pretending to be amused. The party's X account was withheld on national-security grounds, according to reporting that week citing government and intelligence sources. Abhijeet posted "Own goal" and opened a backup handle. Establishment television called it a pump-and-dump and pointed at his opposition past. My father would hear proof the joke is foreign-backed. I hear proof the meme hurt. Abhijeet has filed in the Delhi high court over the block. [firstpost](https://www.firstpost.com/explainers/cockroach-janta-party-x-account-blocked-national-security-concern-14014043.html) Courts move in months. The timeline does not.

#### You can beat me on this

A Chief Justice comparing the young to vermin is not a footnote in a democracy. Reclaiming the slur can be agency. Twenty million follows in a country where half the population is under thirty is a signal, not a mandate. Withholding the account is an admission the story landed. India's election law still awards seats through registration and candidates, not Instagram. [zeenews](https://zeenews.india.com/india/former-aap-leaders-cockroach-janta-party-makes-a-wave-but-can-it-get-registered-check-eci-rule-3049507.html) Generative AI made dissent cheap to launch. It did not make governing cheap.

My father will forward another clip defending the Court. Shreeum will peel off the costume, open the same job portals, and wait. Rohan will meet his father's question about the degree with silence again. I am the generation in between: old enough to build the dashboard, young enough to remember when squares mattered more than feeds. That wait is the argument. The rest is noise.

---

### Release v1.20.20 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-20-20)

Locale-aware structured data, hreflang-style alternates, and clearer social previews—plus a small React lint fix on the stories carousel. Ships as Git tag v1.20.20; full notes on GitHub and in CHANGELOG.

Locale-aware structured data, hreflang-style alternates, and clearer social previews—plus a small React lint fix on the stories carousel. Ships as Git tag v1.20.20; full notes on GitHub and in CHANGELOG.

Release 1.20.20 tightens how search engines and answer engines read this site across English, Hindi, Arabic, and Spanish. JSON-LD URLs now follow the same locale prefix as each page’s canonical URL, so Article, Person, WebPage, and service markup no longer default to English paths on non-English pages. The newsroom and case study detail pages also emit BreadcrumbList schema that matches the visible trail.

Next.js metadata gains `alternates.languages` (with `x-default` to English) on the home, about, pricing, stories, newsroom, legal, docs, Ask, media kit, print brochure, site map, Rolex landing, and internal preview routes, alongside the root layout default. The edge proxy sets an `x-gm-locale` hint from the first path segment; the root layout reads it so the initial HTML `lang` and `dir` (including RTL for Arabic) align with the URL before client hydration. Case study pages now include Open Graph and Twitter card metadata with a hero image when available. The About page meta description is trimmed for SERP display. The stories carousel defers scroll-edge state updates with `queueMicrotask` to satisfy the React hooks linter.

#### Added

- `buildAlternateLanguageUrls()` in `lib/site` and `alternates.languages` across major public routes

- `x-gm-locale` on the proxy response and async root `<html lang>` / `dir` from request headers

- `lib/breadcrumb-jsonld.ts` plus BreadcrumbList JSON-LD on newsroom articles and case study detail

- Open Graph and Twitter metadata on case study (`/success-stories/[slug]`) detail pages

#### Changed

- Newsroom Article JSON-LD `url` and author `Person.url` use the active locale

- About Person + Speakable WebPage JSON-LD URLs use the active locale

- Home services ItemList and Pricing `Service` schema `provider.url` use the active locale

- Root layout global Person / WebSite JSON-LD navigation links use explicit `en` where intended

#### Fixed

- `react-hooks/set-state-in-effect` in `components/stories/stories-carousel.tsx` (defer scroll edge updates)

---

### Release v1.19.19 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-19-19)

Ask voice fullscreen improvements and post-audit security: optional rate limits, response headers, safer API surfaces, billing and push validation. Documented on this page; code ships as Git tags v1.19.19 and v1.19.20.

Ask voice fullscreen improvements and post-audit security: optional rate limits, response headers, safer API surfaces, billing and push validation. Documented on this page; code ships as Git tags v1.19.19 and v1.19.20.

Release 1.19.19 improves the Ask voice fullscreen experience for accessibility and clarity. The dialog uses an explicit title and description for assistive technology, live status text for listening, connecting, TTS, mute, and follow-up prompts, and a short trust line under the sources pill when collapsed. The TTS answer region uses aria-live off during word-level highlighting to reduce screen reader churn; transcript scrolling respects reduced motion. The waveform halo animation respects prefers-reduced-motion, and the particle canvas skips heavy drawing while the tab is hidden. Closing the session returns focus to the voice entry control, and a Type with keyboard instead action exits to the main Ask view. Analytics records voice session end and fullscreen close with a source (button, Escape, or type instead). Hub and hero artwork reflect this release.

The same delivery cycle includes a security and quality pass (repo structure can be explored with Graphify when a local graph is built; see project-documentation/GRAPHIFY.md). Optional Upstash Redis rate limits protect /api/chat, /api/ask/transcribe, and /api/feedback when UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN are set; without them, behavior is unchanged. Global response headers add X-Frame-Options, X-Content-Type-Options, and Referrer-Policy alongside the existing Permissions-Policy. Chat and transcribe return generic errors to clients while details stay in server logs. Billing validates Stripe customer ids (cus_…) from cookies or body. Web Push subscribe payloads use schema validation with bounded user-agent length. Ask feedback auto-issues use the correct GitHub repository.

#### Added

- Ask: voice fullscreen sr-only title and description; sources trust cue when the list is collapsed

- Ask: Type with keyboard instead link; focus return to the voice mode control after closing

- Ask: analytics for ask_voice_session_end and ask_voice_fullscreen_close (source: button, escape, type_instead)

- Optional per-IP rate limiting via @upstash/ratelimit (chat, transcribe, feedback) when Redis env is configured

- Security headers: X-Frame-Options, X-Content-Type-Options, Referrer-Policy

- Newsroom: this combined release note (hub card and article)

#### Changed

- Ask: voice status line (listening, mic ready, speaking, follow-up hint, prompt)

- Ask: TTS scroll container aria-live strategy during highlight; transcript and answer scrolling honor reduced motion

- Ask: waveform halo and canvas idle when the document is hidden

- Ask: chat and transcribe generic client errors; upstream detail in logs only

- Billing portal: validate Stripe customer ids before use

- Web Push subscribe: Zod validation and user-agent length cap

#### Fixed

- Feedback: GitHub repo path for Ask feedback issues (gagan-malik/gagan-malik-website)

---

### Release v1.18.18 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-18-18)

Ask transcribe and STT, Presto gallery and portfolio case studies, TOC with listen seek, toolbar and speed sheet polish, newsroom hub updates, custom cover artwork.

Ask transcribe and STT, Presto gallery and portfolio case studies, TOC with listen seek, toolbar and speed sheet polish, newsroom hub updates, custom cover artwork.

Release 1.18.18 adds a transcribe API and client speech-to-text hooks with voice UI updates on Ask, a Presto case study gallery with screenshots and a downloadable ZIP, and a refactored Meta portfolio case study with hero metadata, skeletons, and copy refinements. Stories add a mobile share sheet, listen dock bar with fixed toolbar and playback speed sheet, a story hero row with read time and share, and an article table of contents that seeks listen playback to section offsets. Listen mode exposes seekToCharOffset and registerSeekHandler; case studies map TOC ids to character offsets. Newsroom article pages gain matching listen bar and TOC wiring, and this update ships with dedicated cover artwork on the hub card and article hero. Popovers stack above fixed chrome for speed controls; analytics locale prioritisation reports refresh; llms.txt and the media kit ZIP regenerate after production builds.

#### Added

- Ask: transcribe API route, STT hooks, and voice UI updates

- Stories (Presto): case study gallery, screenshots, gallery ZIP download

- Stories: Meta portfolio case study, story detail refactor, hero meta row (read time, listen, share), loading skeletons, adjacent nav

- Stories / Newsroom: article TOC (mobile sheet and popover); TOC seeks listen playback via seekToCharOffset and case study char offset map

- Newsroom hub: bento contrast, transparent hub, media kit nav, article copy

- Newsroom: custom v1.18.18 release cover image (hub and hero)

#### Changed

- Stories: mobile share sheet; listen dock, toolbar spacing, mobile sheet chrome, centered idle/playback rows; portfolio sidebar copy

- Listen / speed: preset-only speed sheet; speedSheetDescription i18n; popover z-index so speed UI stacks above fixed chrome

- Newsroom: listen bar, share popover, and post wrapper for TOC and seek

- Analytics: locale prioritisation report updates

#### Fixed

- Stories: shared gallery ZIP filenames; Presto hero uses card cover; five gallery screenshots

#### Chore

- Regenerate llms.txt and media kit ZIP after production build

---

### Release v1.17.17 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-17-17)

Media kit and brand assets, Web Push digest and PWA badges, Ask voice and updates UX, navigation and stories polish, new newsroom writing.

Media kit and brand assets, Web Push digest and PWA badges, Ask voice and updates UX, navigation and stories polish, new newsroom writing.

Release 1.17.17 ships a dedicated media kit with downloadable brand assets and a generated ZIP, Web Push on Android for newsroom digests with updated Privacy and Terms disclosures, and PWA improvements including installed-app badges via the service worker and a clearer Add to Home Screen path on iOS. Ask gains richer retrieval (up to eight source updates per answer with a follow-up control), voice mode fixes across TTS, voices API, and fullscreen layout, and navigation picks up the mobile sheet, skeletons, and tighter menu polish. Stories and archive layouts are refined for small screens, and the newsroom adds new writing alongside this release note.

#### Added

- Media kit page with brand assets, generated ZIP, navigation entry, and i18n

- Web Push on Android for newsroom digests; Privacy and Terms updates for push

- PWA: installed-app badges (Service Worker SET_BADGE), iOS Add to Home Screen hint

- Ask: up to eight source updates per response with Show more follow-up

- Newsroom articles: No Download Required, Diplomatic Immunity, Someone Designed That Button

#### Changed

- Media kit downloads UX and safer forced-save behavior for asset files

- Navigation: mobile sheet, loading skeletons, snappier mobile menu, hamburger-aligned close

- Stories: mobile logo sizing, CTA visibility, stats layout

- Archive filters: desktop layout and spacing

#### Fixed

- Ask: voice mode TTS loop, voices API, fullscreen canvas refs, error UX, fullscreen hint alignment

- E2E and integration tests for Ask, home, and What is New flows

---

### No Download Required
[Read more](https://www.gaganmalik.io/en/newsroom/no-download-required)

By Gagan Malik

By Gagan Malik

Ben graduated from Berkeley's CS programme summa cum laude, raised a VC-backed round, and built something a real person would actually pay for: working product, early traction, customers who came back. He was the kind of founder you root for. He brought me in because of my mobile UX expertise. I dug into the usage analytics, ran user testing, and recommended they invest in the progressive web app first, nail the experience, and defer native builds until they had validated which platform their users actually converted on.

Ben heard "not ambitious enough." Nobody challenged the logic. Nobody asked what the native build would cost against their runway. The objection was social, not technical. It was about what kind of company builds a proper app and what kind builds a website with delusions of grandeur.

#### What I Didn't Say

I believe in disagree and commit. So I designed the end-to-end mobile UX for both platforms, properly and in full. I was paid well. I was extended. It was a Zoom call. Four tiles: Ben, his CTO, a VC partner dialling in from Menlo Park, and me. When I finished the recommendation, the VC partner leaned back from his camera, said nothing, and looked across at Ben's tile. Ben looked at mine and said it: not ambitious enough. The CTO nodded once. The call moved on in under thirty seconds.

Ben had already decided before the call started. Not on that Zoom, but in every conference talk he had attended, every TechCrunch profile of a Series A raise that mentioned a native app, every partner meeting where "mobile-first" meant iOS and nothing else. Confirmation bias does not feel like bias. It feels like experience. The data I put in front of him was not wrong. It simply did not match the model he had already built, so the model won. A Forbes analysis from March 2025 found that FOMO leads founders to adopt technology choices not because the evidence supports them but because the cost of being seen to miss the trend feels higher than the cost of the wrong build. The native app was not Ben's product decision. It was his insurance policy against looking like someone who did not know what a proper startup does. [forbes](https://www.forbes.com/sites/vibhasratanjee/2025/03/03/objectivity-over-hype-leading-through-the-noise-of-junk-trends-and-fomo/)

A boxer who has never taken a professional punch has no business obsessing over his ring walk. The entrance belongs to a fighter who has already won something. The native app decision at pre-validation stage is the ring walk. The fight is whether anyone wants what you have built. The instinct to build native before validating anything is not ambition. It is a signalling decision wearing a product decision's clothes. The people who benefited most were not in the room. They were in Cupertino and Mountain View, processing their 30%.

#### The Toll Booth

On 10 February 2026, the UK's Competition and Markets Authority ruled that Apple and Google hold "strategic market status" over their app stores and ordered both companies to change their practices. Two companies control the primary distribution channel for software on three billion devices. A British regulator finally said what every developer has known for fifteen years: the entry fee is not a service charge. It is a toll. [bbc](https://www.bbc.com/news/articles/c626rng1v63o)

Apple's App Store facilitated $406 billion in developer billings in the US alone in 2024, per Apple's own May 2025 newsroom release. The commission rate sits between 15 and 30%. The Oxford Journal of Competition Law and Economics found in 2021 that rate cannot be explained by competitive market dynamics. Stripe charges 1.5% in the UK. The gap is not a service differential. It is rent on infrastructure you did not build and cannot route around. [apple](https://www.apple.com/newsroom/2025/05/app-store-in-the-us-facilitated-406-billion-usd-in-developer-billings-and-sales-in-2024/) Ben paid it. His runway paid it. The engineers who spent eight months building the UX I had designed, for platforms that were never validated, paid it in time they will not get back.

#### The Other Side

Now hold the other position at full strength, because it deserves it. iOS users in Western markets carry higher lifetime value. The scroll physics on a well-built native app are perceptibly different from a web rendering layer. App Store organic discovery reaches 650 million weekly visitors, per Progressier's March 2026 platform comparison. For any consumer product where the purchase decision happens in three seconds of app store browsing, native is not vanity. It is conversion architecture. [progressier](https://progressier.com/pwa-vs-native-app-comparison-table)

In June 2025, upholding the Dutch Competition Authority's €50 million fine against Apple, the Rotterdam District Court ruled PWAs do not constitute an adequate substitute for App Store distribution, per Two Birds law firm's June 2025 analysis. Apple argues in every antitrust courtroom that PWAs are a viable alternative to native. It argues in every VC partner meeting the precise opposite. Both positions cannot be true. One of them is worth $406 billion in annual billings. [twobirds](https://www.twobirds.com/en/insights/2025/netherlands/a-swipe-at-apples-power-dutch-court-upholds-antitrust-order-against-apples-app-store-terms)

#### Ben's Runway

Ben's startup did not find product-market fit. The web product, which had paying customers the day I walked in, received minimal investment for eighteen months while two native codebases were built, maintained, and shut down. A native build across two platforms runs $50,000 to $250,000 before annual maintenance at 15 to 20% of build cost per year, per AB Digital's November 2024 cost analysis. Ben's engineers are talented. They are building something else now, for someone else's runway. [abdigital](https://abdigital.codes/2024/11/22/mobile-app-vs-progressive-web-app-a-cost-comparison/)

Ben is at another startup. I heard he started with a PWA this time. The mythology of the proper app does not require bad founders. It requires a sufficiently loud cultural signal, repeated until it stops sounding like an opinion and starts sounding like physics.

#### The Receipt

I took the fee. I did the work correctly. What I did not do was hold the room to account for what it was actually deciding. That cost Ben something real. It cost me a clean conscience I am still settling. Somewhere right now, in a product meeting that started forty minutes ago, a founder is asking which agency to hire for the iOS build. Nobody is asking who told them to want it. Ben asked me. I answered correctly, was told I lacked ambition, and committed to the wrong thing anyway.

Fast forward to spring 2026. I built my own personal website as a PWA. No App Store submission. No £99 developer fee paid to a platform that did not build my product. No second codebase. It loads in under a second, installs from the browser, and works offline. I designed it, I shipped it, and the only person who got to decide what a proper product looked like was me. I spent years in rooms telling founders the right thing and then designing the wrong thing because the room wanted it. Turns out the lesson was cheap to learn and expensive to ignore. The receipt is live on my personal website. No download required. [gaganmalik.io](https://www.gaganmalik.io)

---

### Someone Designed That Button
[Read more](https://www.gaganmalik.io/en/newsroom/someone-designed-that-button)

By Gagan Malik

By Gagan Malik

It was the summer of 2017. I had just walked out of a well-paid full-time job at the UK's largest insurer to try my luck as a free agent. No safety net, no guaranteed income, just the conviction that I was good enough to make it work. Six weeks in, I accepted a consulting brief from a payday loan provider. The money was significant. The timing was perfect. I said yes before I finished reading the brief.

Three weeks later I had built something I was genuinely proud of. A loan application flow that showed the APR plainly, removed the pre-ticked consent boxes, and treated the person on the other end of the form as an adult capable of understanding what they were signing. It tested well in user research. Participants said they felt informed, not rushed. Legal approved it. By every professional and ethical measure I could apply, it was better design. I took it to the group CTO expecting a conversation about rollout.

He looked at the screen, nodded slowly, and said: "It's good. But can we just reskin the current one?"

The current one had a deliberately obscured APR disclosure buried in grey text below the fold. It had pre-ticked consent boxes that required active effort to untick. It had a progress bar that moved faster in the early stages to create false momentum. Every pattern in it had a name in the design community's own literature: dark patterns, identified and catalogued by researcher Harry Brignull from 2010 onwards, each one a documented method for steering users toward decisions that served the business over the person making them. I had spent three weeks removing them. He wanted them back in different colours. [eleken](https://www.eleken.co/blog-posts/dark-patterns-examples)

I declined and exited the project.

The company, owned by a Russian billionaire whose portfolio of near-identical operations stretched across several markets, continued without me. A designer replaced me. The dark patterns shipped. The same obscured APR, the same pre-ticked consent boxes, dressed in different colours, went live later that year. I left money on the table that would have cleared outstanding debt and seeded a retirement fund I am still rebuilding. My exit produced zero change in outcomes for the people who signed those forms. I have spent eight years deciding whether that makes my decision honourable or merely convenient.

Don Norman argues, in *The Design of Everyday Things*, that design failure is almost never individual failure. It is systemic: absent governance, poorly specified briefs, and organisations that punish friction-raising and reward shipping. He is right that the design profession has no licensing board, no professional oath, no accountability mechanism equivalent to anything in medicine, engineering, or law. The reason this has persisted for over a century is structural, not moral: design harm is almost always attributed to the system that deploys the design, not the design itself. The drone manufacturer gets investigated. The human factors team does not. The payday lender gets regulated. The UX consultancy that built the journey does not. Until design harm has a visible attribution pathway, the absence of governance is a predictable structural outcome, not a conspiracy. [uxmatters](https://www.uxmatters.com/mt/archives/2017/11/the-ethics-of-user-experience-design.php)

That argument is correct. It is also precisely what the people who own those systems want designers to believe.

Frances Haugen handed the Wall Street Journal the internal Facebook research in October 2021 showing the company knew its algorithm amplified divisive, emotionally harmful content, measured the damage internally, and continued the optimisation anyway. The institutional argument collapses at that document. Because the moment a human being inside the institution raises their hand and is told to sit down, it stops being a systemic failure. It becomes a decision. Made in a room. By a named person. Who chose a growth metric over a named harm with full knowledge of the cost. My CTO was not a monster. He was a man under pressure, optimising for a number. But when I showed him the harm built into the existing journey and he said "reskin it," he made a choice. So did I. The difference between us is not intelligence or intent. It is which consequence each of us was willing to absorb personally. [vce.usc](https://vce.usc.edu/semester/fall-2025/ethics-of-ux-design-in-social-media/)

The immune system is useful here. When it functions correctly, it identifies and neutralises threats. In autoimmune disease, it destroys healthy tissue with complete operational efficiency. The mechanism works exactly as designed. The targeting data is wrong. The destruction is not a malfunction. It is a fully operational system firing at the wrong coordinates.

Neil deGrasse Tyson, in his *StarTalk* essay "A Scientist's View of War," published in March 2026, traces every weapon on the kill-ratio curve from fists to hydrogen bomb and shows that each step does not merely scale damage - it degrades the targeting data by removing the human being from the consequence. The drone controller, designed with the ergonomic precision Henry Dreyfuss applied to a telephone handset in his 1955 book *Designing for People*, delivers force to a coordinate on a screen. The social media feed, optimised for engagement with the precision of a Formula One pit crew, does not merely amplify existing beliefs - it generates the epistemic conditions under which unfalsifiable beliefs spread faster than falsifiable ones. A 2018 MIT study published in *Science* found that false news travels six times faster than accurate information on Twitter, and that humans, not bots, are primarily responsible for the spread. Outrage is more engaging than correction because it cannot be resolved by data, which is also the condition under which people become willing to die for abstract causes, as Tyson argues. The algorithm did not intend to build a radicalisation pipeline. It intended to maximise daily active users. The pipeline was a known side effect, internally documented, and shipped anyway. [youtube](https://www.youtube.com/watch?v=XI9NG068TwI)

On 26 September 1983, Lt. Col. Stanislav Petrov sat at a console in Serpukhov-15 that displayed an unambiguous alert: five incoming U.S. ICBMs. Protocol was clear. The interface was functioning correctly. What the interface could not communicate, by design, was that it was wrong. The Oko early-warning system was not showing Petrov a binary. It was showing him a probabilistic reading that its display had collapsed into a command: launch or don't launch. The underlying data was something closer to a high-confidence atmospheric artifact - sunlight refracting through high-altitude clouds at a specific solar angle, a known failure mode documented in the system's own error records. A system that surfaces its own uncertainty to the operator is a different dashboard from one that resolves that uncertainty into an order. One of them ends the world less frequently. Petrov overrode the command with his own uncertainty estimate and was right. The Soviet Union reprimanded him for improper paperwork. He died in 2017 in a small flat outside Moscow, undecorated. The system that nearly ended everything has been upgraded several times since. No civilian UX professional has reviewed it. [en.wikipedia](https://en.wikipedia.org/wiki/1983_Soviet_nuclear_false_alarm_incident)

I grew up in Delhi in the 1990s watching India and Pakistan aim nuclear weapons at each other over Kashmir. The sanctions that followed India's 1998 Pokhran tests raised the price of goods that had nothing to do with geopolitics for families that had contributed nothing to the decision. The logic of the dashboards did not follow the decision-makers home. It followed the cost of living for everyone else. R.K. Laxman's Common Man, who stood at the edge of power's decisions in the *Times of India* for sixty years in his checked jacket and bare feet, understood this without a policy brief. In a cartoon from the Iraq War build-up in late 2002, he stands before a skyline of U.S. missiles and is told: "Nothing to feel nervous. These are weapons of JUST destruction, not MASS destruction". He says nothing. He never does. He is the user the system was built around and never built for. [britannica](https://www.britannica.com/topic/You-Said-It-comic-strip-by-Laxman)

Sara Shayesteh was five years old. She attended Shajareh Tayyebeh primary school in Minab, Hormozgan province, Iran. She is number 30 on a list of 61 names verified by Middle East Eye from gymnastics federation records, a handwritten list, and the Tasnim news agency. On Saturday 7 March 2026, she was among at least 165 people killed in what Middle East Eye reported as a strike on the school. A second missile hit the prayer hall where the school principal had moved surviving children to shelter, after telephoning their parents to come and collect them. [middleeasteye](https://www.middleeasteye.net/news/un-investigates-strike-iranian-girls-school)

The parents who came toward the building were among the dead.

Somewhere, a targeting system held that school's coordinates. Someone specified the confirmation interface, the strike authorisation flow, the visual grammar of a proceed button. Someone, somewhere in that procurement chain, wrote a brief. It named the objective, the user, the desired outcome. It described the system with precision.

It did not name her. That omission is not an accident of process. It is the design.

---

### Release v1.16.16 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-16-16)

Knowledge base with Readwise sync, seed embeddings upsert, Ask mobile sheet UX, voice mode fixes, archive filters, PWA toast fixes.

_Summary only — see URL for full article._

---

### Diplomatic Immunity
[Read more](https://www.gaganmalik.io/en/newsroom/diplomatic-immunity)

By Gagan Malik

_Summary only — see URL for full article._

---

### Everyone Wanted an App Store for AI Agents. Meta Just Built the Mall.
[Read more](https://www.gaganmalik.io/en/newsroom/everyone-wanted-app-store-for-ai-agents-meta-mall)

By Gagan Malik

_Summary only — see URL for full article._

---

### Release v1.14.14 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-14-14)

Listen mode highlight and scroll during TTS playback on newsroom articles; word-level highlighting, scroll-follow, and reduced-motion support.

_Summary only — see URL for full article._

---

### Why We Designed Contempt Into Our Interfaces
[Read more](https://www.gaganmalik.io/en/newsroom/why-we-designed-contempt-into-our-interfaces)

By Gagan Malik

_Summary only — see URL for full article._

---

### Why Do Algorithms Ignore The Many And Worship The Few?
[Read more](https://www.gaganmalik.io/en/newsroom/why-do-algorithms-ignore-the-many-and-worship-the-few)

By Gagan Malik

_Summary only — see URL for full article._

---

### Release v1.13.13 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-13-13)

Voice chat UX redesign (Ask), connecting state, push-to-talk, first-time voice picker, AI speaking strip, optional fullscreen voice view; Ask UI improvements.

_Summary only — see URL for full article._

---

### The Unemployment Rate Is Fine. That Is the Trap.
[Read more](https://www.gaganmalik.io/en/newsroom/the-unemployment-rate-is-fine-that-is-the-trap)

By Gagan Malik

_Summary only — see URL for full article._

---

### Why I Built a Personal LLM Trained on My Own Content
[Read more](https://www.gaganmalik.io/en/newsroom/why-i-built-a-personal-llm)

By Gagan Malik

_Summary only — see URL for full article._

---

### In Defence of Thinking
[Read more](https://www.gaganmalik.io/en/newsroom/in-defence-of-thinking)

By Gagan Malik

_Summary only — see URL for full article._

---

### Release v1.12.1 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-12-1)

Article Listen bar (TTS), Share article popover, byline row on all newsroom posts, playback and byline fixes.

_Summary only — see URL for full article._

---

### Your Calendar Is Being Mugged, and You Are Holding the Door Open
[Read more](https://www.gaganmalik.io/en/newsroom/the-lost-art-of-refusal)

By Gagan Malik

_Summary only — see URL for full article._

---

### Release 1.12.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-12-0)

Stripe Customer Portal, llms.txt, About refresh (education, Techstars), SEO Person schema, PWA crawler fix, clean story slugs and 301s.

_Summary only — see URL for full article._

---

### The $725 Million Bug Hunt
[Read more](https://www.gaganmalik.io/en/newsroom/the-725-million-bug-hunt)

By Gagan Malik

_Summary only — see URL for full article._

---

### Release 1.10.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-10-0)

RSS feed, What's New banner, PWA badge, ghost-style newsroom buttons, footer RSS link.

_Summary only — see URL for full article._

---

### Release 1.11.11 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-11-11)

YouTube videos in newsroom, YouTube Data API integration, video transcripts in RAG, archive filter, external link handling.

_Summary only — see URL for full article._

---

### Against One-Click Coding: Reclaiming Craft for Personal Projects
[Read more](https://www.gaganmalik.io/en/newsroom/against-one-click-coding)

By Gagan Malik

_Summary only — see URL for full article._

---

### Release 1.9.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-9-0)

i18n locales (hi, ar, es), region selector, FAQ accordion, region-specific pricing, RTL for Arabic.

_Summary only — see URL for full article._

---

### Release 1.8.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-8-0)

Skeleton screens for all pages, archive filters fix, sticky header on newsroom pages.

_Summary only — see URL for full article._

---

### Release 1.7.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-7-0)

Mobile responsive audit, touch targets (44pt), Ask history as Sheet on mobile, floating toggle.

_Summary only — see URL for full article._

---

### Release 1.4.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-4-0-rc-0)

Ask page: case study citations with thumbnails, Show more/less chips toggle, ASSISTANT_QUESTIONS.md catalogue, helper text and Button size variants.

_Summary only — see URL for full article._

---

### Release 1.4.0-rc.1 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-4-0-rc-1)

Deslop, refactors (getRelatedItemsForPost, WritingsBentoCard composition), Ask test TooltipProvider fix, related items (3 max, sorted desc, hidden when empty), removed Kyle Hanagami story.

_Summary only — see URL for full article._

---

### Release 1.4.1 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-4-1)

Against One-Click Coding article, citation pills with favicons (newsroom + Ask page), publication dates on Writings, new cover image.

_Summary only — see URL for full article._

---

### Release 1.5.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-5-0)

Favicon, Open Graph images, RAG postbuild automation, vibe coding fix, cursor rule.

_Summary only — see URL for full article._

---

### Release 1.3.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-3-0)

Cookie consent (GDPR), release plan docs, Ask integration tests.

_Summary only — see URL for full article._

---

### Release 1.1.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-1-0)

Basic homepage, seven full case studies, Stories hero with Ask Gagan CTA.

_Summary only — see URL for full article._

---

### Gen Z Didn't Invent Knowledgemaxxing. They Just Stopped Lying About It.
[Read more](https://www.gaganmalik.io/en/newsroom/gen-z-knowledgemaxxing)

By Gagan Malik

_Summary only — see URL for full article._

---

### Release 1.0.0 is now live
[Read more](https://www.gaganmalik.io/en/newsroom/release-1-0-0)

Initial release: Home, About, Stories, Newsroom, Pricing, Ask, Analytics, SEO.

_Summary only — see URL for full article._

---

### The Curious Case of the Commute: Why Your Interview is Back in 3D
[Read more](https://www.gaganmalik.io/en/newsroom/the-curious-case-of-the-commute)

By Gagan Malik

_Summary only — see URL for full article._

---

### We got accepted into Techstars
[Read more](https://www.gaganmalik.io/en/newsroom/techstars-riyadh-2023-class)

_Summary only — see URL for full article._

---

### When travel guides meet food-lover loyalty
[Read story](https://www.gaganmalik.io/en/newsroom/telegraph-travel-waitrose-loyalty)

The Telegraph’s Travel Guides app and Waitrose’s My Waitrose club do not look alike. One lives in your pocket for a long weekend; the other lives in your weekly shop. The design question behind both is the same: how do you turn a brand people already respect into a relationship that repeats, without cheapening the story you are known for?

---
