Dog owners take hundreds of photos, then rely on memory for the question that matters: has anything changed?
Yesterday's posture, last week's energy, that unusually restless look. Each clue is visible for a moment, then buried between screenshots and receipts. A single photo is a memory. A sequence of photos can become a wellness history.
One daily photo becomes a structured visual observation, a short voice update spoken as the dog, a grounded history the owner can question, and an optional on-chain pet passport. BarkPass describes what is visible. It never diagnoses a condition or replaces a veterinarian.
BarkPass is a responsive wellness companion for any dog. Its product loop is notice, hear, remember, carry. Create a profile for your dog. Add today's photo or a short video. Gemini returns a structured read of visible mood, energy, posture and flags. ElevenLabs turns that result into a short first-person voice note. Snowflake stores the check-in and grounds plain-language trend answers in the rows that actually exist. Solana turns the dog's identity details into a portable, independently verifiable devnet passport.
Bruno is the editorial example on the landing page, not a hardcoded user. Every new visitor receives a random dog ID. That ID scopes the profile, check-ins, Snowflake history queries and Solana metadata. Start at /app and BarkPass is about your dog, not mine.
🔗 Explore Bruno's optional sample story: https://barkpass-dog-days.vercel.app/app?sample=1
The clean app route begins with onboarding. Add a real dog profile, choose a photo, inspect the structured observation, play the voice note, ask a history question and open the passport section.
The Bruno route is only an optional sample story. A history product needs several days before its most interesting screen makes sense, so the sample provides seven check-ins immediately. It is not a separate build or a hidden judging route.
The first check-in begins in the browser. BarkPass downsizes an image to a maximum edge of 1,600 pixels, or extracts one representative frame from a short video. This reduces upload time and keeps the provider payload bounded. The prepared JPEG is sent only after the owner chooses the file.
Gemini returns a structured observation. BarkPass saves the normalized result as a check-in, then uses the same result to prepare the dog's voice note. Each additional check-in extends the dog's history. The owner can ask a plain-language question such as "Has Luna's energy changed this week?" and receive an answer calculated from Luna's queried Snowflake rows.
The passport is a separate, optional action. It carries identity and care details, not the owner's private image history. Minting returns public Solana Explorer proof. A shelter tip is prepared as an unsigned devnet transaction and still requires the owner to approve it in Phantom.
The product stays useful even when one provider is unavailable. Local profile and check-in history continue to work. Every non-provider result is labelled in the interface so sample data is never presented as live sponsor output.
The four integrations are stages of one pipeline, not four logos attached to a landing page.
The diagram is a static 1,000 × 1,200 portrait image with large type, so it stays readable at DEV's article width without depending on Mermaid support.
| Layer | Responsibility | What crosses the boundary | | --- | --- | --- | | React client | Dog profile state, media preparation, check-in UI, audio playback, Phantom connection and labelled local resilience | A prepared JPEG, normalized observation records, dog identity fields and owner-approved wallet actions | | Vercel Functions | Validation, provider orchestration, normalization and credential isolation | Only the minimum provider-specific payload; no provider secret is returned to the browser | | Google AI + ElevenLabs | Convert one selected frame into structured visible signals, then convert a bounded sentence into audio | Gemini receives the prepared frame; ElevenLabs receives the derived sentence, never the photo | | Snowflake | Durable dog profiles, idempotent check-ins and dog-scoped trend queries | Text identity fields and structured observations; the original profile/check-in photo is not stored there | | Solana devnet | Public passport metadata, one-of-one mint proof and unsigned shelter-tip preparation | Selected passport identity fields and the connected public wallet address |
One check-in request sequence Prepare in the browser. A chosen photo is resized to a maximum edge of 1,600 pixels and encoded as JPEG at 0.84 quality. For a short video, BarkPass seeks to an early representative frame and sends that frame rather than the whole clip. Nothing leaves the browser before the owner chooses media. Observe through POST /api/analyze. The function checks the method, media type and payload size before calling gemini-2.5-flash. Gemini is constrained to a JSON schema. The function parses and normalizes the response again, clamps energy and confidence to their allowed ranges, caps visible flags, and derives the bounded voice sentence on the server. Speak through POST /api/voice. Only that short sentence is sent to ElevenLabs. The function limits it to 500 characters and returns private-cacheable audio/mpeg; the browser creates a temporary object URL for playback. Remember through POST /api/dogs and POST /api/checkins. Snowflake receives the current random dogid, profile fields and the normalized observation. MERGE makes profile and check-in retries idempotent instead of duplicating history. Answer through POST /api/query. The function synchronizes at most 30 recent local check-ins, selects only rows for the requested dogid, and computes the row count, average, range, direction and most common mood from the returned values. The prose is assembled from those facts; an unrestricted model does not invent the trend answer. Carry through POST /api/solana/mint. The server validates the current dog, creates a same-origin metadata URL and uses Metaplex to mint a one-of-one BARK token on devnet. The response returns both the mint and transaction Explorer URLs. Preserve owner control through POST /api/solana/tip. The server builds a 0.01 SOL devnet transfer with the connected wallet as fee payer, but deliberately does not sign it. The browser hands the serialized transaction to Phantom; only the owner can approve and broadcast it.
The same random dog ID is the join key across browser storage, BARKPASSDOGS, BARKPASSCHECKINS, history queries and passport metadata. It is generated when a real profile is created and preserved when that profile is edited. Replacing the optional Bruno sample clears every sample-only field and creates a fresh ID, so a new owner cannot inherit Bruno's photo, microchip, vaccination or seven-day history.
The compound check-in key matters: checkinid makes retries safe, while dogid prevents one dog's retry from overwriting another dog's record. Query parameters are bound rather than concatenated, and history reads always include WHERE dogid = ?.
