top of page
Banner Apps.jpg

HashtagGenerator

SwiftUI app that generates hashtags from text or images using a credit-based IAP model.

Links

Quick facts

• Role: iOS developer (end-to-end delivery from Figma to buildable project)
• Timeframe: Short client engagement + post-delivery fixes
• Platform: iOS 17+, iPhone-only (SwiftUI)
• Status: Delivered (project handed off as Xcode zip; not published)
• Team: 1

Summary

HashtagGenerator is an iPhone app that generates hashtags via an existing backend API. The app focuses on fast input (keyword or image), clean results selection/copy, history, and a local credit wallet with in-app purchases. I delivered a buildable Xcode project and handled follow-up changes and bug fixes.
Key highlights:
• API-driven hashtag generation (no on-device ML) for text and images
• Credit wallet persisted in Keychain; StoreKit 2 purchases add credit packs
• SwiftUI app with clear layering, event-driven updates, and SwiftData history

Problem

• Backend owned hashtag generation, so the client app needed to be reliable, lightweight, and UI-first.
• Credits had to be stored locally (no backend ledger) and survive typical reinstalls.
• IAP needed realistic pricing in production, but testable flows in the simulator.

Solution

I implemented two generation flows hitting a single endpoint: text tags and image tags (base64). Results are shown in a selectable grid with copy actions, and each generation is saved to history. Credits gate generation and are refilled via IAP, with a starter credit grant on first launch.

Architecture

• Layered SwiftUI codebase: Features (UI) / Domain (use cases) / Data (repos, StoreKit, HTTP) / Shared (design system)
• AppContainer composition root wiring SwiftData, Keychain storage, HTTP client, and event bus
• Router for navigation, sheets, and full-screen flows
• Use cases: GenerateHashtags, FetchCredits, BuyCredits, History read/write
• Networking with RequestBuilder + middleware chain (extra headers + structured network logger)
• SwiftData History model with transactional saves via TransactionRunner + SaveNotifier
• StoreKit 2 purchase flow + transaction updates listener to reconcile async purchases

Hard problems solved

• Implemented local-credit economics that persists via Keychain across restarts and typical reinstall scenarios (with clear limitations)
• Built a testable IAP pipeline: live StoreKit product pricing on device, StoreKit config scaffolding for simulator testing
• Kept the API contract strict: sanitized keyword inputs, compressed + base64 image payloads, and typed request bodies per req_type
• Prevented UI drift from Figma by standardizing sheets/menus using native iOS components and a small design system
• Ensured credit accounting stays consistent across explicit purchases and StoreKit transaction updates
• Reproduced and fixed a camera/photo-picker regression (both actions opening the gallery) by replacing the photo input component

Impact / Results

• Delivered the requested app as a buildable Xcode project aligned with provided Figma screens
• Added post-delivery changes (starter credits, UX improvements) and provided targeted patch fixes quickly
• Left a maintainable foundation for future auth or backend-led credit tracking if needed

Tech stack

• iOS: Swift, SwiftUI, StoreKit 2, SwiftData, Keychain
• Architecture: Layered Features/Domain/Data, use cases + repositories, Router navigation, event bus
• Backend/Infra: REST API (image/text generation), base64 image upload
• Tooling: Xcode, StoreKit Configuration (simulator), network middleware + structured logging

bottom of page