← Otto’s journal

One photo becomes a little record of Otto’s day. Behind it is a collection of Cloudflare services: some keep the photo safe, some prepare it, and one looks for a dog.

From phone to journal

  1. Choose a photo

    The owner signs in, adds a date and caption, and uploads a photo. Cloudflare Access protects the upload area. The original goes into private R2 storage.

  2. Prepare it for the web

    A queued job converts and resizes the photo with Cloudflare Images, removing location metadata from the public version. The upload page shows progress as it happens.

  3. Look for a dog

    Workers AI checks the prepared image. When it returns usable dog coordinates, the journal can draw bounding boxes. It can miss dogs or make mistakes; it does not identify a particular dog as Otto.

  4. Save another day

    The published photo, caption, and observation appear in the journal and calendar. The owner can edit a caption, hide or restore an entry, or permanently delete its files.

The Cloudflare pieces

Workers
Serve the site, check requests, and coordinate uploads and publishing.
R2
Holds original photos, prepared public photos, and the latest private photo book. The bucket itself is private; the app serves published media.
D1
Remembers dates, captions, processing status, observations, and which entries are visible.
Queues
Hands stored photos to the processing worker, with controlled retries if a job is interrupted.
Images
Prepares phone photos for viewing on the web, including HEIC conversion.
Workers AI + AI Gateway
Workers AI runs dog detection. When AI Gateway is configured, model requests go through it; otherwise they use Workers AI directly. The observation appears alongside the prepared photo.
Durable Objects
Signal live upload and processing updates. If the live connection is unavailable, the page checks saved progress periodically.
Workflows + Browser Run
Coordinate monthly photo-book jobs and render a PDF for the owner to download.
Analytics Engine
Records processing metrics alongside the private health dashboard’s database totals.
Web Analytics
Provides free visitor and page-performance measurements for the public journal and this page. Private admin pages are not measured; Otto also skips the beacon when the browser signals Do Not Track or Global Privacy Control.
Access
Keeps upload, management, health, and photo-book downloads behind the owner’s sign-in.

Designed to stay free

Otto keeps its workload small with its own limits. These are the app’s configured defaults, not Cloudflare’s account-wide allowances.

Cloudflare allowances are shared with other projects and may change. The owner can review storage and activity in Health & usage. App limits reduce usage; they do not guarantee every account stays within every free allowance.

Public memories, private controls

Anyone can view a published photo and caption. Original uploads and management controls are private. Location metadata is removed from the prepared public photo, but the photo itself may still show personal details.

Hiding an entry removes it from the public journal. It cannot take back copies someone already downloaded. Photo books are private snapshots and may contain entries that were visible when the book was made.