Skip to main content

Feature Catalog

Comprehensive inventory of all features implemented in the Frameingo photobooth system.

Table of Contents


User-Facing Features (Web App)

Core Photobooth Workflow

StepRouteFeatureDescription
1/Home ScreenLanding page with session start button
2/frame-selectionFrame SelectionChoose from preset photo frame layouts (1-4 photos)
3/image-selectionImage SelectionChoose between camera capture or gallery upload
4/image-uploadImage UploadCapture via camera or select from gallery
5/image-editingImage EditingDrag-and-drop reordering, retake photos, brightness adjustment
6/customizationCustomizationAdmin settings for frame, text, colors, buttons, printer, voucher
7/image-finalFinal PreviewView collaged result, print, download QR
8/offlineOffline PageDisplayed when network unavailable

Code Reference: apps/web/routes/ and apps/web/pages/

Advanced Features

FeatureDescriptionCode Reference
Visual Frame EditorCustomize frames with layers, text, bordersfeatures/customization/editor/
Frame PresetsSave/load frame customization presets (stored in IndexedDB/localStorage)lib/frame-presets.ts
Page PresetsSave/load full page settings presetslib/page-presets.ts
Customization PresetsSave/load complete customization settingslib/customization-presets.ts
Image CompressionAuto-compress images before printing (max 800x800, 500KB)lib/image-compression.ts
Dithering FilterAtkinson dithering for thermal printer outputdomain/image-processing/dithering.ts
QR Code GenerationGenerate download QR codes (server-side rendering)services/api/sharing/controller.ts
Photo DownloadSigned URLs with expiry for secure photo downloadservices/api/sharing/download-signing.ts
Offline ModePWA with service worker, offline pagepublic/sw.js, routes/offline.tsx
Auto-PrintAutomatically print when reaching final screen (if enabled)providers/printer-provider.tsx
Brightness AdjustmentSlider to adjust image brightness before printingfeatures/image-editing/

Settings & Configuration

FeatureDescriptionCode Reference
Page SettingsBackground, title, subtitle customizationproviders/settings-provider.tsx
Frame SettingsHeader/footer text, border, backgroundfeatures/customization/
Button SettingsButton text, colors, font size, border radiusfeatures/customization/
Printer SettingsEnable/disable, default copies, paper sizehooks/use-printer-settings.ts
Voucher SettingsEnable/disable, passcode configurationproviders/voucher-provider.tsx
Security SettingsAdmin PIN change, lock icon visibilityhooks/use-security-settings.ts
Language Settingsi18n/locale configurationproviders/language-provider.tsx

Providers (State Management)

ProviderPurposeFile
PrinterProviderBluetooth/ESCPOS printingproviders/printer-provider.tsx
LicenseProviderLicense key verificationproviders/license-provider.tsx
VoucherProviderQR voucher passcode verificationproviders/voucher-provider.tsx
LanguageProviderInternationalizationproviders/language-provider.tsx
SettingsProviderApp preferences persistenceproviders/settings-provider.tsx
CollageProviderFrame/image state, final image generationproviders/collage-provider.tsx

Admin Panel Features

Customer Management

FeatureDescriptionAPI Endpoint
View all customersList paginated customer accountsGET /v1/admin/customers
Customer detailsView individual customer infoGET /v1/admin/customers/:id
License regenerationGenerate new license key for customerPOST /v1/admin/customers/:customerId/regenerate-license

Code Reference: services/api/admin/controller.ts - createAdminCustomersController()

Subscription Management

FeatureDescriptionAPI Endpoint
View all subscriptionsList all subscriptions with customer infoGET /v1/admin/subscriptions
Subscription detailsView individual subscriptionGET /v1/admin/subscriptions/:id
Cancel subscriptionCancel active subscription(via customer-facing endpoint)
Resume subscriptionResume paused subscription(via customer-facing endpoint)

Code Reference: services/api/admin/controller.ts - createAdminSubscriptionsController()

Payment History

FeatureDescriptionAPI Endpoint
View all paymentsList all payments with customer infoGET /v1/admin/payments
Payment detailsView individual paymentGET /v1/admin/payments/:id
Process refundRefund a paymentPOST /v1/payments/:id/refund

Code Reference: services/api/admin/controller.ts - createAdminPaymentsController()


Backend API Features

Base URL Structure

  • Local development: http://localhost:8787
  • Staging: Cloudflare Workers endpoint
  • All v1 endpoints prefixed with /api/v1

Payments (Xendit Integration)

MethodEndpointFunctionDescription
POST/v1/payments/createCreate paymentCreate Xendit QRIS payment
GET/v1/payments/status/:idGet payment statusPoll for payment completion
POST/v1/payments/webhookHandle webhookXendit payment confirmation
POST/v1/payments/subscription-webhookSubscription webhookHandle subscription events
POST/v1/payments/:id/refundRefund paymentProcess refund via Xendit

Code Reference: services/api/payments/

Subscriptions

