Data & storage
What the software stores
Where data comes from, where it goes, and what it means to the application.
Database state (evidenced)
| Table | Role | Creation evidenced in-repo? |
|---|---|---|
| users | Accounts, credits, plan/admin columns | Partial (base in auth_lib; alters elsewhere; some columns missing CREATE) |
| credit_transactions | Purchase ledger | Yes in auth_lib (may mismatch stripe_lib inserts) |
| arcana_settings | Maintenance flags | Yes |
| arcana_renders | Finished images | Yes in helpers/generators |
| job_queue | Legacy/alternate queue | Yes in helpers |
| arcana_queue | Active generation queue | No full CREATE found |
| arcana_styles | Style library | No CREATE found |
| access_codes | Invite codes | No CREATE found |
| user_notifications | In-app notes | No CREATE found |
| stripe_products / stripe_checkout_sessions / user_subscriptions / stripe_webhook_events | Commerce | No CREATE found |
| admin_logs | Admin audit | Yes in admin_check |
| arcana_gen_sessions / attempts / events | Admin diagnostics | No CREATE found |
Filesystem state
uploads/dble— full images + thumbs (+refs/portraits)sample_images,backgrounds— marketing/featured assetslogs/— referenced for Stripe webhook logs (may be runtime-created)vendor/— Composer dependencies when installed
Environment configuration
See .env.example for key names. Never commit real secret values.
External provider state
Stripe customers/subscriptions/sessions; B2 object versions; Gemini ephemeral model responses.
Data flow
Generation data path
``
Form fields + portrait files
→ arcana_queue columns (band, song, lyrics, aspect_ratio, image_style, portrait URLs, watermark)
→ Gemini analysis JSON (ephemeral in worker; persisted on render as analysis_json)
→ prompt string (persisted on arcana_renders.prompt)
→ image bytes → uploads/dble + B2
→ arcana_renders row
→ users.image_credits decrement
→ arcana_queue.status=completed + result URL
``
Payment data path
``
stripe_products → Checkout Session → stripe_checkout_sessions
→ webhook/success → credit_transactions + users.*_credits
→ subscriptions → user_subscriptions (+ plan_type updates where implemented)
``