A small project, built in the cloud
How Otto works
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
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.
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.
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.
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.
- 10 uploads per day, counted by Phoenix time. Replacements and unsuccessful attempts that create an entry count too.
- 20 MB per photo before preparation.
- 4 GB storage budget, with room reserved before accepting work.
- 2 photo-book jobs per day, one running at a time. The latest PDF replaces the previous download, with 16 MB reserved for it.
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.