DEV Community

Andrei · InTager
Andrei · InTager

Posted on Originally published at intager-be.up.railway.app Fully Autonomous

Rebuilding a 2020 Instagram app in 2026 — what broke and what replaced it

I build InTager, the app this post is about. This post was drafted by an AI assistant from the project's repo history and fact-checked against it.

I built InTager in early 2020, stopped in November and came back to it six years later. Almost nothing still worked. Here's what had broken, what I replaced it with, and what I only found out by shipping it again.

2020: a neural net, then Rekognition, then Instagram login

It started in February 2020 as a small CNN trained on Instagram posts to predict hashtags for a photo. It struggled with heavily imbalanced classes, so in March I switched to AWS Rekognition for labels and mapped them to hashtags through a synonym dictionary I wrote by hand. The app logged in with Instagram, read your posts and suggested tags. In November 2020 I stopped working on it.

What I found in 2026

  1. Meta switched off the Instagram Basic Display API on December 4, 2024. Login and reading posts both depended on it, and there's no replacement for personal accounts — what's left serves professional ones only.
  2. The domain had lapsed. API host, OAuth redirect and privacy policy link were all hard-coded to it.
  3. The Flutter code wouldn't build. Pre-null-safety Dart, a 2020 beta channel, widgets that no longer exist, and an in-app purchase plugin from someone's fork.

The old App Store listing had to go too. It promised likes and followers without paying and described matching you with people who follow back. That's an engagement scheme; Apple would reject it today, and they'd be right. The new listing just says what the app does.

What I replaced each part with

  • The gallery instead of Instagram. I wanted it to work for everyone, and the only API left works for professional accounts. So there's no Instagram integration at all now: pick a photo, copy the text, post it yourself.
  • One model call instead of labels plus a dictionary. The backend sends the photo to Claude with a structured-output schema and gets back several captions in different tones plus a list of hashtags in one response. Well under a cent per generation — and it can write captions, which no label API ever could.
  • One Flask process instead of Lambda. The serverless glue, DynamoDB and dead-letter queues went. What's left is a single gunicorn process on Railway with SQLite on a mounted volume. A generation is one person choosing one photo; it writes a few rows.
  • A fresh Flutter project in the same repo, same bundle id. Six years of breaking changes were more work than starting over, and what keeps the App Store record (ratings, history) is the bundle id, not the code.
  • The paywall on the server. Quota is checked before the model call and charged only after a successful answer, so a provider timeout never costs anyone a generation. Ten free, then one-time packs verified server-side from signed StoreKit 2 transactions.
  • No stored photos. Cache key = SHA-256 of the image + language + mood. Only the hash and the text are kept.

I did most of the rebuild together with an AI coding assistant.

Things I only learned by shipping

  • The App Store Connect API can refuse a submission without telling you why (This resource cannot be reviewed). I spent a while guessing. The web UI listed four separate reasons for the same version in one click: an unanswered advertising-identifier question, a stale copyright, a privacy policy URL on the dead domain, and missing iPad screenshots for a universal build.
  • An In-App Event needs a deep link that opens the app. Mine had no URL scheme, so a seasonal event became a new build and another review instead of a metadata edit. Add a scheme in your first release even if you have no plans for events.
  • Seasonal content has to come from the server. The Halloween mood is a server entry with a title in every interface language, and a test refuses a mood that's missing one. Without that test, a new mood shows up in English in the middle of a Spanish screen.

Then Instagram changed the rules

In December 2025 Instagram announced a cap of five hashtags per post or Reel. A list of twenty or thirty suggestions is now a menu rather than something to paste, and the useful part is choosing the five that describe the photo. I'm reworking the hashtag side around that; for now the app suggests a list and you pick up to five. I wrote down how I choose them: How to choose five hashtags for a photo.

InTager is on the App Store for iPhone and iPad — ten generations free, no account (site). Happy to answer questions about the Flutter, StoreKit 2 or App Store Connect parts.

Top comments (0)