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.
I started InTager in February 2020 as a small convolutional network trained on Instagram posts to predict hashtags for a photo. It struggled with heavily imbalanced classes, so in March I switched to sending the photo to AWS Rekognition for labels and mapping those labels to hashtags through a synonym dictionary I wrote by hand. The app logged in with Instagram, read your posts and suggested tags for them. In November 2020 I stopped working on it.
Three things had broken on their own while I wasn't looking.
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.
The gallery instead of Instagram. I wanted the app to work for everyone, and the only API left works for professional accounts only. So there's no Instagram integration at all now: you pick a photo, copy the text and 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 and a list of hashtags in one response. It costs 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 process under gunicorn 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 repository, with the 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. The quota is checked before the model is called and charged only after a successful answer, so a provider timeout never costs anyone a generation. Ten are free; after that, one-time packs, verified on the server from signed StoreKit 2 transactions.
No stored photos. The cache key is the SHA-256 of the image plus the language and the mood. Only the hash and the generated text are kept.
I did most of the rebuild together with an AI coding assistant.
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 of the app around that; for now it suggests a list and you pick up to five. I wrote down how I choose them in How to choose five hashtags for a photo.
InTager is on the App Store for iPhone and iPad. Pick a photo and it writes a few captions and a list of hashtags for it, in 17 languages. Ten generations are free, no account, then one-time packs.
iPhone and iPad · ten generations free · no account · no subscription
The backend sends the photo to an Anthropic Claude model and asks for captions and hashtags in one structured response.
No. Only a SHA-256 hash of the image and the generated text are stored, so the same photo is not paid for twice.
Meta switched off the Instagram Basic Display API on December 4, 2024, and the remaining API works only with professional accounts. InTager works from your gallery instead, for every account.