MethodEndpointFunctionDescription
GET/v1/subscriptions/:idGet subscriptionGet subscription details
GET/v1/subscriptions/customer/:idCustomer subscriptionsList customer's subscriptions
POST/v1/subscriptions/:id/cancelCancelCancel subscription
POST/v1/subscriptions/:id/resumeResumeResume paused subscription
POST/v1/subscriptions/:id/renewRenewCreate renewal payment

Code Reference: services/api/subscriptions/

License Management

MethodEndpointFunctionDescription
GET/v1/license/verify/:keyVerify licenseVerify license key validity
GET/v1/license/customer/:idGet by customerGet customer's license info

Code Reference: services/api/license/

Customers

MethodEndpointFunctionDescription
POST/v1/customersCreateRegister new customer
GET/v1/customers/meCurrent sessionGet current customer
GET/v1/customers/:idGet by IDGet customer details

Code Reference: services/api/customers/

Photos

MethodEndpointFunctionDescription
POST/v1/photosCreateCreate photo record
GET/v1/photos/:idGetRetrieve photo metadata

Code Reference: services/api/photos/

Sharing/Download

MethodEndpointFunctionDescription
POST/v1/uploadUpload photoUpload base64-encoded photo
GET/v1/download/:photoIdGet download URLGet signed download URL
GET/v1/download/:photoId/fileDownload fileDirect file download (signed)
POST/v1/qr/generateGenerate QRGenerate QR code for download URL

Code Reference: services/api/sharing/

Entitlements

FeatureDescriptionCode Reference
Grant perpetual entitlementOne-time purchase licenseentitlements/use-cases/grant-perpetual-entitlement.ts
Grant recurring entitlementSubscription-based accessentitlements/use-cases/grant-recurring-entitlement.ts
Revoke entitlementRemove customer accessentitlements/use-cases/revoke-entitlement.ts
Resolve active entitlementCheck if customer has valid accessentitlements/use-cases/resolve-active-entitlement.ts

External Integrations

ServicePurposeCode Reference
XenditPayment processing, QRIS, webhooksservices/api/outbound/xendit/
Cloudflare D1SQLite databaseservices/api/core/db/
Cloudflare R2Photo file storageservices/api/outbound/photo-storage.ts
OpenTelemetryObservability/tracingservices/api/core/middleware/otel-trace.ts
NiimbluelibBluetooth printer driver (Web)hooks/use-native-printer.ts
Web Bluetooth APIBrowser Bluetooth for printingPlatform-specific

Project Structure

frameingo-project/
├── apps/
│ ├── web/ # React + Vite photobooth UI
│ │ ├── pages/ # 9 page components
│ │ ├── routes/ # TanStack Router route definitions
│ │ ├── providers/ # 6 React context providers
│ │ ├── features/
│ │ │ ├── image-editing/ # Edit mode, preview, sortable items
│ │ │ ├── frame-selection/
│ │ │ ├── customization/ # Editor, hooks, schemas, types
│ │ │ └── printing/ # Native printer bridge
│ │ ├── hooks/ # 14+ custom React hooks
│ │ ├── lib/ # Utilities, presets, validation
│ │ ├── domain/ # Image processing (crop, dithering)
│ │ └── client.tsx # App entry point
│ └── internal/ # Internal admin panel (scaffolded)
├── services/
│ └── api/ # Hono/Cloudflare Workers backend
│ ├── payments/ # Xendit integration, webhooks
│ ├── subscriptions/ # Subscription lifecycle
│ ├── license/ # License verification
│ ├── customers/ # Customer management
│ ├── photos/ # Photo records
│ ├── sharing/ # Upload, download signing, QR
│ ├── entitlements/ # Access control logic
│ ├── admin/ # Admin panel API
│ └── outbound/ # Xendit client, photo storage
└── packages/
└── shared/ # Shared TypeScript (bridge interface)

Technology Stack

LayerTechnology
FrontendReact 18, Vite, TailwindCSS, TanStack (Query + Router)
BackendHono, Cloudflare Workers, Drizzle ORM
DatabaseCloudflare D1 (SQLite)
StorageCloudflare R2
PaymentsXendit (QRIS)
PrintingBluetooth ESCPOS via @mmote/niimbluelib
MobileCapacitor (Android WebView)
ContainerBun

Feature Status Summary

Feature AreaStatusNotes
Photobooth workflow✅ CompleteAll routes implemented
Frame customization✅ CompleteVisual editor + presets
Bluetooth printing✅ CompleteWeb Bluetooth + native bridge
Payment integration✅ CompleteXendit webhooks
Subscription management✅ CompleteFull lifecycle
License verification✅ CompleteOne-time + recurring
Photo upload/download✅ CompleteBase64 + signed URLs
QR code generation✅ CompleteServer-side rendering
Offline PWA✅ CompleteService worker + offline page
Voucher system✅ CompletePasscode-based access
Admin panel✅ CompleteCustomers, subscriptions, payments
Android app✅ CompleteWebView + native bridge