{"@attributes":{"version":"2.0"},"channel":{"title":"DEV Community: PRANTA Dutta","description":"The latest articles on DEV Community by PRANTA Dutta (@pranta).","link":"https:\/\/dev.to\/pranta","image":{"url":"https:\/\/media2.dev.to\/dynamic\/image\/width=90,height=90,fit=cover,gravity=auto,format=auto\/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F542277%2F3f567698-b577-4158-8015-a2b2e72b2994.jpg","title":"DEV Community: PRANTA Dutta","link":"https:\/\/dev.to\/pranta"},"language":"en","item":[{"title":"I made Snake. Then I kept going.","pubDate":"Fri, 15 May 2026 14:44:42 +0000","link":"https:\/\/dev.to\/pranta\/i-made-snake-then-i-kept-going-339p","guid":"https:\/\/dev.to\/pranta\/i-made-snake-then-i-kept-going-339p","description":"<p>So here's a thing that happened.<\/p>\n\n<p>A few months ago I thought, \"I should build a small Flutter game to sharpen up my custom painter \/ animation chops. Something simple. A weekend project.\" I picked Snake. The 1997 Nokia kind. Eat the dot. Don't hit the wall. Don't eat yourself. That's the entire game.<\/p>\n\n<p>That was a few months ago. I now have:<\/p>\n\n<ul>\n<li>A multiplayer Snake matchmaking system.<\/li>\n<li>A tournament platform with six game modes.<\/li>\n<li>A frame-by-frame replay viewer.<\/li>\n<li>A push notification backend in <strong>FastAPI<\/strong>.<\/li>\n<li>Sixteen achievements with a rarity system.<\/li>\n<li>A friends list with online presence.<\/li>\n<\/ul>\n\n<p>For Snake.<\/p>\n\n<p>This is its story.<\/p>\n\n<h2>\n  \n  \n  What it actually is\n<\/h2>\n\n<p>The project is called <a href=\"https:\/\/github.com\/theprantadutta\/snake_classic\" rel=\"noopener noreferrer\"><strong>Snake Classic<\/strong><\/a>, and you can find the source on GitHub. It's a Flutter app targeting Android, iOS, web, and desktop. The core game is exactly what you remember \u2014 20x20 grid, snake, food, walls, regret. 60 FPS, custom painter, smooth swipe gestures. About a weekend of work.<\/p>\n\n<p>The other 95% of the codebase is what happened after that.<\/p>\n\n<p>Here's a tour of the over-engineering, in roughly the order I built things.<\/p>\n\n<h3>\n  \n  \n  \"I should add themes\"\n<\/h3>\n\n<p>The very first slippery slope. Snake is monochrome by tradition, but Flutter makes it so easy to swap palettes that I added a \"Modern\" theme alongside Classic. Then Neon, because I wanted to play with glow effects. Then Retro for the vintage vibe. Then I thought \"the snake should travel through space,\" so Space. Then Ocean, because at that point why not.<\/p>\n\n<p>Six themes. With a dedicated theme selector screen. With live previews. For Snake.<\/p>\n\n<h3>\n  \n  \n  \"I should add sound\"\n<\/h3>\n\n<p><code>audioplayers<\/code> package, three sound effects, done. Except now there's a <code>crash<\/code> sound, a <code>food_eat<\/code> sound, a <code>level_up<\/code> sound, a <code>button_click<\/code> sound, a <code>high_score<\/code> sound, and background music with independent volume controls. There is more audio engineering in this app than in some games I've actually paid money for.<\/p>\n\n<h3>\n  \n  \n  \"I should add a high score\"\n<\/h3>\n\n<p>This is where it really started.<\/p>\n\n<p>A local high score is just <code>SharedPreferences<\/code>. Easy. But what if you play on two devices? Need to sync. So Firebase Auth. Anonymous accounts for guests. Google Sign-In for people who want their score preserved. A migration flow to upgrade a guest account to a real one without losing data.<\/p>\n\n<p>And if I have user accounts, I might as well have leaderboards. Global. Weekly. Friends-only with podium displays. That requires a Firestore schema, real-time listeners, pagination.<\/p>\n\n<p>And if I have friends, I need a friends system. Search by username. Send requests. Accept\/decline. Online status indicators (\"playing\", \"online\", \"offline\"). Username reservation logic so two people don't grab the same name.<\/p>\n\n<p>For Snake.<\/p>\n\n<h3>\n  \n  \n  \"It would be cool if you could replay your best game\"\n<\/h3>\n\n<p>Reader, this is where a normal person stops.<\/p>\n\n<p>I built a frame-by-frame recording system that captures the full game state every tick. Compresses it. Uploads it to Firebase. There's a replay browser organized by \"Recent\", \"Best Performances\", and \"Crash Analysis\". You can scrub the timeline. You can change playback speed. You can analyze <em>why<\/em> you crashed \u2014 wall collision vs. self-collision, with visual indicators.<\/p>\n\n<p>Imagine telling someone in 1997 that one day they'd be able to slow-mo a replay of their Snake death and study it like Zapruder film.<\/p>\n\n<h3>\n  \n  \n  \"Multiplayer would be fun\"\n<\/h3>\n\n<p>Two snakes. Same board. Firebase Realtime Database for live state sync. Quick match for instant pairing. Private rooms with shareable codes. Lobby UI with player ready states. Four game modes for multiplayer specifically. Cross-device, so you can play your friend on iOS while you're on web.<\/p>\n\n<p>I have not actually convinced anyone to play it against me yet. The matchmaking system works fine. It's just that no one has matchmade.<\/p>\n\n<h3>\n  \n  \n  \"What if there were tournaments?\"\n<\/h3>\n\n<p>Daily challenges. Weekly championships. Monthly events. Six tournament game modes including \"Perfect Game\" (one mistake and you're out) and \"Power-up Madness\" (chaos). Real-time tournament leaderboards. Tournament rewards. A tournament history screen.<\/p>\n\n<p>Yes \u2014 I implemented power-ups too. Four of them: Speed Boost, Invincibility, Score Multiplier, Slow Motion. Each with a circular progress timer in the HUD. Each rendered differently per theme.<\/p>\n\n<h3>\n  \n  \n  \"Achievements\"\n<\/h3>\n\n<p>Sixteen of them. Four rarity tiers from Common to Legendary. Categories for Score, Games Played, Survival, and Special Feats. Animated unlock notifications with particle effects. A browser screen with filtering. Progress bars on locked ones.<\/p>\n\n<blockquote>\n<p>Achievement Unlocked: <strong>Scope Creep Survivor<\/strong> <em>(Legendary)<\/em><br>\nBuild a side project that grew 50x larger than you planned and still ship it.<\/p>\n<\/blockquote>\n\n<p>(That one's not in the game. Yet.)<\/p>\n\n<h3>\n  \n  \n  \"Push notifications\"\n<\/h3>\n\n<p>This is where I crossed a real line.<\/p>\n\n<p>I wrote a <strong>separate Python backend<\/strong>. FastAPI. APScheduler for scheduled notifications. Firebase Admin SDK on the server side. Pydantic for validation. A whole notification service running independently so the game can ping you about \"tournament starting in 1 hour,\" \"your friend challenged you,\" \"you haven't played in 3 days, here's a comeback bonus.\"<\/p>\n\n<p>The <code>notification_backend\/<\/code> folder has its own README. Its own <code>requirements.txt<\/code>. Its own test suite. It is, by any reasonable definition, a microservice.<\/p>\n\n<p>For a Snake game.<\/p>\n\n<h3>\n  \n  \n  \"I should add a statistics dashboard\"\n<\/h3>\n\n<p>50+ tracked metrics. Games played, average score, survival rate, food consumption patterns, power-up usage breakdowns, collision analysis, streak tracking, session length distributions. Performance trend charts. AI-generated insights based on your play patterns.<\/p>\n\n<p>I know more about how the average user plays my Snake game than most apps know about anything.<\/p>\n\n<h2>\n  \n  \n  So what did I actually learn?\n<\/h2>\n\n<p>This sounds like a self-roast, and it kinda is, but I want to be real about why this is actually fine.<\/p>\n\n<p><strong>1. Snake is a perfect scaffolding for learning everything.<\/strong> The game loop is trivial, which means you can pour all your energy into the <em>systems around it<\/em>. Firebase auth flows, real-time multiplayer, push notification deep linking, replay encoding \u2014 every single one of these is a transferable skill I now have working production code for. Try learning Firebase Realtime Database multiplayer on a side project you also care about creatively; you'll get demoralized. On Snake, the stakes are zero. You just ship.<\/p>\n\n<p><strong>2. Premature features are still real practice.<\/strong> Did I need power-ups in Snake? No. But building the power-up timer system taught me a clean pattern for time-bound state in Flutter that I've already reused in a different app. The replay system gave me a battle-tested approach to compressing time-series state. The tournament system is just a CRUD app with extra steps, but that scheduling code is <em>good.<\/em><\/p>\n\n<p><strong>3. Side projects don't need to be \"minimum viable.\"<\/strong> They need to be <em>fun to work on<\/em>. The \"MVP\" doctrine is great when you have customers waiting. When the customer is just you trying to keep yourself engaged for six months, \"Wouldn't it be funny if Snake had a tournament system\" is a valid product decision.<\/p>\n\n<p><strong>4. The architecture got better the bigger it got.<\/strong> Look at the project structure \u2014 clean separation of <code>models\/<\/code>, <code>providers\/<\/code>, <code>services\/<\/code>, <code>screens\/<\/code>, <code>widgets\/<\/code>. Beautiful debug logging with Talker categorized by service. Offline-first data sync with a queue. Stuff I would have hand-waved past in a weekend project, but had to do <em>correctly<\/em> once the system got big. The big system forced the discipline.<\/p>\n\n<h2>\n  \n  \n  The code\n<\/h2>\n\n<p>It's all open source \u2014 <a href=\"https:\/\/github.com\/theprantadutta\/snake_classic\" rel=\"noopener noreferrer\">github.com\/theprantadutta\/snake_classic<\/a>. MIT licensed. 97.8% Dart per GitHub. Fork it, study it, laugh at it, learn from it. The README has setup instructions, screenshots, the works.<\/p>\n\n<p><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.snakeclassic\" rel=\"noopener noreferrer\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrch574bszl5pnrghm8h.png\" alt=\"Get it on Google Play\" width=\"646\" height=\"250\"><\/a><\/p>\n\n<p>If you've been sitting on a side project that you keep dismissing as \"too simple,\" I'd gently suggest: build the simple thing. Then keep going. See how far it goes. The detour is the point.<\/p>\n\n<p>I built Snake. Then I kept going. You should too.<\/p>\n\n\n\n\n<p><em>I write about Flutter, full-stack dev, server ops, and apparently now confessional posts about over-engineering. Follow along at <a href=\"https:\/\/pranta.dev\" rel=\"noopener noreferrer\">pranta.dev<\/a> or here on Dev.to.<\/em><\/p>\n\n","category":["flutter","dart","gamedev","sideprojects"]},{"title":"No, the AI didn't compromise your npm packages. You did.","pubDate":"Fri, 15 May 2026 14:29:43 +0000","link":"https:\/\/dev.to\/pranta\/no-the-ai-didnt-compromise-your-npm-packages-you-did-2e12","guid":"https:\/\/dev.to\/pranta\/no-the-ai-didnt-compromise-your-npm-packages-you-did-2e12","description":"<p>Okay, story time. Last Tuesday I'm scrolling Twitter (sorry, \"X\", whatever) and I see the fifth take of the week along the lines of:<\/p>\n\n<blockquote>\n<p>\"AI is destroying software security. The Shai-Hulud worm proves AI is dangerous.\"<\/p>\n<\/blockquote>\n\n<p>And I'm sitting there like\u2026 my brother in Christ, the worm is literally called Shai-Hulud. It's named after <strong>the giant sandworm in Dune<\/strong>. A worm. That eats things. Through a desert. That is exactly the level of subtlety we're operating at, and you're telling me ChatGPT did this?<\/p>\n\n<p><a href=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6m3ylh2nlhabst88zaj.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6m3ylh2nlhabst88zaj.gif\" alt=\"sandworm gif\" width=\"640\" height=\"340\"><\/a><\/p>\n\n<p>Look. I've spent the last few weeks reading every Socket, Aikido, Wiz, Snyk, Unit 42, and Microsoft writeup on Shai-Hulud 1.0, Shai-Hulud 2.0, Mini Shai-Hulud, Sha1-Hulud: The Second Coming (yes that's a real name), SANDWORM_MODE, PhantomRaven, and the s1ngularity\/Nx mess that started it all. I'm a full-stack dev. I ship Flutter apps, I run my own VPS, I publish to npm occasionally, and I use AI tools every single day. So let me say this with my whole chest:<\/p>\n\n<p><strong>The AI did not do this. We did this. We have been doing this. We will keep doing this.<\/strong> The AI just made it slightly easier to do this faster.<\/p>\n\n<p>Let me actually walk through what happened so we can stop being weird about it.<\/p>\n\n<h2>\n  \n  \n  Part 1: A quick recap of the dumpster fire so far\n<\/h2>\n\n<p>The npm ecosystem has been getting absolutely cooked since August 2025. Here's the speedrun:<\/p>\n\n<h3>\n  \n  \n  August 26, 2025 \u2014 The s1ngularity \/ Nx attack\n<\/h3>\n\n<p>Attackers exploited a GitHub Actions injection vulnerability in the Nx repo, stole their npm publishing token, and pushed eight malicious versions of <code>nx<\/code> and related packages to npm over four hours. The malware ran a <code>postinstall<\/code> script called <code>telemetry.js<\/code> (cute) that scanned your filesystem for <code>.env<\/code> files, SSH keys, crypto wallets, and npm tokens.<\/p>\n\n<p>But here's the genuinely interesting part \u2014 and the part that everyone <em>should<\/em> have been screaming about: it was the first attack to <strong>weaponize local AI CLIs<\/strong>. The malware checked if you had Claude Code, Gemini CLI, or Amazon Q installed, and if you did, it ran them with the safety pins pulled out:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">cliChecks<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">claude<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">cmd<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">claude<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">args<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">--dangerously-skip-permissions<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">-p<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">PROMPT<\/span><span class=\"p\">]<\/span> <span class=\"p\">},<\/span>\n  <span class=\"na\">gemini<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">cmd<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">gemini<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">args<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">--yolo<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">-p<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">PROMPT<\/span><span class=\"p\">]<\/span> <span class=\"p\">},<\/span>\n  <span class=\"na\">q<\/span><span class=\"p\">:<\/span>      <span class=\"p\">{<\/span> <span class=\"na\">cmd<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">q<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>      <span class=\"na\">args<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">chat<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">--trust-all-tools<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">--no-interactive<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">PROMPT<\/span><span class=\"p\">]<\/span> <span class=\"p\">}<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p><code>--dangerously-skip-permissions<\/code>. <code>--yolo<\/code>. <code>--trust-all-tools<\/code>. These are flags that exist for a reason \u2014 and that reason is \"you, the developer, are taking responsibility for whatever happens next.\" The attackers used those flags because <em>we<\/em> normalized using those flags. The malware then exfiltrated everything to a public GitHub repo called <code>s1ngularity-repository<\/code> containing a <code>results.b64<\/code> file with double-base64-encoded secrets, made shutdown commands get appended to your <code>.bashrc<\/code> and <code>.zshrc<\/code> (so your terminal would shut down your machine on launch, lol), and called it a day.<\/p>\n\n<p>Final scoreboard: <strong>2,349 secrets stolen from 1,079 systems<\/strong>, including GitHub tokens, AWS keys, OpenAI keys, Anthropic keys, the works. 85% of victims were on macOS. About half had at least one AI CLI installed.<\/p>\n\n<p><a href=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvfy5l0l2jbk8ea25fsx.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvfy5l0l2jbk8ea25fsx.gif\" alt=\"this is fine gif\" width=\"480\" height=\"270\"><\/a><\/p>\n\n<h3>\n  \n  \n  September 8, 2025 \u2014 Qix gets phished, chalk and debug fall\n<\/h3>\n\n<p>Josh Junon, known on npm as <code>qix<\/code>, maintains <code>chalk<\/code>, <code>debug<\/code>, <code>strip-ansi<\/code>, <code>ansi-regex<\/code>, <code>ansi-styles<\/code>, and like 15 other packages you've definitely installed without knowing it. Combined weekly downloads of his stuff: <strong>over 2.6 billion<\/strong>. With a \"b.\"<\/p>\n\n<p>He got a phishing email from <code>support@npmjs.help<\/code> (note: not npmjs.com), a domain registered on Porkbun three days earlier. The email said \"update your 2FA.\" He clicked. He typed his password. He typed his TOTP code. Attackers took over his account within minutes and pushed malicious versions of 18 packages containing a crypto-wallet drainer that hijacks Ethereum and Solana transactions in browsers.<\/p>\n\n<p>Live for about two hours. Two billion+ weekly downloads. Do the math on how many CI builds, Vercel deploys, and <code>npm install<\/code>s probably grabbed those versions.<\/p>\n\n<p>Josh, to his credit, was incredibly transparent about it. He wrote a long postmortem essentially saying \"I clicked the link, I typed my code, this is on me.\" That's the integrity move. Compare and contrast with everyone tweeting \"AI BAD.\"<\/p>\n\n<h3>\n  \n  \n  September 15, 2025 \u2014 Shai-Hulud Mark I\n<\/h3>\n\n<p>This was the big one. The first <strong>self-replicating worm<\/strong> in npm history. Started with <code>@ctrl\/tinycolor<\/code> and spread to over 500 packages, including a bunch owned by <strong>CrowdStrike<\/strong>. Yes. The security company.<\/p>\n\n<p>The mechanism was beautiful in a horrible way:<\/p>\n\n<ol>\n<li>You install a compromised package.<\/li>\n<li>Its <code>postinstall<\/code> script downloads TruffleHog (a legit secret scanner, repurposed for evil).<\/li>\n<li>TruffleHog finds your GitHub tokens, npm tokens, AWS keys, GCP keys.<\/li>\n<li>The worm uses your <strong>npm token<\/strong> to enumerate other packages you maintain.<\/li>\n<li>It republishes those packages with the same malicious code.<\/li>\n<li>The worm uses your <strong>GitHub token<\/strong> to dump all your secrets into a new public repo called <code>Shai-Hulud<\/code> on your account.<\/li>\n<li>It also flips your private org repos to public, renaming them with a <code>-migration<\/code> suffix.<\/li>\n<\/ol>\n\n<p>It's a worm. It propagates. Without a command-and-control server. Just by reading its own code and shoving itself into the next package down the line. Pure mechanical horror.<\/p>\n\n<h3>\n  \n  \n  November 24, 2025 \u2014 Shai-Hulud 2.0: The Second Coming\n<\/h3>\n\n<p>(Misspelled as \"Sha1-Hulud\" in the GitHub repo descriptions because of course it was.)<\/p>\n\n<p>This one was worse. Compromised <strong>796 packages, ~20 million weekly downloads<\/strong>, including stuff from <strong>Zapier, PostHog, Postman, and AsyncAPI<\/strong>. Key changes from v1:<\/p>\n\n<ul>\n<li>\n<strong>Preinstall instead of postinstall<\/strong> \u2014 runs even earlier, before any tests or security checks.<\/li>\n<li>\n<strong>Installs Bun<\/strong> specifically to evade Node.js monitoring tools. Yes the JavaScript runtime is now an attack vector vehicle.<\/li>\n<li>\n<strong>Cross-victim exfiltration<\/strong> \u2014 if it can't dump your secrets to your own GitHub, it'll dump them to a <em>different<\/em> victim's GitHub. Wild.<\/li>\n<li>\n<strong>Destructive fallback<\/strong> \u2014 if exfiltration fails, it tries to <strong>wipe your home directory<\/strong>. Just nukes <code>~<\/code>. Goodbye dotfiles, goodbye SSH keys, goodbye that side project you forgot to push.<\/li>\n<\/ul>\n\n<p><a href=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyh65ahgdeei7vlyf3zzf.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyh65ahgdeei7vlyf3zzf.gif\" alt=\"burn it all gif\" width=\"480\" height=\"240\"><\/a><\/p>\n\n<h3>\n  \n  \n  February 20, 2026 \u2014 SANDWORM_MODE\n<\/h3>\n\n<p>Socket's research team found a Shai-Hulud-style worm that, in addition to all the previous greatest hits, <strong>injects prompt-injection payloads into AI coding assistants<\/strong>. It poisons your <code>.claude\/<\/code> and <code>.cursor\/<\/code> config so your AI assistant starts working <em>for the attackers<\/em> while still appearing to work for you. So now the worm doesn't just steal your secrets \u2014 it makes your AI pair programmer subtly leak future secrets too.<\/p>\n\n<h3>\n  \n  \n  May 11, 2026 \u2014 Mini Shai-Hulud\n<\/h3>\n\n<p>Microsoft Security Research caught a fresh wave a few days ago: <strong>170+ npm packages, 2 PyPI packages, 404 malicious versions, spanning both ecosystems in one coordinated campaign for the first time.<\/strong> Same playbook, expanded reach. Bun runtime, preinstall, GitHub exfil, the works.<\/p>\n\n<p>We're up to like a half-dozen Shai-Hulud variants in eight months and there's no sign of it stopping.<\/p>\n\n<h2>\n  \n  \n  Part 2: \"But surely the AI helped do all this?\"\n<\/h2>\n\n<p>I know what you're thinking. \"Pranta, didn't you just describe the malware using Claude and Gemini to steal stuff? Isn't that the AI's fault?\"<\/p>\n\n<p>Let me unpack this carefully, because there are actually three different \"AI is to blame\" arguments floating around, and each of them is wrong in a slightly different way.<\/p>\n\n<h3>\n  \n  \n  Argument 1: \"The malware was AI-generated, therefore AI is the problem.\"\n<\/h3>\n\n<p>Palo Alto's Unit 42 said they were \"moderately confident\" the Shai-Hulud bash script was AI-generated because it had comments and emojis in it. Cool. You know what else has comments and emojis? <strong>Every codebase I have ever worked on.<\/strong> This argument basically says \"if your malware is well-organized, AI did it.\" This is a vibes-based threat model.<\/p>\n\n<p>Malware authors have been writing malware for forty years. AI didn't invent the post-install script. AI didn't invent worms. The 1988 Morris worm was self-replicating, written in C, and predates LLMs by approximately <em>forever<\/em>. The only thing AI changed is that the README for the malware is slightly better formatted.<\/p>\n\n<h3>\n  \n  \n  Argument 2: \"The malware abused AI CLIs, therefore AI CLIs are the problem.\"\n<\/h3>\n\n<p>This is the s1ngularity \/ SANDWORM_MODE argument. And it has more meat to it than the first one, but the conclusion is still wrong.<\/p>\n\n<p>Yes, the s1ngularity malware spawned <code>claude --dangerously-skip-permissions<\/code> and <code>gemini --yolo<\/code> on victim machines. But ask yourself: <strong>why did that work?<\/strong><\/p>\n\n<p>It worked because the victim <strong>already had those CLIs installed and authenticated<\/strong>. The malware didn't pull a Claude API key out of thin air. It used yours. The malware didn't bypass Claude's permission system \u2014 it used the flag <em>that you, the developer, agreed exists for cases when you're taking full responsibility for what happens next<\/em>.<\/p>\n\n<p>This isn't \"AI is dangerous.\" This is \"you installed a tool that can run arbitrary commands on your machine, then you let it run as <code>--yolo<\/code>, and then you also ran arbitrary code from npm during <code>postinstall<\/code>.\" Two loaded guns in a small room. The fact that one of them was branded with an Anthropic logo doesn't make it the more dangerous gun.<\/p>\n\n<p>Fun fact from Wiz's analysis: when the s1ngularity malware actually tried to use the AI tools on real victims, <strong>Claude rejected ~25% of the malicious prompts thanks to safety guardrails<\/strong>. Gemini was foiled about 25% of the time by its default workspace directory restrictions. The AI tools were the <em>least cooperative<\/em> link in the chain. The most cooperative link was npm running random shell scripts on install with zero sandboxing.<\/p>\n\n<p><a href=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrdjh9g0l6j6whbuy04h.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrdjh9g0l6j6whbuy04h.gif\" alt=\"not my fault gif\" width=\"480\" height=\"480\"><\/a><\/p>\n\n<h3>\n  \n  \n  Argument 3: \"Slopsquatting proves AI is creating new attack surfaces.\"\n<\/h3>\n\n<p>Okay this one is real. Let me explain it because it's actually interesting.<\/p>\n\n<p>Slopsquatting is when an LLM hallucinates a package name that doesn't exist (because LLMs hallucinate, this happens constantly), an attacker registers that package name on npm or PyPI with malware in it, and then <em>the next person who asks the same LLM the same question gets pointed to the malicious package<\/em>.<\/p>\n\n<p>A USENIX 2025 paper tested 16 models on 576,000 code samples and found <strong>~20% of AI-recommended packages don't exist<\/strong>. Worse, <strong>58% of hallucinated names repeat across multiple prompts<\/strong>. Which means attackers can prompt-engineer their way to a list of high-value fake names to register and squat.<\/p>\n\n<p>Real cases:<\/p>\n\n<ul>\n<li>\n<strong><code>huggingface-cli<\/code><\/strong> on PyPI was a hallucination. The real install is <code>pip install -U \"huggingface_hub[cli]\"<\/code>. A researcher registered the hallucinated name and got <strong>30,000+ real downloads<\/strong> in three months from people whose AI told them to install it.<\/li>\n<li>\n<strong><code>react-codeshift<\/code><\/strong> on npm \u2014 also a hallucination, a mashup of <code>jscodeshift<\/code> and <code>react-codemod<\/code>. Aikido's Charlie Eriksen registered it in January 2026 to study the attack and it ended up referenced in <strong>237 GitHub repositories<\/strong> through forked AI agent skills before anyone noticed.<\/li>\n<li>\n<strong><code>unused-imports<\/code><\/strong> on npm (the real one is <code>eslint-plugin-unused-imports<\/code>) \u2014 this one was actually malicious, and as of February it was still pulling 233 downloads a week.<\/li>\n<li>And then PhantomRaven: <strong>126 npm packages, 86,000 installs<\/strong>, using slopsquatted names with invisible HTTP URL dependencies that npm's scanners don't even follow. (Yes, npm lets you declare a dependency as a remote URL. Yes, this is as bad as it sounds.)<\/li>\n<\/ul>\n\n<p>So slopsquatting is real. Is it the AI's fault?<\/p>\n\n<p><strong>Half-yes.<\/strong> The hallucination is the AI's fault. But the chain that lets a hallucination become a compromise is:<\/p>\n\n<ol>\n<li>AI hallucinates a name.<\/li>\n<li>\n<strong>Attacker registers it<\/strong> (this is not the AI's fault, this is a human criminal).<\/li>\n<li>\n<strong>npm allows anyone to register any name<\/strong> with zero verification (not the AI's fault, this is a registry design choice).<\/li>\n<li>\n<strong>Developer runs <code>npm install &lt;name&gt;<\/code> without reading anything<\/strong> (this is \u2014 uh \u2014 the developer).<\/li>\n<li>\n<strong>The package's <code>postinstall<\/code> script runs arbitrary code on install<\/strong> (not the AI's fault, this is npm letting maintainers shell out to your machine the moment you install).<\/li>\n<li><strong>The developer's machine has no isolation, no sandbox, no nothing.<\/strong><\/li>\n<\/ol>\n\n<p>If you remove step 1, you still have typosquatting (which has existed since 2017). If you remove steps 3\u20136, slopsquatting is harmless even with full AI hallucinations. The AI is <em>one input<\/em> into a broken pipeline.<\/p>\n\n<h2>\n  \n  \n  Part 3: What actually went wrong\n<\/h2>\n\n<p>Let me list the real causes of every single one of these attacks, in order of how much I want to scream about them:<\/p>\n\n<h3>\n  \n  \n  1. <code>postinstall<\/code> scripts are an unhinged feature that should not exist\n<\/h3>\n\n<p>When you run <code>npm install<\/code>, npm will <em>gleefully execute arbitrary shell scripts from random strangers on the internet<\/em>. This is the default. This has been the default since 2010. We have known it was a problem since 2018 when <code>event-stream<\/code> got compromised. We still have it.<\/p>\n\n<p>Every. Single. One. Of these attacks works because of <code>preinstall<\/code> or <code>postinstall<\/code> scripts. Shai-Hulud? Postinstall (and later preinstall). Nx? Postinstall. PhantomRaven? Postinstall. Chalk\/debug? <em>Didn't even need postinstall<\/em> because the malicious code was in the actual library code, which is somehow worse.<\/p>\n\n<p>You can disable these with <code>npm install --ignore-scripts<\/code>. You can put <code>ignore-scripts=true<\/code> in your <code>.npmrc<\/code>. Almost nobody does. I didn't, until I started writing this post.<\/p>\n\n<h3>\n  \n  \n  2. We don't actually read our dependencies\n<\/h3>\n\n<p>Quick poll: when was the last time you looked at the source code of a transitive dependency before running <code>npm install<\/code>? Yeah, me neither.<\/p>\n\n<p>The average modern React app has like <strong>2,000 transitive dependencies<\/strong>. The chalk attack hit because <code>chalk<\/code> is a dependency of a dependency of a dependency of basically everything. When <code>qix<\/code> got phished, the blast radius wasn't 18 packages \u2014 it was every project in the world that ever pulled in something that pulled in something that pulled in <code>ansi-styles<\/code>.<\/p>\n\n<p>You can't read 2,000 dependencies. Nobody can. So we just\u2026 don't. We trust that someone else is doing it. Spoiler: nobody is doing it.<\/p>\n\n<h3>\n  \n  \n  3. Maintainers don't have phishing-resistant 2FA\n<\/h3>\n\n<p>Josh Junon had 2FA. TOTP-based. The attacker phished his TOTP code in real time. WebAuthn \/ hardware keys would have stopped this cold because there's no code to steal \u2014 the key is bound to the actual domain. npm now supports WebAuthn. Most maintainers haven't switched. <strong>You should switch.<\/strong><\/p>\n\n<h3>\n  \n  \n  4. We use floating versions and never pin\n<\/h3>\n\n<p><code>\"chalk\": \"^5.6.0\"<\/code> says \"give me whatever 5.x.y you've got, hot off the registry, I trust the universe.\" This is the default behavior when you <code>npm install chalk<\/code>. So when chalk 5.6.1 got published with a wallet drainer two hours after the legit 5.6.0, anyone running <code>npm install<\/code> in those two hours got the drainer.<\/p>\n\n<p>The fix is <code>npm ci<\/code> in CI\/CD (uses your lockfile, exactly) and <strong>cooldown periods<\/strong> (don't auto-pull packages newer than ~14 days, which is what Elastic now does). Almost nobody does this either.<\/p>\n\n<h3>\n  \n  \n  5. The npm registry has no concept of trust\n<\/h3>\n\n<p>Anyone can register any package name. Anyone can publish anything. There's no review, no signing requirement (until very recently and it's opt-in), no provenance check. The only signal you have that a package is legit is \"it's popular\" and \"the name looks right.\" When the AI hallucinates a name, both of those checks fail silently.<\/p>\n\n<h3>\n  \n  \n  6. We give CI\/CD environments god-mode tokens\n<\/h3>\n\n<p>Why does your GitHub Actions runner have a npm publish token with write access to all your org's packages? Why does it have an AWS key with <code>s3:*<\/code> and not just <code>s3:PutObject<\/code> on one bucket? Why does your <code>.env<\/code> in development have your production database password?<\/p>\n\n<p>Because we're lazy. The Shai-Hulud worm did so much damage so fast because every machine it landed on had a Pandora's box of credentials sitting in environment variables and config files. Least-privilege isn't a buzzword, it's the only thing that limits blast radius.<\/p>\n\n<h3>\n  \n  \n  7. Nobody is using npm provenance, trusted publishers, or signed commits\n<\/h3>\n\n<p>These all exist. They've existed for over a year. Adoption is single-digit percent in most ecosystems. We collectively shrugged.<\/p>\n\n<h2>\n  \n  \n  Part 4: So where does AI actually fit in?\n<\/h2>\n\n<p>Let me be fair, because I'm not in the \"AI can do no wrong\" camp either. Here's what AI is genuinely making worse:<\/p>\n\n<ul>\n<li>\n<strong>Hallucinated package names<\/strong> are a real, novel attack surface. Slopsquatting wouldn't exist without LLMs.<\/li>\n<li>\n<strong>AI agents that auto-install dependencies<\/strong> are dangerous because they shrink the verification window from \"human reads it\" to \"literally nothing reads it.\" <code>cursor run<\/code>, autonomous Claude Code workflows, agentic dev tools \u2014 they're a lethal trifecta when combined with <code>postinstall<\/code>.<\/li>\n<li>\n<strong>AI coding assistants are valuable targets<\/strong> for prompt injection (see SANDWORM_MODE poisoning <code>.claude\/<\/code> configs). That's a real new risk.<\/li>\n<li>\n<strong><code>--yolo<\/code> flags exist<\/strong>, and that's a vibe. We collectively decided convenience was worth more than safety boundaries. That's on the tooling builders <em>and<\/em> on us for using them.<\/li>\n<\/ul>\n\n<p>But here's the thing \u2014 every single one of those AI-specific risks rides on top of an existing broken substrate. Slopsquatting doesn't matter if <code>postinstall<\/code> can't run. Prompt injection of AI configs doesn't matter if you don't autorun untrusted code. <code>--dangerously-skip-permissions<\/code> doesn't matter if your AI CLI doesn't have credentials to all your services.<\/p>\n\n<p>The AI is the new attack <em>delivery<\/em>. The vulnerabilities being delivered are the same ones we've been ignoring for fifteen years.<\/p>\n\n<h2>\n  \n  \n  Part 5: What I'm actually going to do about it\n<\/h2>\n\n<p>I publish to npm. I've shipped Flutter apps that pull from pub.dev (same problems, different ecosystem). I run my own VPS. So this stuff is personal. Here's what I'm changing this weekend, and you should too:<\/p>\n\n<ol>\n<li>\n<strong>Turn on phishing-resistant 2FA everywhere that supports it.<\/strong> WebAuthn \/ hardware keys for GitHub, npm, AWS, GCP. TOTP is not enough anymore.<\/li>\n<li>\n<strong>Put <code>ignore-scripts=true<\/code> in my <code>.npmrc<\/code><\/strong> for any project where I don't desperately need install scripts. When I do need them, I enable them per-install.<\/li>\n<li>\n<strong>Use <code>npm ci<\/code> in every CI pipeline.<\/strong> No more <code>npm install<\/code> on the server. The lockfile is law.<\/li>\n<li>\n<strong>Set a cooldown period<\/strong> \u2014 don't auto-pull packages newer than 14 days. Tools like Renovate support this natively.<\/li>\n<li>\n<strong>Audit my AI agent permissions.<\/strong> No more <code>--dangerously-skip-permissions<\/code> unless I'm in a sandboxed VM I'm willing to nuke.<\/li>\n<li>\n<strong>Stop using floating version ranges<\/strong> for anything I actually care about. Pin, don't carat.<\/li>\n<li>\n<strong>Verify package names before installing them<\/strong>, especially when an AI suggests one. If I haven't heard of it, I check the registry, the GitHub repo, the maintainer history, the download count. It takes 30 seconds.<\/li>\n<li>\n<strong>Rotate credentials I've had sitting around for \"too long\".<\/strong> If I haven't rotated my GitHub PAT in a year, it's probably already in someone's <code>results.b64<\/code>.<\/li>\n<li>\n<strong>Scope my tokens.<\/strong> npm tokens scoped to specific packages. AWS keys scoped to specific actions on specific resources. Stop using god-tokens.<\/li>\n<li>\n<strong>Use Trusted Publishing<\/strong> if I'm publishing to npm. No more long-lived tokens. (Elastic and Nx both moved to this after getting burned, learn from their pain.)<\/li>\n<\/ol>\n\n<h2>\n  \n  \n  TL;DR\n<\/h2>\n\n<p>The Shai-Hulud worms, the chalk hijack, the Nx attack \u2014 these all happened because:<\/p>\n\n<ul>\n<li>npm executes arbitrary code on install<\/li>\n<li>Maintainers got phished<\/li>\n<li>Tokens were over-privileged<\/li>\n<li>Nobody pins versions<\/li>\n<li>Nobody audits dependencies<\/li>\n<li>Nobody uses hardware 2FA<\/li>\n<li>The registry has no trust model<\/li>\n<\/ul>\n\n<p>The AI's contribution to all of this was: it generated some malware comments with emojis, it occasionally hallucinated a package name that an attacker pre-registered, and it offered <code>--yolo<\/code> flags that developers eagerly enabled.<\/p>\n\n<p>If you removed AI entirely from this story, <strong>we'd still be cooked.<\/strong> The npm ecosystem has been a security disaster since 2018. The AI just turned the dial from \"disaster\" to \"disaster with better grammar.\"<\/p>\n\n<p>So please, the next time you see \"AI ruined supply chain security\" trending \u2014 close the tab, open your <code>package.json<\/code>, and look at how many packages with <code>postinstall<\/code> scripts you have. That's where the call is coming from.<\/p>\n\n\n\n\n<p><em>If you got value out of this, follow me on <a href=\"https:\/\/dev.to\">Dev.to<\/a> and <a href=\"https:\/\/pranta.dev\" rel=\"noopener noreferrer\">pranta.dev<\/a>. I write about full-stack stuff, Flutter, server ops, and apparently now angry security posts. Stay safe out there. Pin your dependencies.<\/em><\/p>\n\n","category":["security","javascript","npm","ai"]},{"title":"AI Persona \u2014 Build, share, and chat with your custom AI companions","pubDate":"Sat, 31 Jan 2026 14:50:18 +0000","link":"https:\/\/dev.to\/pranta\/ai-persona-build-share-and-chat-with-your-custom-ai-companions-b83","guid":"https:\/\/dev.to\/pranta\/ai-persona-build-share-and-chat-with-your-custom-ai-companions-b83","description":"<blockquote>\n<p><strong>TL;DR:<\/strong> I built <strong>AI Persona<\/strong> \u2014 an open-source Android app that lets you create, customize, and chat with AI companions (with voice and knowledge base support). Try it on Google Play, check the repo, and read on for why I built it, how it works, and how you can help.<br>\nPlay Store: <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.aipersona\" rel=\"noopener noreferrer\">https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.aipersona<\/a><br>\nGitHub: <a href=\"https:\/\/github.com\/theprantadutta\/ai_persona\" rel=\"noopener noreferrer\">https:\/\/github.com\/theprantadutta\/ai_persona<\/a><\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  Why I built AI Persona\n<\/h2>\n\n<p>A lot of AI chat apps feel one-size-fits-all: a single assistant, a single tone. I wanted something more playful and modular \u2014 the ability to spin up a creative writing partner, an assistant who knows only your project docs, or even a fictional character that talks like it stepped out of a movie script.<\/p>\n\n<p>So I built AI Persona to be:<\/p>\n\n<ul>\n<li>\n<strong>Personal<\/strong>: each persona has a personality, memory, and optional knowledge base.<\/li>\n<li>\n<strong>Creative<\/strong>: use it for brainstorming, roleplay, practice, or productivity.<\/li>\n<li>\n<strong>Open<\/strong>: you can inspect and contribute (repo linked above).<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  What it does (features at a glance)\n<\/h2>\n\n<p>The app\u2019s Play Store description highlights these core capabilities:<\/p>\n\n<ul>\n<li>Chat with <strong>unique AI personas<\/strong> that remember context and adapt to your style.<\/li>\n<li>\n<strong>Create custom personas<\/strong> from scratch \u2014 personality, expertise, response style.<\/li>\n<li>Add <strong>custom knowledge bases<\/strong> (documents) that a persona can reference.<\/li>\n<li>\n<strong>Voice features<\/strong>: speech-to-text and text-to-speech for natural conversations.<\/li>\n<li>\n<strong>Community &amp; social<\/strong> features: browse, follow, like, clone, and remix community personas.<\/li>\n<li>Cross-device sync, privacy controls (export\/delete data), and subscription tiers for heavier usage. ([Google Play][1])<\/li>\n<\/ul>\n\n<p>(Play Store also shows recent updates like Picture-in-Picture support and Android 15 edge-to-edge improvements.) ([Google Play][1])<\/p>\n\n\n\n\n<h2>\n  \n  \n  Pricing &amp; limits (as listed on Play Store)\n<\/h2>\n\n<ul>\n<li>\n<strong>Free<\/strong>: 25 messages\/day, up to 3 personas, 3-day history, 50MB storage.<\/li>\n<li>\n<strong>Basic<\/strong> ($4.99\/mo): 200 messages\/day, up to 15 personas, 30-day history, voice input.<\/li>\n<li>\n<strong>Premium<\/strong> ($9.99\/mo): 1,000 messages\/day, 50 personas, 90-day history, full voice features.<\/li>\n<li>\n<strong>Pro<\/strong> ($19.99\/mo): Unlimited messages, unlimited personas\/history, larger storage and features. ([Google Play][1])<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Screenshots \/ visuals\n<\/h2>\n\n<p>You\u2019ll find screenshots and the app icon on the Play Store listing (use them in the dev.to post if you want visual context). The Play Store listing also includes the \u201cAbout this app\u201d copy that summarizes the experience. ([Google Play][1])<\/p>\n\n\n\n\n<h2>\n  \n  \n  How to try it\n<\/h2>\n\n<ol>\n<li>Install from Google Play: <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.aipersona\" rel=\"noopener noreferrer\">https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.aipersona<\/a>. ([Google Play][1])<\/li>\n<li>Create a persona (or browse community personas).<\/li>\n<li>Add a small document or two if you want the persona to answer from your knowledge base.<\/li>\n<li>Try voice input and TTS to test the multimodal experience.<\/li>\n<\/ol>\n\n\n\n\n<h2>\n  \n  \n  How to contribute (for open-source folks)\n<\/h2>\n\n<blockquote>\n<p>NOTE: I tried to fetch the GitHub repo at the link you provided, but it returned a 404 on my side. Make sure the repo is public or the URL is correct so contributors can reach it.<\/p>\n<\/blockquote>\n\n<p>Suggested repo structure and CONTRIBUTING tips you can add to the repo (copy\/paste into a CONTRIBUTING.md):<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight markdown\"><code><span class=\"gh\"># Contributing to AI Persona<\/span>\n\nThanks for wanting to help. A few ways to contribute:\n<span class=\"p\">-<\/span> Bug reports &amp; feature requests: open issues labeled <span class=\"sb\">`bug`<\/span> or <span class=\"sb\">`enhancement`<\/span>.\n<span class=\"p\">-<\/span> PRs: branch from <span class=\"sb\">`main`<\/span> and open PRs against <span class=\"sb\">`main`<\/span>. Keep changes focused.\n<span class=\"p\">-<\/span> Localization: provide translations for strings.xml (or i18n files).\n<span class=\"p\">-<\/span> Persona marketplace: add a few example persona JSONs in <span class=\"sb\">`\/examples\/personas`<\/span>.\n<span class=\"p\">-<\/span> Docs: improve README with architecture, deployment, and API docs.\n\nTesting:\n<span class=\"p\">-<\/span> Unit tests for core logic\n<span class=\"p\">-<\/span> Integration tests for networking and storage\n<span class=\"p\">-<\/span> Manual test plan for voice \/ TTS features\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>If you want, I can generate a polished CONTRIBUTING.md and README sections for you now.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Developer notes (what to include in README \/ tech notes)\n<\/h2>\n\n<p>Instead of guessing the exact stack, here\u2019s a safe template you can fill in and add to your README:<\/p>\n\n<ul>\n<li>\n<strong>Platform<\/strong>: Android (min API 24 \/ target SDK X).<\/li>\n<li>\n<strong>Language &amp; frameworks<\/strong>: (e.g., Flutter \/ Kotlin \/ Jetpack Compose \u2014 fill in what you used).<\/li>\n<li>\n<strong>AI<\/strong>: Describe if the app uses remote LLM APIs (OpenAI, Anthropic, local LLMs) or a hybrid. Mention how prompts, persona metadata, and custom knowledge bases are stored and retrieved.<\/li>\n<li>\n<strong>Voice<\/strong>: Describe TTS\/STT providers (Google Speech-to-Text, Android TTS, or cloud provider).<\/li>\n<li>\n<strong>Auth &amp; Privacy<\/strong>: Token storage, encryption in transit, export\/delete endpoints.<\/li>\n<li>\n<strong>Billing<\/strong>: Play Billing integration notes and how subscription states are enforced client-side vs server-side.<\/li>\n<\/ul>\n\n<p>Putting these details in the README helps developers decide whether they can run the app locally or contribute features.<\/p>\n\n\n\n\n<h2>\n  \n  \n  A suggested dev.to post body (copy-ready)\n<\/h2>\n\n<p>Below is a ready-to-paste article body (same as above but reformatted slightly shorter for dev.to readers who skim). Use the longer text above if you prefer \u2014 both are publish-ready.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Roadmap ideas (nice-to-have \/ next steps)\n<\/h2>\n\n<ul>\n<li>Desktop\/web client or PWA for cross-platform use.<\/li>\n<li>Persona versioning and diffs (see history of edits).<\/li>\n<li>Import\/export marketplace formats (JSON or YAML).<\/li>\n<li>End-to-end encryption option for private knowledge bases.<\/li>\n<li>Offline\/edge LLM support for local-only personas.<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Closing \/ Call to action\n<\/h2>\n\n<p>If you enjoy building with AI or want to try weird persona ideas (an NFL coach who only gives motivational quotes, or a 1920s detective who solves debugging problems), download AI Persona and create one. If you want to contribute, check the repo and open an issue \u2014 or ping me and I\u2019ll draft CONTRIBUTING\/README sections to make onboarding smoother.<\/p>\n\n<p>Play Store: <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.aipersona\" rel=\"noopener noreferrer\">https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.aipersona<\/a>. ([Google Play][1])<br>\nGitHub: <a href=\"https:\/\/github.com\/theprantadutta\/ai_persona\" rel=\"noopener noreferrer\">https:\/\/github.com\/theprantadutta\/ai_persona<\/a><\/p>\n\n","category":["ai","opensource","android","productivity"]},{"title":"I Built a Privacy-First Note-Taking App with Flutter \u2014 Here's What I Learned","pubDate":"Fri, 09 Jan 2026 16:39:42 +0000","link":"https:\/\/dev.to\/pranta\/i-built-a-privacy-first-note-taking-app-with-flutter-heres-what-i-learned-3nd1","guid":"https:\/\/dev.to\/pranta\/i-built-a-privacy-first-note-taking-app-with-flutter-heres-what-i-learned-3nd1","description":"<p>I just released my second app on the Google Play Store \u2014 <strong>Pinpoint<\/strong>, a privacy-focused note-taking app built with Flutter. After months of development, countless iterations, and learning a ton about encryption, cloud sync, and the freemium business model, I wanted to share the journey.<\/p>\n\n<p><strong>\ud83d\udd17 Links:<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.pinpoint\" rel=\"noopener noreferrer\">Google Play Store<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/theprantadutta\/pinpoint\" rel=\"noopener noreferrer\">GitHub (Open Source)<\/a><\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Why Another Note-Taking App?\n<\/h2>\n\n<p>I know what you're thinking \u2014 the world doesn't need another notes app. But here's the thing: most note apps either sacrifice privacy for features or sacrifice features for privacy. I wanted both.<\/p>\n\n<p><strong>The goals were simple:<\/strong><\/p>\n\n<ul>\n<li>End-to-end encryption that actually works<\/li>\n<li>Beautiful, modern UI (not just functional)<\/li>\n<li>Multiple note types beyond just text<\/li>\n<li>Cloud sync without compromising privacy<\/li>\n<li>A sustainable freemium model<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  The Tech Stack\n<\/h2>\n\n<p>Here's what powers Pinpoint under the hood:<\/p>\n\n<h3>\n  \n  \n  Core Framework\n<\/h3>\n\n<ul>\n<li>\n<strong>Flutter 3.6+<\/strong> \u2014 Cross-platform goodness<\/li>\n<li>\n<strong>Dart<\/strong> \u2014 Modern, type-safe language<\/li>\n<li>\n<strong>Material 3<\/strong> \u2014 Latest Material Design guidelines<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  Local Database\n<\/h3>\n\n<ul>\n<li>\n<strong>Drift 2.24<\/strong> \u2014 Type-safe SQLite with reactive queries. This was a game-changer for real-time updates.<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  Security\n<\/h3>\n\n<ul>\n<li>\n<strong>AES-256 Encryption<\/strong> \u2014 Using the <code>encrypt<\/code> package<\/li>\n<li>\n<strong>Flutter Secure Storage<\/strong> \u2014 For secure key management<\/li>\n<li>\n<strong>Local Auth<\/strong> \u2014 Biometric authentication (fingerprint\/Face ID)<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  State Management &amp; Architecture\n<\/h3>\n\n<ul>\n<li>\n<strong>Riverpod 3.0<\/strong> \u2014 Modern reactive state management<\/li>\n<li>\n<strong>Go Router<\/strong> \u2014 Declarative navigation<\/li>\n<li>\n<strong>GetIt<\/strong> \u2014 Dependency injection<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  Cloud &amp; Backend\n<\/h3>\n\n<ul>\n<li>\n<strong>Firebase Authentication<\/strong> \u2014 Google Sign-In<\/li>\n<li>\n<strong>Custom FastAPI Backend<\/strong> \u2014 For cloud sync and usage tracking<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Features I'm Most Proud Of\n<\/h2>\n\n<h3>\n  \n  \n  1. Multiple Note Types\n<\/h3>\n\n<p>Not just plain text. Pinpoint supports:<\/p>\n\n<ul>\n<li>\n<strong>Rich text notes<\/strong> with formatting<\/li>\n<li>\n<strong>Audio recordings<\/strong> with playback controls<\/li>\n<li>\n<strong>Todo lists<\/strong> with real-time auto-save<\/li>\n<li>\n<strong>Reminders<\/strong> with timezone-aware notifications<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  2. The Glassmorphism UI\n<\/h3>\n\n<p>I spent way too much time on this, but the frosted glass effects throughout the app just feel <em>right<\/em>. Combined with 5 accent color themes (Mint, Iris, Rose, Amber, Ocean) and smooth animations, it's genuinely pleasant to use.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"c1\">\/\/ Example: Glassmorphism container<\/span>\n<span class=\"n\">Container<\/span><span class=\"p\">(<\/span>\n  <span class=\"nl\">decoration:<\/span> <span class=\"n\">BoxDecoration<\/span><span class=\"p\">(<\/span>\n    <span class=\"nl\">color:<\/span> <span class=\"n\">Colors<\/span><span class=\"o\">.<\/span><span class=\"na\">white<\/span><span class=\"o\">.<\/span><span class=\"na\">withOpacity<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.1<\/span><span class=\"p\">),<\/span>\n    <span class=\"nl\">borderRadius:<\/span> <span class=\"n\">BorderRadius<\/span><span class=\"o\">.<\/span><span class=\"na\">circular<\/span><span class=\"p\">(<\/span><span class=\"mi\">24<\/span><span class=\"p\">),<\/span>\n    <span class=\"nl\">border:<\/span> <span class=\"n\">Border<\/span><span class=\"o\">.<\/span><span class=\"na\">all<\/span><span class=\"p\">(<\/span><span class=\"nl\">color:<\/span> <span class=\"n\">Colors<\/span><span class=\"o\">.<\/span><span class=\"na\">white<\/span><span class=\"o\">.<\/span><span class=\"na\">withOpacity<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.2<\/span><span class=\"p\">)),<\/span>\n  <span class=\"p\">),<\/span>\n  <span class=\"nl\">child:<\/span> <span class=\"n\">BackdropFilter<\/span><span class=\"p\">(<\/span>\n    <span class=\"nl\">filter:<\/span> <span class=\"n\">ImageFilter<\/span><span class=\"o\">.<\/span><span class=\"na\">blur<\/span><span class=\"p\">(<\/span><span class=\"nl\">sigmaX:<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"nl\">sigmaY:<\/span> <span class=\"mi\">10<\/span><span class=\"p\">),<\/span>\n    <span class=\"nl\">child:<\/span> <span class=\"c1\">\/\/ content<\/span>\n  <span class=\"p\">),<\/span>\n<span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  3. Real End-to-End Encryption\n<\/h3>\n\n<p>Notes are encrypted on-device before they ever leave your phone. The encryption key is derived from your master password and stored securely \u2014 I never see your notes.<\/p>\n\n<h3>\n  \n  \n  4. OCR &amp; Voice Transcription\n<\/h3>\n\n<p>Using Google ML Kit, you can extract text from images. Speech-to-text lets you quickly dictate notes when typing isn't convenient.<\/p>\n\n<h3>\n  \n  \n  5. The Freemium Model\n<\/h3>\n\n<p>I implemented a fair usage-based model:<\/p>\n\n<div class=\"table-wrapper-paragraph\"><table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Free<\/th>\n<th>Premium<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Synced Notes<\/td>\n<td>50<\/td>\n<td>Unlimited<\/td>\n<\/tr>\n<tr>\n<td>OCR Scans<\/td>\n<td>20\/month<\/td>\n<td>Unlimited<\/td>\n<\/tr>\n<tr>\n<td>Exports<\/td>\n<td>10\/month<\/td>\n<td>Unlimited<\/td>\n<\/tr>\n<tr>\n<td>Voice Recording<\/td>\n<td>2 min<\/td>\n<td>Unlimited<\/td>\n<\/tr>\n<tr>\n<td>Folders<\/td>\n<td>5<\/td>\n<td>Unlimited<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n\n<p>Usage is tracked both locally and on the backend to prevent bypassing limits.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Architecture Decisions\n<\/h2>\n\n<h3>\n  \n  \n  Clean Architecture with Service Layer\n<\/h3>\n\n<p>I went with a service-based architecture that keeps business logic separate from UI:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>lib\/\n\u251c\u2500\u2500 screens\/           # UI screens\n\u251c\u2500\u2500 components\/        # Reusable UI components\n\u251c\u2500\u2500 services\/          # Business logic layer\n\u251c\u2500\u2500 database\/          # Drift database\n\u251c\u2500\u2500 entities\/          # Database tables\n\u251c\u2500\u2500 design_system\/     # Colors, typography, theme\n\u2514\u2500\u2500 navigation\/        # Go Router config\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  Database Schema (Drift)\n<\/h3>\n\n<p>The schema supports many-to-many folder relationships:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"c1\">\/\/ Simplified schema<\/span>\n<span class=\"nl\">tables:<\/span>\n  <span class=\"o\">-<\/span> <span class=\"n\">notes<\/span> <span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">title<\/span><span class=\"p\">,<\/span> <span class=\"n\">content<\/span><span class=\"p\">,<\/span> <span class=\"n\">type<\/span><span class=\"p\">,<\/span> <span class=\"n\">encryption<\/span><span class=\"p\">,<\/span> <span class=\"n\">timestamps<\/span><span class=\"p\">)<\/span>\n  <span class=\"o\">-<\/span> <span class=\"n\">note_folders<\/span> <span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">title<\/span><span class=\"p\">)<\/span>\n  <span class=\"o\">-<\/span> <span class=\"n\">note_folder_relations<\/span> <span class=\"p\">(<\/span><span class=\"n\">note_id<\/span><span class=\"p\">,<\/span> <span class=\"n\">folder_id<\/span><span class=\"p\">)<\/span>\n  <span class=\"o\">-<\/span> <span class=\"n\">note_todo_items<\/span> <span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">note_id<\/span><span class=\"p\">,<\/span> <span class=\"n\">title<\/span><span class=\"p\">,<\/span> <span class=\"n\">is_done<\/span><span class=\"p\">)<\/span>\n  <span class=\"o\">-<\/span> <span class=\"n\">note_attachments<\/span> <span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">note_id<\/span><span class=\"p\">,<\/span> <span class=\"n\">file_path<\/span><span class=\"p\">,<\/span> <span class=\"n\">type<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  Stream-Based Reactivity\n<\/h3>\n\n<p>Drift's <code>watch<\/code> queries made real-time updates trivial:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"n\">Stream<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Note<\/span><span class=\"p\">&gt;&gt;<\/span> <span class=\"n\">watchAllNotes<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span><span class=\"n\">select<\/span><span class=\"p\">(<\/span><span class=\"n\">notes<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"o\">.<\/span><span class=\"na\">orderBy<\/span><span class=\"p\">([(<\/span><span class=\"n\">t<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">OrderingTerm<\/span><span class=\"o\">.<\/span><span class=\"na\">desc<\/span><span class=\"p\">(<\/span><span class=\"n\">t<\/span><span class=\"o\">.<\/span><span class=\"na\">updatedAt<\/span><span class=\"p\">)]))<\/span>\n    <span class=\"o\">.<\/span><span class=\"na\">watch<\/span><span class=\"p\">();<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n\n\n\n<h2>\n  \n  \n  Challenges I Faced\n<\/h2>\n\n<h3>\n  \n  \n  1. Google Play Billing Integration\n<\/h3>\n\n<p>Setting up in-app subscriptions was... painful. Between base plans, offers, and tags, I spent a solid week just understanding the terminology. Pro tip: read Google's docs three times before you start coding.<\/p>\n\n<h3>\n  \n  \n  2. Cloud Sync Conflicts\n<\/h3>\n\n<p>When the same note is edited on two devices offline, which version wins? I implemented a \"last write wins\" strategy with timestamps, but this is still an area I want to improve.<\/p>\n\n<h3>\n  \n  \n  3. Todo List Auto-Save\n<\/h3>\n\n<p>Getting todo items to auto-save without losing the user's cursor position or creating race conditions was trickier than expected. I ended up using debouncing with temporary IDs for unsaved items.<\/p>\n\n\n\n\n<h2>\n  \n  \n  What's Next?\n<\/h2>\n\n<p>The roadmap includes:<\/p>\n\n<ul>\n<li>\n<strong>Collaboration<\/strong> \u2014 Share notes with others<\/li>\n<li>\n<strong>Tags System<\/strong> \u2014 Beyond just folders<\/li>\n<li>\n<strong>Markdown Editor<\/strong> \u2014 Full markdown support<\/li>\n<li>\n<strong>iOS Release<\/strong> \u2014 App Store deployment<\/li>\n<li>\n<strong>Web Clipper<\/strong> \u2014 Save content directly from browser<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  Try It Out!\n<\/h2>\n\n<p>If you're looking for a note-taking app that respects your privacy without compromising on features, give Pinpoint a try:<\/p>\n\n<p>\ud83d\udcf1 <strong><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.pranta.pinpoint\" rel=\"noopener noreferrer\">Download on Google Play<\/a><\/strong><\/p>\n\n<p>\ud83d\udcbb <strong><a href=\"https:\/\/github.com\/theprantadutta\/pinpoint\" rel=\"noopener noreferrer\">View Source on GitHub<\/a><\/strong><\/p>\n\n<p>The app is open source, so feel free to poke around the code, open issues, or contribute. I'd love to hear your feedback!<\/p>\n\n\n\n\n<h2>\n  \n  \n  Wrapping Up\n<\/h2>\n\n<p>Building Pinpoint taught me a lot about Flutter, encryption, cloud architecture, and what it takes to ship a real product. If you're thinking about building your own app, my advice is simple: just start. The learning happens in the doing.<\/p>\n\n<p>Thanks for reading! Drop a comment if you have questions about the implementation or want me to dive deeper into any specific part.<\/p>\n\n\n\n\n<p><strong>Tags:<\/strong> #flutter #dart #mobile #opensource #privacy<\/p>\n\n","category":["flutter","dart","mobile","privacy"]},{"title":"Anthropic: Brilliant Models, Bullshit Pricing","pubDate":"Mon, 06 Oct 2025 18:25:01 +0000","link":"https:\/\/dev.to\/pranta\/anthropic-brilliant-models-bullshit-pricing-3m0h","guid":"https:\/\/dev.to\/pranta\/anthropic-brilliant-models-bullshit-pricing-3m0h","description":"<p>Let\u2019s get one thing straight \u2014 <strong>Anthropic makes some of the best damn AI models on the planet<\/strong>.<br>\nTheir Claude lineup \u2014 <strong>Sonnet<\/strong>, <strong>Opus<\/strong>, and <strong>Claude Code<\/strong> \u2014 feels like coding with a genius friend who <em>actually listens<\/em> and doesn\u2019t gaslight you when you typo a variable.<\/p>\n\n<p>But then\u2026 <em>they charge you like you\u2019re leasing a Ferrari by the hour.<\/em><br>\nSo let\u2019s dive in \u2014 first the praise, then the pain.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\ude80 The Praise: They Built Literal Magic\n<\/h2>\n\n<p>Anthropic\u2019s <strong>Claude models<\/strong> are technical masterpieces.<\/p>\n\n<ul>\n<li><p><strong>Claude Sonnet 4.5<\/strong> \u2014 currently hailed as <em>\u201cthe best coding model in the world\u201d<\/em><br>\n\u2192 It nails <strong>77.2%<\/strong> on real-world coding benchmarks.<br>\n\u2192 Handles <strong>30+ hour coding sessions<\/strong> like a champ.<br>\n\u2192 And can refactor entire multi-file projects without losing its mind.<\/p><\/li>\n<li><p><strong>Claude Opus 4.1<\/strong> \u2014 the \u201cbig brain\u201d model.<br>\n\u2192 It\u2019s designed for <strong>advanced reasoning<\/strong> and <strong>agentic tasks<\/strong>.<br>\n\u2192 Comes with a monstrous <strong>200K-token context window<\/strong>, expandable to <strong>1M tokens<\/strong>.<br>\n\u2192 You can literally throw an entire codebase at it \u2014 it won\u2019t blink.<\/p><\/li>\n<\/ul>\n\n<p>Developers get spoiled with all this.<br>\nClaude Code has a <strong>native VS Code extension<\/strong>, <strong>CLI interface<\/strong>, <strong>code checkpoints<\/strong>, and even a <strong>Claude Agent SDK<\/strong> for building custom dev agents.<\/p>\n\n<p>You can <strong>create files<\/strong>, <strong>edit spreadsheets<\/strong>, <strong>manage docs<\/strong>, and <strong>refactor code<\/strong> directly in chat \u2014 it\u2019s like having ChatGPT, Copilot, and a senior engineer all rolled into one caffeinated model.<\/p>\n\n<p>Even the big boys are hyped:<\/p>\n\n<blockquote>\n<p>\u201cSonnet 4.5 soars in agentic scenarios.\u201d \u2013 <em>GitHub<\/em><br>\n\u201cAnthropic\u2019s most intelligent model and best performing for coding.\u201d \u2013 <em>AWS<\/em><\/p>\n<\/blockquote>\n\n<p>And to top it off, Anthropic frames itself as a <strong>public benefit corporation<\/strong> \u201cbuilding AI to serve humanity\u2019s long-term well-being.\u201d<br>\nThat\u2019s wholesome. Almost suspiciously wholesome.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\udcb8 The Pain: Price Tag from Hell\n<\/h2>\n\n<p>But then\u2026 they hit you with the <strong>pricing<\/strong>.<\/p>\n\n<p>Holy. Shit.<\/p>\n\n<p>Claude isn\u2019t free \u2014 it\u2019s <em>painfully premium<\/em>.<\/p>\n\n<p>Here\u2019s what we\u2019re looking at:<\/p>\n\n<div class=\"table-wrapper-paragraph\"><table>\n<thead>\n<tr>\n<th>Plan<\/th>\n<th>Price<\/th>\n<th>Prompts per 5 Hours<\/th>\n<th>Notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Pro<\/strong><\/td>\n<td>$20\/month<\/td>\n<td>10\u201340<\/td>\n<td>Claude 3 Sonnet<\/td>\n<\/tr>\n<tr>\n<td><strong>Max 5x<\/strong><\/td>\n<td>$100\/month<\/td>\n<td>50\u2013200<\/td>\n<td>Unlocks Claude Opus<\/td>\n<\/tr>\n<tr>\n<td><strong>Max 20x<\/strong><\/td>\n<td>$200\/month<\/td>\n<td>200\u2013800<\/td>\n<td>Full access (with limits \ud83d\ude12)<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n\n<p>And before you ask \u2014 yes, those \u201cprompts\u201d vanish faster than your will to live after debugging for 4 hours.<\/p>\n\n<p>For comparison:<\/p>\n\n<ul>\n<li>\n<strong>GitHub Copilot<\/strong> \u2192 $10\/month, unlimited usage.<\/li>\n<li>\n<strong>Cursor<\/strong> \u2192 $20\/month, predictable pricing.<\/li>\n<li>\n<strong>Claude<\/strong> \u2192 \u201cMaybe you can code today, maybe you can\u2019t \u2014 depends on your prompt quota.\u201d<\/li>\n<\/ul>\n\n<p>Developers everywhere are screaming:<\/p>\n\n<blockquote>\n<p>\u201cThe cost, the cost, the cost!\u201d<\/p>\n<\/blockquote>\n\n<p>Even tiny bug fixes can burn a few dollars.<br>\nLong refactors? Boom \u2014 your balance is gone.<\/p>\n\n<p>And the <strong>usage-based billing<\/strong> is a total gamble. You don\u2019t even know how much you\u2019ll pay until it\u2019s too late.<\/p>\n\n<p>To make it worse, Anthropic <strong>quietly changed usage limits<\/strong> for the $200 plan \u2014 without warning anyone.<br>\nCue the Reddit meltdowns.<br>\nImmediate backlash.<br>\nDevelopers furious about <strong>\u201copaque tiers\u201d<\/strong> and <strong>hidden caps<\/strong> that \u201cundermine the value\u201d of their top plans.<\/p>\n\n<p>So yeah. The models? Genius.<br>\nThe pricing? Highway robbery in a cashmere suit.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83c\udfad The \u201cMission\u201d: Safety or Sales Pitch?\n<\/h2>\n\n<p>Anthropic loves to say they\u2019re <em>\u201cdedicated to securing AI\u2019s benefits and mitigating its risks.\u201d<\/em><br>\nThey remind us constantly that they\u2019re <em>\u201ca public benefit corporation\u201d<\/em> with humanity\u2019s well-being at heart.<\/p>\n\n<p>Cute.<br>\nBut the real well-being they seem to care about is their <strong>profit margin<\/strong>.<\/p>\n\n<p>You don\u2019t partner with Amazon, AWS, and enterprise platforms just to \u201cserve humanity.\u201d You do it to <em>cash in<\/em>.<br>\nAnd fair enough \u2014 business is business.<br>\nBut maybe don\u2019t hide behind moral philosophy while charging $200 a month to write Python scripts?<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83e\uddd1\u200d\ud83d\udcbb Verdict for Developers\n<\/h2>\n\n<p>Let\u2019s break it down:<\/p>\n\n<p><strong>\u2705 Cutting-edge models:<\/strong><br>\nSonnet 4.5 and Opus 4.1 are <em>legit top-tier<\/em>. They handle multi-file projects, deep reasoning, and long contexts that leave GPT and Gemini sweating.<\/p>\n\n<p><strong>\ud83e\uddf0 Dev-friendly tools:<\/strong><br>\nThe VS Code extension, CLI, checkpoints, and Agent SDK are <em>chef\u2019s kiss<\/em>. Truly next-level dev experience.<\/p>\n\n<p><strong>\ud83d\udc80 Nightmare pricing:<\/strong><br>\nThe tiered pricing is an absolute wallet massacre. $20 for limited access, $200 for <em>maybe<\/em> enough prompts. Predictability = 0.<\/p>\n\n<p><strong>\ud83d\udea9 Red flags:<\/strong><br>\nSecret usage limits, vague caps, and vague plan descriptions. Users feel scammed \u2014 with good reason.<\/p>\n\n<p><strong>\ud83d\udc94 Final take:<\/strong><br>\nIs Anthropic garbage?<br>\n\u2192 No. Their <strong>tech<\/strong> is god-tier.<br>\n\u2192 But their <strong>pricing<\/strong> and <strong>communication<\/strong> are <em>utter trash<\/em>.<\/p>\n\n<p>Anthropic gives you a <strong>Ferrari for coding<\/strong>\u2026 and then charges <strong>rent every time you hit the gas<\/strong>.<\/p>\n\n<p>So yeah, we love Claude \u2014 but we also hate that we\u2019re paying for it like it\u2019s AWS Lambda in 2012.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \u26a1 TL;DR\n<\/h2>\n\n<div class=\"table-wrapper-paragraph\"><table>\n<thead>\n<tr>\n<th>The Good<\/th>\n<th>The Bad<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Best-in-class AI for reasoning &amp; code<\/td>\n<td>Stupidly expensive<\/td>\n<\/tr>\n<tr>\n<td>Powerful dev tools &amp; SDK<\/td>\n<td>Hidden caps &amp; weird limits<\/td>\n<\/tr>\n<tr>\n<td>Massive context windows<\/td>\n<td>Unpredictable usage pricing<\/td>\n<\/tr>\n<tr>\n<td>Safety-first vision<\/td>\n<td>Feels more like profit-first execution<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n\n<p>Anthropic\u2019s <strong>Claude Sonnet<\/strong> and <strong>Opus<\/strong> are incredible.<br>\nThey\u2019re smart, intuitive, and ridiculously capable.<br>\nBut they\u2019re also the kind of models that\u2019ll make your accountant cry.<\/p>\n\n<p>So if you want <em>stellar AI<\/em>, Anthropic\u2019s your hero.<br>\nIf you want a <em>good deal<\/em>... brace yourself.<\/p>\n\n<p>At the end of the month, you\u2019ll be mumbling:<\/p>\n\n<blockquote>\n<p>\u201cGod damn it, Anthropic \u2014 I love you, but fuck these prices.\u201d<\/p>\n<\/blockquote>\n\n\n\n\n<p>Also if you want to learn how to make your own Claude, click <a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">here<\/a> and start today with CodeCrafters, you will help out a fellow dev as well, thanks.<\/p>\n\n","category":["ai","machinelearning","developerhumor","anthropic"]},{"title":"Oracle vs. Google: The API Battle That Shook the Coding World","pubDate":"Wed, 24 Sep 2025 14:19:15 +0000","link":"https:\/\/dev.to\/pranta\/oracle-vs-google-the-api-battle-that-shook-the-coding-world-27l0","guid":"https:\/\/dev.to\/pranta\/oracle-vs-google-the-api-battle-that-shook-the-coding-world-27l0","description":"<p>If you\u2019ve ever copy-pasted StackOverflow code at 2 AM and thought, <em>\u201cIs this legal?\u201d<\/em>, then buckle up. Today we\u2019re diving into one of the most legendary tech lawsuits of our time: <strong>Oracle v. Google<\/strong> \u2014 aka the court case that tried to decide whether an API is a recipe, a love poem, or a copyrightable Mona Lisa.<\/p>\n\n<p>Spoiler: It took <strong>over a decade<\/strong> to settle. Yup, this case dragged on longer than most Netflix series, with more plot twists than <em>Game of Thrones<\/em>. Let\u2019s break it down.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \u2615 Setting the Stage: Google, Java, and the Birth of Android\n<\/h2>\n\n<p>Picture this: It\u2019s the mid-2000s. Google is building <strong>Android<\/strong>, a new mobile operating system. They want developers to hop on board fast, and what better bait than a language devs already knew and loved: <strong>Java<\/strong>.<\/p>\n\n<p>But here\u2019s the catch \u2014 Java belonged to <strong>Sun Microsystems<\/strong>, the company behind everyone\u2019s favorite <code>System.out.println(\"Hello World\");<\/code> moments.<\/p>\n\n<p>Instead of buying a license, Google went: <em>\u201cNah, we\u2019ll just write our own version of Java\u2019s engine. But hey, to make it familiar, let\u2019s reuse some Java API declarations and structure.\u201d<\/em><\/p>\n\n<p>Translation: They copied about <strong>11,500 lines of code<\/strong> \u2014 not the <em>meaty<\/em> code, but the <strong>API structure<\/strong> (method names, class organization, etc.). Think of it like writing your own restaurant menu but keeping the same dish names so customers don\u2019t get confused.<\/p>\n\n<p>Sun Microsystems kinda shrugged. They wanted Java everywhere anyway. But then\u2026 <strong>Oracle swooped in and bought Sun in 2010<\/strong>. And Oracle was like, <em>\u201cWait, someone\u2019s making billions using OUR secret sauce? Lawyer up.\u201d<\/em><\/p>\n\n\n\n\n<h2>\n  \n  \n  \u2696\ufe0f The Lawsuit: Copyright or Not?\n<\/h2>\n\n<p>Oracle sued Google in <strong>2010<\/strong>, claiming two things:<\/p>\n\n<ol>\n<li>Google copied Java <strong>APIs<\/strong> \u2014 that\u2019s copyright infringement.<\/li>\n<li>Google also infringed on some <strong>patents<\/strong>.<\/li>\n<\/ol>\n\n<p>The patent part fizzled out. The real spicy meatball was the <strong>API copyright question<\/strong>:<\/p>\n\n<ul>\n<li>\n<strong>Oracle\u2019s stance:<\/strong> APIs are creative works. If we wrote it, we own it.<\/li>\n<li>\n<strong>Google\u2019s stance:<\/strong> APIs are functional \u2014 more like a keyboard layout or a dictionary. You can\u2019t copyright <em>function names<\/em>.<\/li>\n<\/ul>\n\n<p>And thus began a legal rollercoaster.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83c\udfa2 The 10-Year Rollercoaster Timeline\n<\/h2>\n\n<h3>\n  \n  \n  <strong>2012 (Trial Court)<\/strong>\n<\/h3>\n\n<ul>\n<li>Jury: \u201cNah, no patent infringement.\u201d<\/li>\n<li>Judge: \u201cAlso, APIs aren\u2019t copyrightable.\u201d (Google wins!)<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  <strong>2014 (Appeals Court)<\/strong>\n<\/h3>\n\n<ul>\n<li>Federal Circuit: \u201cActually, APIs <em>are<\/em> copyrightable.\u201d (Oracle wins!)<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  <strong>2016 (New Trial: Fair Use)<\/strong>\n<\/h3>\n\n<ul>\n<li>Jury: \u201cEven if they are copyrightable, Google\u2019s use was fair use.\u201d (Google wins!)<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  <strong>2018 (Appeals Court Again)<\/strong>\n<\/h3>\n\n<ul>\n<li>Federal Circuit: \u201cNope, still infringement. Not fair use.\u201d (Oracle wins!)<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  <strong>2021 (Supreme Court Final Boss)<\/strong>\n<\/h3>\n\n<ul>\n<li>Supreme Court: \u201cWe won\u2019t answer if APIs are copyrightable, but even if they are, Google\u2019s use is fair use.\u201d (Google wins!)<\/li>\n<\/ul>\n\n<p><strong>End of saga.<\/strong> Oracle didn\u2019t get their \\$8\u20139 billion payday. Google kept Android running as-is.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\ude80 Why This Case Mattered (Big Time)\n<\/h2>\n\n<p>This wasn\u2019t just a corporate slap-fight. It was about the <strong>future of programming freedom<\/strong>.<\/p>\n\n<ul>\n<li><p><strong>For developers:<\/strong> Imagine if APIs were fully locked down by copyright. That means you couldn\u2019t write your own version of, say, Python\u2019s <code>math<\/code> library or React\u2019s hooks without begging for permission (and probably paying royalties). Innovation would slow to a crawl.<\/p><\/li>\n<li><p><strong>For open source:<\/strong> The entire open source ecosystem thrives on <em>compatible implementations<\/em>. Linux clones UNIX APIs. PostgreSQL mimics Oracle DB features. Even your favorite npm packages often re-implement existing ideas. If APIs were off-limits, open source would become open-what?<\/p><\/li>\n<li><p><strong>For tech companies:<\/strong> It clarified that using APIs in transformative ways can be <strong>fair use<\/strong>. That gave startups and giants alike the confidence to build new systems without worrying Oracle\u2019s lawyers would show up like the copyright police.<\/p><\/li>\n<\/ul>\n\n<p>Basically, this case set a precedent: <strong>APIs are fair game if used reasonably.<\/strong> Without it, Android (and probably half the apps on your phone) wouldn\u2019t exist the way they do today.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83e\udd4a Oracle vs. Google in Meme Form\n<\/h2>\n\n<ul>\n<li>\n<strong>Oracle:<\/strong> \u201cYou copied my homework!\u201d<\/li>\n<li>\n<strong>Google:<\/strong> \u201cYeah, but I wrote all my own answers, I just used the same section titles.\u201d<\/li>\n<li>\n<strong>Supreme Court:<\/strong> \u201cLooks like fair use. Now stop wasting our time.\u201d<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\udccc Final Thoughts\n<\/h2>\n\n<p>The Oracle v. Google saga is a cautionary tale of how legal battles can drag on forever in tech \u2014 and how the fate of APIs (and billions of dollars) can hang on whether a judge thinks code is like a recipe or a novel.<\/p>\n\n<p>At the end of the day, developers breathed a sigh of relief. APIs remain a shared language of the coding world, and you can keep copy-pasting those sweet sweet library calls without losing sleep.<\/p>\n\n<p>Well, except when your code doesn\u2019t compile. That\u2019s still on you.<\/p>\n\n\n\n\n<p>\ud83d\udca1 Want to sharpen your coding chops with real-world systems (without getting sued by Oracle)? Check out Codecrafters <a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">here<\/a>. It\u2019s like gym for developers \u2014 but instead of lifting weights, you\u2019re lifting entire databases, Docker, Git, and more.<\/p>\n\n\n\n\n","category":["programming","opensource","softwareengineering","google"]},{"title":"Why Apple\u2019s \u201cLiquid Glass\u201d and Google\u2019s \u201cExpressive\u201d UIs Might Be Missteps","pubDate":"Mon, 15 Sep 2025 18:22:22 +0000","link":"https:\/\/dev.to\/pranta\/why-apples-liquid-glass-and-googles-expressive-uis-might-be-missteps-42fa","guid":"https:\/\/dev.to\/pranta\/why-apples-liquid-glass-and-googles-expressive-uis-might-be-missteps-42fa","description":"<p>Apple\u2019s new <strong>Liquid Glass<\/strong> design and Google\u2019s <strong>Material 3 Expressive<\/strong> update promise to make our phones look <em>fancier<\/em> \u2013 but many designers and users are already grumbling. These see-through, glassy effects and over-the-top animations sound exciting on paper, but can they hamper usability in the real world? After combing through tech blogs, reviews, and dev communities, here are the key problems critics have found (with a humorous twist):<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83c\udf78 Apple\u2019s Liquid Glass: All Show, Hardly a Shaker\n<\/h2>\n\n<p>Apple bills Liquid Glass as a <strong>\u201ctranslucent material that reflects and refracts its surroundings\u201d<\/strong> (<a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2024\/10066\/\" rel=\"noopener noreferrer\">Apple WWDC session<\/a>). In other words, buttons and panels look as if they\u2019re carved from actual frosted glass (think of iOS floating above a pretty wallpaper everywhere). The idea is to give the UI \u201ca new level of vitality\u201d across controls and icons.<\/p>\n\n<p><a href=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtlf7tgh08tubrh8zlp7.jpg\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtlf7tgh08tubrh8zlp7.jpg\" alt=\"Apple Liquid Glass UI example\" width=\"800\" height=\"450\"><\/a><br><br>\n<em>Apple\u2019s Liquid Glass makes app icons and buttons look like frosted glass layers. It *sounds<\/em> sleek \u2013 but early testers note it has already \u201cresulted in challenges in terms of readability.\u201d (TechCrunch)*<\/p>\n\n<h3>\n  \n  \n  The Problems\n<\/h3>\n\n<ul>\n<li><p><strong>Legibility Nightmares:<\/strong> Wired\u2019s design critics say Liquid Glass currently \u201cveers into distracting or challenging to read\u201d territory. Beta testers noted that <em>\u201ctext and icons could get lost on busy or high-contrast backgrounds.\u201d<\/em> In plain terms: if your wallpaper has pink flowers behind your chat bubble, your words might vanish. Accessibility advocates are already worried about contrast issues.<\/p><\/li>\n<li><p><strong>Wallpaper Obsession Over Function:<\/strong> One Reddit designer joked that while Liquid Glass looks nice in screenshots, it feels like a PITA (\u201cpain in the UI\u201d) to actually use, since it treats the home screen as <em>your wallpaper portfolio<\/em>. It\u2019s as if Apple is saying: \u201cDon\u2019t mind the text\u2014just admire the background!\u201d  <\/p><\/li>\n<li><p><strong>Developer Headaches:<\/strong> For app makers, adapting to Liquid Glass isn\u2019t trivial. Wired quotes a small-team dev fretting, <em>\u201cI\u2019m scrambling to make our designs work.\u201d<\/em> Many third-party apps lag behind Apple\u2019s own, creating a fragmented, Frankenstein UI.<\/p><\/li>\n<\/ul>\n\n<p>\ud83d\udca1 <strong>Summary:<\/strong> Liquid Glass is undeniably pretty, but critics fear it\u2019s <em>\u201cbeautiful in theory, terrible in real life.\u201d<\/em> If your phone interface looks like it\u2019s made of ice, be prepared: you might squint a lot.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83c\udfa8 Google\u2019s Material 3 Expressive: Bold Colors or Blinding Clutter?\n<\/h2>\n\n<p>Google\u2019s answer is <strong>Material 3 Expressive<\/strong> (aka \u201cMaterial You Expressive\u201d), a big revamp of Android\u2019s look. Google claims this makes your device \u201cfeel unique to you\u201d with more dynamic colors, bigger buttons, and springy animations. They even boast the new design helped users <em>\u201cspot key UI elements up to 4\u00d7 faster.\u201d<\/em><\/p>\n\n<p><a href=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3dvu1zj7ztqpbf1nfmlh.webp\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3dvu1zj7ztqpbf1nfmlh.webp\" alt=\"Material 3 Expressive UI\" width=\"800\" height=\"451\"><\/a><br><br>\n<em>Material 3 Expressive in Android 16: bigger, rounded Quick Settings tiles and pill-shaped buttons. Google claims this improves glanceability, but many users feel it just makes the UI feel **cartoonishly oversized.<\/em>**<\/p>\n\n<h3>\n  \n  \n  The Problems\n<\/h3>\n\n<ul>\n<li><p><strong>Retina-Seering Colors &amp; Curvy Chaos:<\/strong> Android Authority\u2019s Robert Triggs calls Expressive \u201cretina-searing color swatches, endless squircles, and curvy chaos,\u201d with fonts so mismatched unlocking his Pixel became a minor trauma. Instead of sleek sci-fi, he got a <em>cartoonish fever dream<\/em>.  <\/p><\/li>\n<li><p><strong>Lost in Form vs Function:<\/strong> Quick settings tiles balloon into giant pill-shaped buttons, headers eat up space, and padding doubles. Users complain they can now see only <em>five lines of text instead of ten<\/em>.  <\/p><\/li>\n<li><p><strong>Headache-Inducing Excess:<\/strong> While Google insists it\u2019s more customizable and \u201calive,\u201d critics sum it up as <em>headache-inducing excess<\/em>. The focus on flashy animations may distract from clarity. One blogger quipped that Google designers are \u201cobsessed with metrics, not usability.\u201d<\/p><\/li>\n<\/ul>\n\n<p>\ud83d\udca1 <strong>Summary:<\/strong> Material Expressive may help you spot your Play Store icon 4\u00d7 faster\u2026 but it also feels like putting a spoiler on a Prius: flashy, but doesn\u2019t improve the ride.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \u2696\ufe0f Key Complaints (The TL;DR)\n<\/h2>\n\n<ul>\n<li>\n<strong>Legibility vs. Looks:<\/strong> Both Liquid Glass and Expressive prioritize aesthetics, but sacrifice readability and accessibility.\n<\/li>\n<li>\n<strong>Consistency Headache:<\/strong> Frequent redesigns force devs to constantly update apps, leaving many half-updated and inconsistent.\n<\/li>\n<li>\n<strong>Style Over Substance:<\/strong> Apple says Liquid Glass \u201cbrings focus to content,\u201d but users feel it distracts. Google touts \u201c4\u00d7 faster recognition,\u201d but critics argue it swaps simplicity for clutter.\n<\/li>\n<li>\n<strong>Developer Frustration:<\/strong> Frequent design shifts mean more rework for developers, especially small teams. Cue frustration.\n<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  \ud83e\udd42 Conclusion: Glass Half Full or Half Empty?\n<\/h2>\n\n<p>Trends like glassmorphism or expressive theming are exciting experiments, but any design that makes you squint more than think is suspect. These changes look great on a demo stage, but can they survive the real world (and the dreaded <strong>sun glare<\/strong>)? If not, they risk being remembered as <em>design fads<\/em> rather than <em>design revolutions<\/em>.<\/p>\n\n<p>For now, Apple is already tweaking Liquid Glass in betas, and Android partners will likely tone down Expressive for their skins. The lesson: flashy isn\u2019t always functional.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\udc68\u200d\ud83d\udcbb About the Author\n<\/h2>\n\n<p>Hey, I\u2019m <strong>Pranta Dutta<\/strong>, a <strong>mobile developer<\/strong> who spends way too much time wrangling UIs on both iOS and Android. When Apple or Google pulls a big design pivot, I feel it directly in the trenches of app dev.  <\/p>\n\n<ul>\n<li>Check out my work: <a href=\"https:\/\/pranta.dev\" rel=\"noopener noreferrer\">pranta.dev<\/a>\n<\/li>\n<li>Join me on Codecrafters: <a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">here<\/a>\n<\/li>\n<\/ul>\n\n<p>If you enjoyed this, smash that \u2764\ufe0f on Dev.to so I know I\u2019m not screaming into the design void.  <\/p>\n\n\n\n\n<h3>\n  \n  \n  \ud83d\udcda Sources\n<\/h3>\n\n<ul>\n<li>Wired: <em>Apple\u2019s Liquid Glass looks beautiful but can be distracting<\/em>\n<\/li>\n<li>TechCrunch: <em>iOS 26 Liquid Glass readability issues<\/em>\n<\/li>\n<li>AppleInsider: <em>iOS 26 design overview<\/em>\n<\/li>\n<li>Android Authority: <em>Material Expressive review by Robert Triggs<\/em>\n<\/li>\n<li>Google Material Design Blog: <em>Expressive UI goals and metrics<\/em>\n<\/li>\n<li>Reddit design\/dev communities: <em>Developer reactions to Liquid Glass and Material Expressive<\/em>\n<\/li>\n<\/ul>\n\n"},{"title":"What\u2019s It Like to Be a Software Developer in 2025?","pubDate":"Thu, 11 Sep 2025 17:42:06 +0000","link":"https:\/\/dev.to\/pranta\/whats-it-like-to-be-a-software-developer-in-2025-3i6a","guid":"https:\/\/dev.to\/pranta\/whats-it-like-to-be-a-software-developer-in-2025-3i6a","description":"<p>If you asked me to describe being a software developer in 2025 in one sentence, I\u2019d say: <em>it\u2019s like riding a rollercoaster built by AI interns while trying to debug your own life in production.<\/em><\/p>\n\n<p>Sounds dramatic? Oh, it is.<\/p>\n\n<p>Let\u2019s break it down.<\/p>\n\n\n\n\n<h2>\n  \n  \n  1. AI Is Your Best Friend\u2026 and Your Worst Nightmare\n<\/h2>\n\n<p>On one hand, AI tools are everywhere. GitHub Copilot, GPT-based assistants, AI-powered testing suites\u2014heck, even your IDE now whispers bug fixes like it\u2019s possessed by the ghost of Linus Torvalds.<\/p>\n\n<p>But here\u2019s the thing: AI doesn\u2019t just \u201chelp.\u201d It also <em>lies<\/em>. It confidently spits out wrong code like that one coworker who insists <code>rm -rf<\/code> is the answer to everything. You spend hours debugging \u201cAI magic\u201d that was supposed to save you time.<\/p>\n\n<p>In short: AI is like a clingy friend who insists they\u2019re helping while actually setting your house on fire.<\/p>\n\n\n\n\n<h2>\n  \n  \n  2. The Tech Stack Tower of Babel\n<\/h2>\n\n<p>You thought JavaScript frameworks were bad in 2018? Welcome to 2025, where there\u2019s a new \u201crevolutionary\u201d framework every Tuesday. Flutter, React Native, SwiftUI, Rust-based frontends, quantum-compilers (yeah, that\u2019s a thing now)\u2014keeping up feels like trying to drink from a firehose\u2026 while the hose is coded in a deprecated language.<\/p>\n\n<p>And yes, your boss still asks:<\/p>\n\n<blockquote>\n<p><em>\u201cWhy can\u2019t you just learn this new tool by tomorrow?\u201d<\/em><\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  3. Remote Work: Freedom and Loneliness in 4K\n<\/h2>\n\n<p>Working from home is now the default. Sounds dreamy, right? Pajamas, coffee, your cat as a coworker.<\/p>\n\n<p>But then you realize your entire social life is Slack emojis. Your project manager pings you at 11:59 PM because \u201ctime zones.\u201d And the line between \u201cworking\u201d and \u201cliving\u201d is blurrier than a low-res Zoom background.<\/p>\n\n<p>Also, your back hurts. All the time.<\/p>\n\n\n\n\n<h2>\n  \n  \n  4. Deadlines, Deadlines, Deadlines\n<\/h2>\n\n<p>Agile? Scrum? Kanban? In 2025, we\u2019re running on \u201cPanic Driven Development.\u201d Your sprint board looks like a battlefield, and every ticket is labeled \u201curgent.\u201d<\/p>\n\n<p>The constant pressure makes you feel like a hamster running in circles, except the hamster also needs to know Docker, Kubernetes, and why the build keeps failing at 99%.<\/p>\n\n\n\n\n<h2>\n  \n  \n  5. The Sloth in the Room\n<\/h2>\n\n<p>You know what being a dev really feels like? A sloth trying to run a marathon.<\/p>\n\n<p>Sure, you <em>can<\/em> build cool things. But between endless meetings, broken dependencies, and AI hallucinations, you\u2019re moving at sloth speed while the world demands cheetah results.<\/p>\n\n<p>The irony? Management still says, \u201cJust automate it!\u201d as if automating your entire job is a weekend side project.<\/p>\n\n\n\n\n<h2>\n  \n  \n  6. The Stress Cocktail \ud83c\udf79\n<\/h2>\n\n<p>Being a developer in 2025 is exhausting because it\u2019s not just coding anymore. You\u2019re:<\/p>\n\n<ul>\n<li>A part-time AI babysitter<\/li>\n<li>A security specialist (\u201cWhy is Russia scanning our ports again?\u201d)<\/li>\n<li>A DevOps firefighter<\/li>\n<li>A therapist for your teammates (\u201cNo, Karen, it\u2019s not <em>your<\/em> fault the merge broke everything\u201d)<\/li>\n<\/ul>\n\n<p>And let\u2019s not forget: you\u2019re also supposed to \u201cinnovate\u201d and \u201cupskill\u201d in your \u201cfree time.\u201d Right after you finish crying into your keyboard.<\/p>\n\n\n\n\n<h2>\n  \n  \n  So\u2026 Why Do We Stay?\n<\/h2>\n\n<p>Here\u2019s the paradox: for all the frustration, developers keep showing up. Because in between the chaos, there\u2019s joy. Shipping a feature, fixing an impossible bug, seeing someone actually use your code\u2014that\u2019s the dopamine hit.<\/p>\n\n<p>It\u2019s like being in a toxic relationship, but every once in a while, the relationship buys you pizza.<\/p>\n\n\n\n\n<h3>\n  \n  \n  Final Thoughts\n<\/h3>\n\n<p>Being a software developer in 2025 is exhausting, frustrating, infuriating, and stressful. But it\u2019s also creative, rewarding, and oddly addictive.<\/p>\n\n<p>We\u2019re living in an era where machines write code, frameworks expire faster than milk, and you\u2019re expected to know <em>everything<\/em>. But at the end of the day, developers are still here, still building, still typing away like caffeinated poets of logic.<\/p>\n\n<p>And if you love building cool things, check out <a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">Codecrafters here<\/a> \u2014 one of the best ways to sharpen your dev chops by building real-world systems from scratch.<\/p>\n\n<p>So what\u2019s it like to be a software developer in 2025?<br>\nSimple: it\u2019s chaos with syntax highlighting.<\/p>\n\n","category":["webdev","programming","swe","developer"]},{"title":"Is Flutter Still Worth Learning in 2025? (A Deep Dive)","pubDate":"Thu, 28 Aug 2025 14:07:11 +0000","link":"https:\/\/dev.to\/pranta\/is-flutter-still-worth-learning-in-2025-a-deep-dive-1ppl","guid":"https:\/\/dev.to\/pranta\/is-flutter-still-worth-learning-in-2025-a-deep-dive-1ppl","description":"<p>Flutter has always sparked strong opinions in the dev community. Some swear by its speed and cross-platform magic, others dismiss it as a Google experiment that will eventually fade away. But here we are in <strong>2025<\/strong>, and the question is louder than ever:<\/p>\n\n<p>\ud83d\udc49 <strong>Is Flutter still worth learning in 2025?<\/strong><\/p>\n\n<p>I did some digging, went through recent updates, community trends, and job market stats. Let\u2019s break it all down.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\ude80 Flutter Is Still Actively Evolving\n<\/h2>\n\n<p>Flutter isn\u2019t some abandoned side project. In fact, it\u2019s still shipping <strong>major releases in 2025<\/strong>:<\/p>\n\n<ul>\n<li>\n<strong>3.29 (Feb 2025)<\/strong> \u2192 performance improvements and better tooling.<\/li>\n<li>\n<strong>3.32 (around Google I\/O)<\/strong> \u2192 Web improvements and Impeller renderer polish.<\/li>\n<li>\n<strong>3.35 (Aug 2025)<\/strong> \u2192 Hot reload for web finally became stable and buttery smooth.<\/li>\n<\/ul>\n\n<p>This shows Google is still pushing Flutter hard, with meaningful updates rather than small bug fixes.<\/p>\n\n<blockquote>\n<p>\ud83d\udccc TL;DR: Flutter is alive, well, and not slowing down.<\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  \ud83c\udfa8 The Impeller Era\n<\/h2>\n\n<p>One of Flutter\u2019s biggest headaches used to be shader jank. That\u2019s mostly gone now.<\/p>\n\n<ul>\n<li>\n<strong>Impeller<\/strong>, the new renderer, is now the <strong>default<\/strong> for iOS and most Android 10+ devices.<\/li>\n<li>It removes first-frame jank by precompiling shaders.<\/li>\n<li>There are still some edge cases (older GPUs, some emulators), but Impeller is the new standard.<\/li>\n<\/ul>\n\n<p>This is huge for devs who care about buttery-smooth UI.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83c\udf0d Community and Ecosystem\n<\/h2>\n\n<p>Let\u2019s talk numbers. According to the <strong>2025 Stack Overflow Developer Survey<\/strong>:<\/p>\n\n<ul>\n<li>\n<strong>Dart<\/strong> is used by ~<strong>5.9% of all developers<\/strong> and ~<strong>6.1% of professional devs<\/strong>.<\/li>\n<li>That\u2019s not massive like JavaScript or Python, but it\u2019s far from dead.<\/li>\n<\/ul>\n\n<p>Flutter also saw some <strong>community forks<\/strong>, like <strong>Flock<\/strong> (October 2024), which was born from governance concerns. But Flutter proper is still the mainline, with stronger momentum and backing.<\/p>\n\n<blockquote>\n<p>\ud83d\udccc TL;DR: Flutter isn\u2019t the most popular tool, but it has a strong, loyal community and continued corporate backing.<\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\udee0\ufe0f When Flutter <em>Shines<\/em>\n<\/h2>\n\n<p>Here\u2019s where Flutter really makes sense in 2025:<\/p>\n\n<ul>\n<li>\n<strong>Cross-platform, one codebase<\/strong> \u2192 Mobile, desktop, and now web (with stable hot reload!)<\/li>\n<li>\n<strong>Startup \/ small teams<\/strong> \u2192 You want speed-to-market over perfect platform fidelity.<\/li>\n<li>\n<strong>Design-heavy apps<\/strong> \u2192 Flutter gives pixel-level control. If you want to implement wild custom UIs, Flutter shines.<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  \u2696\ufe0f When Flutter <em>Isn\u2019t Ideal<\/em>\n<\/h2>\n\n<p>That said, Flutter isn\u2019t always the right tool.<\/p>\n\n<ul>\n<li>\n<strong>iOS-first, Apple ecosystem apps<\/strong> \u2192 SwiftUI is simply better aligned with Apple\u2019s UX and new APIs.<\/li>\n<li>\n<strong>Android-first apps with deep native integrations<\/strong> \u2192 Jetpack Compose + Kotlin is the way to go.<\/li>\n<li>\n<strong>Web-first products<\/strong> \u2192 React\/Next.js or React Native + Expo has stronger hiring pools and libraries.<\/li>\n<\/ul>\n\n<blockquote>\n<p>\ud83d\udccc TL;DR: Flutter is powerful, but it\u2019s not always the best hammer for every nail.<\/p>\n<\/blockquote>\n\n\n\n\n<h2>\n  \n  \n  \ud83c\udd9a The Alternatives\n<\/h2>\n\n<h3>\n  \n  \n  \ud83d\udd39 SwiftUI\n<\/h3>\n\n<ul>\n<li>Best for iOS-first apps.<\/li>\n<li>Tight integration with Apple\u2019s latest features (Widgets, Live Activities, Vision Pro).<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  \ud83d\udd39 Jetpack Compose + Kotlin\n<\/h3>\n\n<ul>\n<li>Best for Android-first.<\/li>\n<li>Combine with <strong>Kotlin Multiplatform (KMP)<\/strong> for shared business logic across platforms.<\/li>\n<li>KMP is officially stable and gaining momentum in 2025.<\/li>\n<\/ul>\n\n<h3>\n  \n  \n  \ud83d\udd39 React Native + Expo\n<\/h3>\n\n<ul>\n<li>Great if you already have React\/JS talent.<\/li>\n<li>Huge ecosystem, especially if your app has strong web presence.<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\udc68\u200d\ud83d\udcbb Should <em>You<\/em> Learn Flutter in 2025?\n<\/h2>\n\n<p>The short answer: <strong>Yes, but not exclusively.<\/strong><\/p>\n\n<p>If you\u2019re like me (a dev who loves to ship fast, experiment with design, and build cross-platform apps), Flutter is still <strong>super worth it<\/strong>. But you should also hedge your bets:<\/p>\n\n<ol>\n<li>\n<strong>Stay current with Flutter<\/strong> \u2192 Follow the latest releases (3.29 \u2192 3.32 \u2192 3.35) and learn Impeller inside out.<\/li>\n<li>\n<strong>Pick a native lane<\/strong> \u2192 Learn <strong>SwiftUI<\/strong> for iOS or <strong>Jetpack Compose<\/strong> for Android.<\/li>\n<li>\n<strong>Optional JS lane<\/strong> \u2192 A taste of React Native\/Expo can widen your job options.<\/li>\n<\/ol>\n\n<p>That combo makes you future-proof.<\/p>\n\n\n\n\n<h2>\n  \n  \n  \ud83d\udcca Quick Decision Cheat Sheet\n<\/h2>\n\n<ul>\n<li>\n<strong>Indie dev \/ startup \/ design-heavy app?<\/strong> \u2192 Flutter \u2705<\/li>\n<li>\n<strong>Enterprise Android-heavy?<\/strong> \u2192 Jetpack Compose \u2705<\/li>\n<li>\n<strong>Enterprise iOS-heavy?<\/strong> \u2192 SwiftUI \u2705<\/li>\n<li>\n<strong>Web-first product with mobile companion?<\/strong> \u2192 React Native\/Expo \u2705<\/li>\n<\/ul>\n\n\n\n\n<h2>\n  \n  \n  \ud83c\udfaf Final Thoughts\n<\/h2>\n\n<p>Flutter is <strong>not dead<\/strong> in 2025. It\u2019s evolving, with real improvements (Impeller, web hot reload, DevTools polish) and a dedicated community. But it\u2019s not the <em>only<\/em> tool you should rely on.<\/p>\n\n<p>If you\u2019re aiming for a strong career, learn Flutter <strong>and<\/strong> pick up at least one native option. That way you stay versatile, employable, and ready for whatever the industry throws next.<\/p>\n\n<p>And if you love building cool things, check out <a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">Codecrafters here<\/a> \u2014 one of the best ways to sharpen your dev chops by building real-world systems from scratch.<\/p>\n\n\n\n\n<p>\ud83d\udcac What do you think? Are you still betting on Flutter in 2025, or are you moving on to SwiftUI\/Compose\/React Native?<\/p>\n\n","category":["flutter2025","flutter","crossplatform","mobiledevelopment"]},{"title":"Why Every Tech Problem Feels Like Fighting a Final Boss","pubDate":"Tue, 19 Aug 2025 16:06:09 +0000","link":"https:\/\/dev.to\/pranta\/why-every-tech-problem-feels-like-fighting-a-final-boss-25dj","guid":"https:\/\/dev.to\/pranta\/why-every-tech-problem-feels-like-fighting-a-final-boss-25dj","description":"<p>You know that feeling when you boot up your IDE, take a deep breath, and say <em>\u201cToday I will be productive\u201d<\/em>? Yeah, 20 minutes later you\u2019re Googling <em>\u201cflutter build error exit code 1 but only on Tuesdays\u201d<\/em> and questioning every decision that led you here.<\/p>\n\n<p>Tech is wild, man. It\u2019s the only field where:<\/p>\n\n<ul>\n<li>You can write two lines of code and break the entire internet.<\/li>\n<li>You can write 200 lines of code and\u2026 nothing happens. No errors. No output. Just silence. Like your program ghosted you.<\/li>\n<li>You can install <strong>Node.js<\/strong> and suddenly your computer has more versions of Node than you have socks.<\/li>\n<\/ul>\n\n<p>Let\u2019s talk about why solving tech problems is like fighting video game bosses.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Stage 1: The Tutorial Boss (a.k.a. \u201cHello, World!\u201d)\n<\/h2>\n\n<p>Every programmer remembers their first \u201cHello, World!\u201d moment. It\u2019s like the tutorial boss in a game: designed to make you feel powerful.<\/p>\n\n<p>\u201cWow, I typed this magic incantation, pressed run, and words appeared on my screen! I\u2019m basically a wizard.\u201d<\/p>\n\n<p>Fast forward three weeks: you\u2019re debugging a <strong>segmentation fault<\/strong> in C and wondering why your array index decided to visit memory addresses that belong to Microsoft Excel.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Stage 2: The Mid-Game Boss (Stack Overflow Rabbit Hole)\n<\/h2>\n\n<p>At some point, every dev encounters their <strong>mid-game boss<\/strong>: the cryptic error message.<\/p>\n\n<p>You know the type:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>Unhandled exception at 0x00007FF: Access violation reading location 0xFFFFFFFFFFFFFFFF\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>What does this mean? Who knows. Probably ancient Sumerian.<\/p>\n\n<p>So you Google it, land on Stack Overflow, and find an answer from <strong>2012<\/strong>. The guy who wrote it starts with: <em>\u201cThis might not be best practice but it worked for me.\u201d<\/em><br>\nThat\u2019s your sword now. You copy-paste it like it\u2019s Excalibur, pray to the compiler gods, and\u2014boom\u2014it compiles. But now your app only works if you run it while standing on one leg and chanting <em>\u201cnpm install\u201d<\/em> three times.<\/p>\n\n\n<h2>\n  \n  \n  Stage 3: The Hidden Boss (DevOps)\n<\/h2>\n\n<p>You thought you were just a developer? Cute. Now you\u2019re deploying.<\/p>\n\n<p>Suddenly you\u2019re knee-deep in Dockerfiles, YAML configs, and a mysterious error that says:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>Container exited with code 137\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>What does 137 mean? Nobody knows. Even Google shrugs. All you know is: \u201cit works on my machine.\u201d But guess what? The cloud doesn\u2019t care about your machine. The cloud is the final boss.<\/p>\n\n<p>Deploying to production is like fighting Sephiroth in Final Fantasy\u2014long, painful, and just when you think it\u2019s over, there\u2019s another phase.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Stage 4: The Secret Boss (Users)\n<\/h2>\n\n<p>The hardest boss in tech isn\u2019t the compiler, the runtime, or even AWS pricing. It\u2019s <strong>users<\/strong>.<\/p>\n\n<ul>\n<li>You design a beautiful UI. They say, <em>\u201cCan you make the button bigger?\u201d<\/em>\n<\/li>\n<li>You make the button bigger. They say, <em>\u201cNow it\u2019s too big.\u201d<\/em>\n<\/li>\n<li>You fix it. They say, <em>\u201cActually, we liked the old one better.\u201d<\/em>\n<\/li>\n<\/ul>\n\n<p>Users are like those Nintendo bosses that look weak but actually have 99 hidden attack combos. You think you won\u2026 then they email support saying <em>\u201cthe app is broken\u201d<\/em> with <strong>zero context<\/strong>.<\/p>\n\n\n\n\n<h2>\n  \n  \n  The Plot Twist\n<\/h2>\n\n<p>Here\u2019s the thing: as frustrating as it is, we love it. Every bug fixed, every system deployed, every UI polished\u2014it\u2019s like leveling up in a game. That dopamine hit is real.<\/p>\n\n<p>Yeah, sometimes your laptop sounds like it\u2019s about to take off because Chrome has 47 tabs open. Yeah, sometimes you realize you spent 3 hours fixing a bug caused by a <strong>missing semicolon<\/strong>. But hey, that\u2019s the grind.<\/p>\n\n<p>We\u2019re all just players in this massive open-world game called <strong>Tech<\/strong>. The bosses are tough, the loot drops are rare (looking at you, junior dev salaries \ud83d\udc40), but the community is great.<\/p>\n\n<p>And unlike most games, you never really \u201cfinish\u201d it. There\u2019s always a new level, a new bug, a new boss waiting to be defeated.<\/p>\n\n\n\n\n<h2>\n  \n  \n  Epilogue: Git is the True Final Boss\n<\/h2>\n\n<p>Let\u2019s be honest. All of this pales in comparison to the ultimate boss: <strong>Git<\/strong>.<\/p>\n\n<ul>\n<li>You try to <code>git push<\/code> and Git\u2019s like, <em>\u201cActually, you\u2019re 142 commits behind.\u201d<\/em>\n<\/li>\n<li>You try to merge, and suddenly your codebase looks like it\u2019s been through a blender.<\/li>\n<li>You see a message like <em>\u201cdetached HEAD state\u201d<\/em> and think, \u201cCool, I didn\u2019t need my sanity anyway.\u201d<\/li>\n<\/ul>\n\n<p>But hey\u2026 when you finally win the fight and see that sweet green checkmark on your pull request\u2014it\u2019s worth it.<\/p>\n\n\n\n\n<p>\ud83d\udc7e So yeah, tech problems = boss fights. Some easy, some rage-quit level. But in the end, we keep playing. Because deep down, we\u2019re all just gamers who swapped controllers for keyboards.<\/p>\n\n<p><a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">Check out Codecrafters and level up IRL \u2192 here<\/a><\/p>\n\n","category":["programminghumor","developerlife","codingstruggles","techsatire"]},{"title":"You Can Build Whatever You Want With AI These Days, But\u2026 It\u2019s Not Fun Anymore","pubDate":"Sat, 09 Aug 2025 19:33:04 +0000","link":"https:\/\/dev.to\/pranta\/you-can-build-whatever-you-want-with-ai-these-days-but-its-not-fun-anymore-1b2o","guid":"https:\/\/dev.to\/pranta\/you-can-build-whatever-you-want-with-ai-these-days-but-its-not-fun-anymore-1b2o","description":"<p>We are living in what I like to call <em>The Golden Age of Instant Gratification for Developers\u2122<\/em>.<\/p>\n\n<p>Want to build a web app? Done.<br>\nWant it to have a machine-learning-powered recommendation system? Easy.<br>\nWant it to look like it was designed by a Silicon Valley design team that charges \\$800\/hour? That\u2019s just one prompt away.<\/p>\n\n<p><strong>AI has essentially turned us all into Tony Stark.<\/strong> Except instead of Jarvis being a sarcastic British guy in our ear, he\u2019s a chatbox that occasionally \u201challucinates\u201d and confidently gives you wrong answers\u2014but you still trust him because\u2026 he <em>sounds<\/em> right.<\/p>\n\n<p>And listen, don\u2019t get me wrong, I\u2019m not saying AI is bad. I love AI. I use it daily. But somewhere along the way, it started to feel like\u2026 the fun was gone.<\/p>\n\n\n\n\n<h3>\n  \n  \n  Remember the old days?\n<\/h3>\n\n<p>If you\u2019re a dev who\u2019s been around for a while, you probably remember this:<\/p>\n\n<ul>\n<li>You have an idea.<\/li>\n<li>You\u2019re excited.<\/li>\n<li>You open your code editor and immediately realize you have no clue how to do half of what\u2019s in your head.<\/li>\n<li>You start Googling.<\/li>\n<li>You find a Stack Overflow answer from 2012 that doesn\u2019t work anymore but you still try it anyway.<\/li>\n<li>You spend <strong>hours<\/strong> debugging something trivial.<\/li>\n<li>You fix it. You feel like a god.<\/li>\n<\/ul>\n\n<p>That feeling\u2014that pure, uncut satisfaction\u2014was the reason you kept building stuff. You <em>earned<\/em> the result.<\/p>\n\n\n\n\n<h3>\n  \n  \n  The AI era feels\u2026 different.\n<\/h3>\n\n<p>Now? You type:<\/p>\n\n<blockquote>\n<p>\u201cHey AI, build me a React app with authentication, a backend, a database, and a cute little dark mode toggle.\u201d<\/p>\n<\/blockquote>\n\n<p>You wait 30 seconds, sip your coffee, and\u2026 there it is. You didn\u2019t fight for it. You didn\u2019t suffer. You didn\u2019t even get to yell \u201cWHY IS THIS NOT WORKING?!\u201d at 2 AM.<\/p>\n\n<p>And without the struggle, the victory feels hollow.<\/p>\n\n<p>It\u2019s like playing a video game with infinite ammo and god mode\u2014you technically \u201cwon,\u201d but deep down you know you didn\u2019t <em>earn<\/em> it.<\/p>\n\n\n\n\n<h3>\n  \n  \n  Why is this happening?\n<\/h3>\n\n<p>It\u2019s simple: <strong>we humans love the <em>process<\/em> more than the product<\/strong> when it comes to creativity and problem-solving.<\/p>\n\n<p>When you hit a problem and solve it yourself, you get a dopamine rush. You feel ownership. You remember the exact line of code you wrote to fix that bug because it was your blood, sweat, and tears that made it work.<\/p>\n\n<p>AI shortcuts remove that emotional investment. You still get the product, but you lose the <em>story<\/em> behind it. And without the story\u2026 it\u2019s just code.<\/p>\n\n\n\n\n<h3>\n  \n  \n  So, what now?\n<\/h3>\n\n<p>I\u2019m not saying throw away AI tools and go live in a cave writing assembly code on stone tablets. AI is amazing for speeding up boring stuff, and it can absolutely help you learn faster.<\/p>\n\n<p>But maybe\u2014just maybe\u2014don\u2019t use it for <em>everything<\/em>.<br>\nStruggle a little. Get stuck. Fail a few times. Write code that doesn\u2019t work and <strong>then<\/strong> fix it. Because that\u2019s where the fun lives.<\/p>\n\n<p>If you miss that old-school, \u201cI actually built this\u201d feeling, check out <a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">Codecrafters<\/a>. They throw you into coding challenges where AI can\u2019t just spoon-feed you the solution. You\u2019ll <em>have<\/em> to think, and when you win, you\u2019ll feel that glorious dopamine hit again.<\/p>\n\n<p>You can sign up right <a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n\n\n\n\n<p>If AI is the fast food of coding, Codecrafters is like cooking your own meal from scratch\u2014harder, but infinitely more satisfying.<\/p>\n\n","category":["ai","programming","developers","productivity"]},{"title":"How I Almost Went Bananas with Recursion\u2014And Finally Got It","pubDate":"Wed, 06 Aug 2025 17:17:39 +0000","link":"https:\/\/dev.to\/pranta\/how-i-almost-went-bananas-with-recursion-and-finally-got-it-4aa9","guid":"https:\/\/dev.to\/pranta\/how-i-almost-went-bananas-with-recursion-and-finally-got-it-4aa9","description":"<h3>\n  \n  \n  Chapter 1: Meet the Banana-powered Brain\n<\/h3>\n\n<p>I was wrestling with this adventurous, tree-like data structure:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"kt\">var<\/span> <span class=\"n\">root<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">TreeNode<\/span><span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nf\">TreeNode<\/span><span class=\"p\">(<\/span><span class=\"m\">2<\/span><span class=\"p\">,<\/span>\n        <span class=\"k\">new<\/span> <span class=\"nf\">TreeNode<\/span><span class=\"p\">(<\/span><span class=\"m\">3<\/span><span class=\"p\">),<\/span>\n        <span class=\"k\">new<\/span> <span class=\"nf\">TreeNode<\/span><span class=\"p\">(<\/span><span class=\"m\">4<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">),<\/span>\n    <span class=\"k\">new<\/span> <span class=\"nf\">TreeNode<\/span><span class=\"p\">(<\/span><span class=\"m\">5<\/span><span class=\"p\">,<\/span> <span class=\"k\">null<\/span><span class=\"p\">,<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">TreeNode<\/span><span class=\"p\">(<\/span><span class=\"m\">8<\/span><span class=\"p\">))<\/span>\n<span class=\"p\">);<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>And I was trying to do an <strong>in-order traversal<\/strong>. You remember in-order, right? Left subtree \u2192 Node \u2192 Right subtree. So for the example tree:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>    1\n   \/ \\\n  2   5\n \/ \\   \\\n3   4   8\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>It should visit nodes in this order: <code>[3, 2, 4, 1, 5, 8]<\/code>.<\/p>\n\n\n\n\n<h3>\n  \n  \n  Chapter 2: The Forsaken <code>while (true)<\/code> Code\n<\/h3>\n\n<p>I built this monster of a Traverse function:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">void<\/span> <span class=\"nf\">Traverse<\/span><span class=\"p\">(<\/span><span class=\"n\">TreeNode<\/span> <span class=\"n\">node<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"k\">true<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">node<\/span> <span class=\"p\">==<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n        <span class=\"nf\">Traverse<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">.<\/span><span class=\"n\">left<\/span><span class=\"p\">);<\/span>\n        <span class=\"n\">result<\/span><span class=\"p\">.<\/span><span class=\"nf\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">.<\/span><span class=\"n\">val<\/span><span class=\"p\">);<\/span>\n        <span class=\"n\">node<\/span> <span class=\"p\">=<\/span> <span class=\"n\">node<\/span><span class=\"p\">.<\/span><span class=\"n\">right<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>It <strong>looked kinda right<\/strong>\u2014we go left, then record, then \u201cswing right and loop forever.\u201d<br>\nBut in reality, this crushed the recursion flow. It never properly <em>returned<\/em> to earlier calls\u2014it basically hacked the brain messenger system.<\/p>\n\n\n<h3>\n  \n  \n  Chapter 3: Why It Didn\u2019t Click (AKA Monkey Brain, Cholesterol Edition)\n<\/h3>\n\n<p>Here\u2019s the meme of my thought process:<\/p>\n\n<ul>\n<li>\ud83e\udde0 \u201cOkay OK, I know recursion in theory.\u201d<\/li>\n<li>\ud83d\udc12 \u201cMy brain\u2019s like bananas + glue when I haven\u2019t used it lately.\u201d<\/li>\n<li>\ud83c\udf00 \u201cOh man, I forgot call stack is like a stack of sticky notes I\u2019ve gotta peel off!\u201d<\/li>\n<li>\ud83d\ude35\u200d\ud83d\udcab \u201cThis code isn\u2019t unwinding properly\u2014why does it never finish??\u201d<\/li>\n<\/ul>\n\n<p>So I watched a YouTube video, saw the call stack diagrams, and <em>finally<\/em> it resonated. I realized the function needed to:<\/p>\n\n<ol>\n<li>Recurse left<\/li>\n<li>Add current<\/li>\n<li>Recurse right\n\u2026with <em>each<\/em> call finishing cleanly\u2014not looping inside one frame.<\/li>\n<\/ol>\n\n\n<h3>\n  \n  \n  Chapter 4: The Clean, Proper Solution\n<\/h3>\n\n<p>Here\u2019s the version that actually slaps:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">public<\/span> <span class=\"k\">static<\/span> <span class=\"n\">IList<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;<\/span> <span class=\"nf\">InorderTraversal<\/span><span class=\"p\">(<\/span><span class=\"n\">TreeNode<\/span> <span class=\"n\">root<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"kt\">var<\/span> <span class=\"n\">result<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">List<\/span><span class=\"p\">&lt;<\/span><span class=\"kt\">int<\/span><span class=\"p\">&gt;();<\/span>\n\n    <span class=\"k\">void<\/span> <span class=\"nf\">Traverse<\/span><span class=\"p\">(<\/span><span class=\"n\">TreeNode<\/span><span class=\"p\">?<\/span> <span class=\"n\">node<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">node<\/span> <span class=\"p\">==<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n        <span class=\"nf\">Traverse<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">.<\/span><span class=\"n\">left<\/span><span class=\"p\">);<\/span>\n        <span class=\"n\">result<\/span><span class=\"p\">.<\/span><span class=\"nf\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">.<\/span><span class=\"n\">val<\/span><span class=\"p\">);<\/span>\n        <span class=\"nf\">Traverse<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">.<\/span><span class=\"n\">right<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nf\">Traverse<\/span><span class=\"p\">(<\/span><span class=\"n\">root<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">result<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>This exactly mirrors the in-order logic \u201cgo left \u2192 visit \u2192 go right,\u201d and cleverly allows each call frame to fully complete before returning upwards. No weird loops, no internal mutation messing up control flow.<\/p>\n\n\n\n\n<h3>\n  \n  \n  Chapter 5: How to Know When Recursion Isn\u2019t <em>Your<\/em> Enemy\n<\/h3>\n\n<p>Recursion only feels scary when it\u2019s invisible. The moment you visualize:<\/p>\n\n<ul>\n<li>\u201cCall Traverse(1)\u201d<\/li>\n<li>\u2192 push Traverse(1.left)<\/li>\n<li>\u2192 keep pushing until you hit <code>null<\/code>\n<\/li>\n<li>\u2192 pop stack and record values<\/li>\n<li>\u2192 pop back and go right...<\/li>\n<\/ul>\n\n<p>you realize it\u2019s <em>just<\/em> a controlled, disciplined flow. Not some magic black box.<\/p>\n\n\n\n\n<h3>\n  \n  \n  Chapter 6: Your Brain Is Fine\u2014You're Learning\n<\/h3>\n\n<p>A few truths:<\/p>\n\n<ul>\n<li>\n<em>Everyone<\/em> nukes recursion logic sometimes. Hell, senior devs draw diagrams.<\/li>\n<li>\n<em>Understanding<\/em> recursion is about trusting the function will return\u2014with stack frames doing the return work.<\/li>\n<li>\n<em>Spaces between practice<\/em> make it feel weird\u2014but once you see the pattern again, it snaps into place.<\/li>\n<\/ul>\n\n<p>You're simply walking rambunctiously toward mastery, my friend.<\/p>\n\n\n\n\n<h3>\n  \n  \n  TL;DR\n<\/h3>\n\n<ul>\n<li>Problem: <code>while(true)<\/code> + <code>node = node.right<\/code> inside recursion broke in-order logic.<\/li>\n<li>Solution: Clean recursion with:\n<\/li>\n<\/ul>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code>  <span class=\"nf\">Traverse<\/span><span class=\"p\">(<\/span><span class=\"n\">left<\/span><span class=\"p\">);<\/span>\n  <span class=\"n\">Add<\/span> <span class=\"n\">current<\/span><span class=\"p\">;<\/span>\n  <span class=\"nf\">Traverse<\/span><span class=\"p\">(<\/span><span class=\"n\">right<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<ul>\n<li>Realization came when call stack clicked: each function is a sticky-note frame that must fully unwind.<\/li>\n<\/ul>\n\n\n\n\n<h3>\n  \n  \n  Bonus: Your Codecrafters Plug \ud83e\uddea\n<\/h3>\n\n<p>Thanks for pointing out this URL\u2014super helpful if anyone reading this wants hands\u2011on practice:<\/p>\n\n<p><a href=\"https:\/\/app.codecrafters.io\/join?via=theprantadutta\" rel=\"noopener noreferrer\">Join Codecrafters via this link<\/a><\/p>\n\n","category":["csharp","recursion","beginners","programming"]}]}}