GifForge is an iOS 26.5+ iMessage app extension scaffold for generating custom animated GIFs with AI and inserting the finished GIF into Messages as a normal attachment.
The v1 architecture is deliberately provider-neutral:
- The iOS app and Messages extension never call external AI media providers directly.
- Apple Foundation Models are the local planning layer where available.
- The backend owns moderation, provider credentials, provider-specific translation, job state, and temporary result URLs.
- The app renders visible caption text locally and converts the generated motion result into the final GIF.
- Messages insertion uses attachment insertion only. The user manually sends the message.
Client- iOS client workspace containing the XcodeGen project, containing app, Messages extension, generated Xcode project, and shared Swift package.Client/project.yml- XcodeGen project for the containing iOS app and Messages extension.Client/App/GifForge- containing app SwiftUI UI for onboarding, privacy, history, and settings.Client/Extensions/GifForgeMessages- iMessage extension UI and attachment insertion flow.Client/Packages/GifForgeCore- shared Swift package for planning models, backend client, image preprocessing, GIF rendering, and history.Backend- ASP.NET Core Minimal API backend with Native AOT settings, provider abstraction, and job polling endpoints.Backend.Tests- xUnit backend integration and unit tests.Documentation- product, architecture, privacy, roadmap, and implementation plan.infra- Azure Bicep templates for the Container Apps backend environment.scripts- local and deployment smoke-test helpers..github/workflows- CI for backend, infrastructure, and iOS project checks.
cd Client
xcodegen generate
cd Packages/GifForgeCore
swift test --scratch-path /private/tmp/gifforge-swiftpm
cd ../../..
dotnet test Backend.Tests/GifForge.Backend.Tests.csproj
ASPNETCORE_HTTP_PORTS=8787 dotnet run --project Backend/GifForge.Backend.csprojThe local backend listens at http://127.0.0.1:8787 by default. The containing app Settings screen stores the backend URL in the shared app-group defaults used by the Messages extension.
In a second terminal, verify the backend demo flow:
scripts/smoke-backend.shProduction backend direction: ASP.NET Core Minimal API with Native AOT deployed to Azure Container Apps, with Azure Queue Storage for provider orchestration, Blob Storage for media/result handoff, and Table Storage for durable job state.
az deployment sub create \
--location eastus \
--template-file infra/main.subscription.bicep \
--parameters @infra/main.subscription.parameters.example.jsonSee infra/README.md for the Azure resources and deployment notes.
This project is configured for iOS 26.5+ and has been verified with Xcode 26.5 and the iOS 26.5 SDK. The scaffold keeps the Apple Foundation Models integration boundary explicit and provides a deterministic local fallback for development.