thats-me/backend/database/data/lifelines/bruno.json
Kevin Adametz b262a6771f Backend: Medien-Typen, Sprachnotizen, Event-Felder und Sync-Härtung
- Event-Medien tragen Typ (image/video/audio), Dauer und Notiz; Videos
  bekommen ein Poster, Audio wird per ffmpeg nach AAC (audio/mp4)
  gewandelt, Originale werden mit Range-Unterstützung gestreamt.
- Upload nimmt eine Notiz (caption) direkt mit, PATCH ändert sie später.
- Neue Event-Felder: Zeitraum (end_date), Kategorie, Personen, Meilenstein.
  Regeln zentral in EventFields, damit CRUD und Sync gleich prüfen.
- Titel darf leer sein: ein Event entsteht mit dem ersten Eintrag.
- Artisan-Befehl media:transcode-voice-notes wandelt alte WebM/Ogg-Notizen,
  die Safari nicht abspielen kann.
- Login-Throttling, Settings-Validierung, Sync-Fehlercodes ohne Rohtext.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-25 07:00:35 +00:00

513 lines
22 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"person": {
"name": "Bruno",
"email": "bruno@thats-me.app",
"birthYear": 2014
},
"events": [
{
"age": 0,
"month": 3,
"title": "Geboren",
"note": "Die Züchterin fotografiert den Wurf von sieben Welpen, Bruno ist der mit dem weißen Fleck auf der Nase, der als Einziger schläft.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Sehr positiv",
"imagePrompt": "In a breeder's living room on a soft blanket: a litter of seven newborn yellow Labrador puppies sleeping in a pile next to their mother; one puppy in the middle with a small white patch of fur on the bridge of his nose is the only one fast asleep on his back, tiny, eyes still closed; warm indoor light",
"imageAspect": "4:3",
"imageCharacters": []
},
{
"age": 0,
"month": 5,
"title": "Einzug bei Lena",
"note": "Lena fotografiert Bruno in seiner ersten Nacht im neuen Zuhause: im Körbchen, aber mit dem Kopf auf Lenas Hausschuh.",
"area": "Wohnen",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "First night in a new home: Bruno as a tiny eight-week-old puppy curled up in a wicker dog basket in a hallway, his head resting on a worn grey felt house slipper he dragged in, the puppy tiny compared to the basket; dim evening lamp light, tender",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 0,
"month": 6,
"title": "Erste Impfung",
"note": "Die Tierarzthelferin fotografiert Bruno auf dem Metalltisch, alle vier Pfoten gespreizt, Blick auf die Spritze.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Negativ",
"imagePrompt": "At the vet: Bruno as a three-month-old puppy standing on a shiny stainless steel examination table, all four legs spread wide and stiff, staring anxiously at a syringe in a vet assistant's hand at the edge of the frame; bright clinical light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 0,
"month": 7,
"title": "Sofakissen zerlegt",
"note": "Lena fotografiert Bruno inmitten einer Wolke aus Füllwatte, ein Kissenzipfel hängt ihm noch aus dem Maul.",
"area": "Wohnen",
"photo": "Fremdaufnahme",
"rating": "Neutral",
"imagePrompt": "In a living room: Bruno as a four-month-old puppy sitting alone proudly in the middle of an exploded sofa cushion, white polyester stuffing everywhere like a cloud, a corner of the cushion cover hanging from his mouth; only one dog; daylight from a window",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 0,
"month": 8,
"title": "Welpenschule",
"note": "Die Trainerin fotografiert Bruno, der statt „Sitz“ zu machen die Dackeldame Frieda anhimmelt.",
"area": "Freundschaft",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "At an outdoor puppy training class on a lawn: Bruno as a five-month-old puppy ignoring the 'sit' command and gazing adoringly at a small brown dachshund puppy sitting next to him; other puppies and owners' legs blurred in the background; summer evening light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 0,
"month": 11,
"title": "Erste Ostsee",
"note": "Lena fotografiert Bruno am Strand von Warnemünde, der vor jeder Welle einen Satz rückwärts macht.",
"area": "Reisen",
"photo": "Fremdaufnahme",
"rating": "Neutral",
"imagePrompt": "On a wide sandy Baltic Sea beach in November: Bruno as an eight-month-old puppy mid-jump backwards away from a small incoming wave, ears flying, startled expression, grey sea, empty beach",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 1,
"month": 1,
"title": "Erster Schnee",
"note": "Ein Foto im Park zeigt Bruno mit der Schnauze komplett im Schnee vergraben, nur die Rute ragt heraus.",
"area": "Freizeit",
"photo": "Fremdaufnahme",
"rating": "Sehr positiv",
"imagePrompt": "In a snowy city park: Bruno has buried his whole snout deep in fresh powder snow, only his ears and his wagging tail stick up, snow on his back, joyful; bright overcast daylight, bare trees, wide shot",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 1,
"month": 4,
"title": "Kastration",
"note": "Lena fotografiert Bruno mit Halskrause, der beim Versuch, durch die Tür zu gehen, am Rahmen hängen bleibt.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Sehr negativ",
"imagePrompt": "Indoors in an apartment hallway: Bruno wearing a large transparent plastic veterinary cone collar after surgery, stuck sideways in a door frame because the cone is too wide, looking puzzled and slightly offended at the camera; full body visible",
"imageAspect": "3:4",
"imageCharacters": [
"bruno"
]
},
{
"age": 1,
"month": 6,
"title": "Erste Wanderung",
"note": "Ein Wanderer fotografiert Lena und Bruno auf dem Brocken, Bruno trägt seinen eigenen kleinen Rucksack mit Leckerlis.",
"area": "Freizeit",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "On the rocky summit of the Brocken mountain in the Harz on a sunny June day: Bruno standing proudly wearing a small red dog backpack, tongue out, Lena crouching next to him in hiking clothes with trekking poles, wide view over forested hills",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"lena"
]
},
{
"age": 1,
"month": 9,
"title": "Ein Kilo Butter",
"note": "Lena fotografiert die leere Butterschale auf dem Küchenboden und Bruno daneben, der so tut, als hätte er das nie gesehen.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Negativ",
"imagePrompt": "On a kitchen floor: an empty white ceramic butter dish licked clean lying on the tiles, and next to it Bruno sitting and looking pointedly away from the camera at the wall, pretending innocence, a bit of butter on his whiskers; morning light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 1,
"month": 12,
"title": "Weihnachtsbaum umgeworfen",
"note": "Ein Foto vom liegenden Weihnachtsbaum, darunter Bruno mit einer Lichterkette um den Hals.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Neutral",
"imagePrompt": "In a living room on Christmas Eve: a fully decorated Christmas tree toppled over onto the carpet, baubles scattered, and underneath its branches Bruno peeking out with a string of warm fairy lights tangled around his neck, guilty but cute; cosy evening light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 2,
"month": 3,
"title": "Begleithundprüfung bestanden",
"note": "Die Prüferin fotografiert Bruno mit Urkunde im Maul, Lena hält die Leine und sieht erleichterter aus als er.",
"area": "Persönliche Entwicklung",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "On a dog training field in spring: Bruno sitting proudly holding a rolled-up blank white paper tied with a red ribbon in his mouth (no writing), Lena kneeling next to him holding the leash and looking more relieved than he does; overcast daylight",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"lena"
]
},
{
"age": 2,
"month": 8,
"title": "Erstes Eis in Italien",
"note": "Ein Kellner am Gardasee fotografiert Bruno mit einer Kugel Hundeeis, die er in einer Sekunde verschlingt.",
"area": "Reisen",
"photo": "Fremdaufnahme",
"rating": "Sehr positiv",
"imagePrompt": "At a lakeside café terrace on Lake Garda in August: Bruno sitting at a café table, snout right in front of a small plain paper cup of white dog ice cream held by a hand, eyes wide with anticipation, blue lake and mountains blurred behind; bright summer sun",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 3,
"month": 5,
"title": "Jan zieht ein",
"note": "Lena fotografiert Bruno, der demonstrativ auf Jans Seite des Betts liegt und ihn nicht anschaut.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Neutral",
"imagePrompt": "In a bedroom in the morning: Bruno lying stretched out demonstratively across one entire side of a double bed on top of the duvet, head turned away from Jan who stands at the edge of the frame next to moving boxes, looking amused; soft window light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"jan"
]
},
{
"age": 3,
"month": 10,
"title": "Im Fuchskot gewälzt",
"note": "Jan fotografiert Bruno in der Badewanne, Lena mit Wäscheklammer auf der Nase im Hintergrund.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Negativ",
"imagePrompt": "In a small bathroom: Bruno sitting miserably in a white bathtub full of foam, wet and sad, while Lena behind him holds a shower head with a wooden clothes peg on her nose, laughing; warm bathroom light",
"imageAspect": "3:4",
"imageCharacters": [
"bruno",
"lena"
]
},
{
"age": 4,
"month": 2,
"title": "Frieda wiedergetroffen",
"note": "Friedas Frauchen fotografiert Bruno und Frieda, die sich nach drei Jahren am Hundeplatz wiedererkennen und minutenlang umeinander springen.",
"area": "Freundschaft",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "On a fenced dog park in February: Bruno and a small brown dachshund bouncing around each other mid-air in pure joy, both with mouths open in a play grin, muddy grass, grey winter light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 4,
"month": 7,
"title": "Planschbecken",
"note": "Jan fotografiert Bruno bei 36 Grad im Kinderplanschbecken auf dem Balkon, nur die Nase über Wasser.",
"area": "Freizeit",
"photo": "Fremdaufnahme",
"rating": "Sehr positiv",
"imagePrompt": "On a small sunny city balcony in July: Bruno lying fully submerged in a small blue inflatable children's paddling pool, only his nose, eyes and ears above the water, blissful expression, harsh midday summer light, potted plants around, balcony railing visible",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 4,
"month": 11,
"title": "Erste graue Haare",
"note": "Ein Nahfoto von Brunos Schnauze mit den ersten weißen Haaren am Kinn, Lena hat es „Silberfuchs“ genannt.",
"area": "Persönliche Entwicklung",
"photo": "Fremdaufnahme",
"rating": "Neutral",
"imagePrompt": "Extreme close-up of Bruno's muzzle: the first few white hairs on his chin clearly visible, brown eyes looking softly at the camera, shallow depth of field, warm autumn window light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 5,
"month": 4,
"title": "Emma kommt",
"note": "Jan fotografiert Bruno, der neben dem Kinderwagen liegt und seit drei Stunden nicht aufgestanden ist.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "In a living room in April: a grey baby stroller with newborn Emma asleep inside, and Bruno lying pressed against the stroller wheel on the floor, chin on his paws, keeping watch, calm and protective; soft daylight",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"emma"
]
},
{
"age": 5,
"month": 9,
"title": "Zecke",
"note": "Lena fotografiert Bruno beim Tierarzt mit geschorener Stelle am Bein nach dem Borreliose-Schreck – Entwarnung.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Negativ",
"imagePrompt": "At a veterinary clinic: Bruno sitting on the floor with a small shaved patch on his front leg with a tiny bandage, tilting his head at the camera, Lena's hand ruffling his ears reassuringly; clinical light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"lena"
]
},
{
"age": 6,
"month": 3,
"title": "Alle den ganzen Tag zu Hause",
"note": "Ein Foto vom Homeoffice-Schreibtisch: Jan am Laptop, Lena am Telefon, Bruno auf beiden Füßen – das beste Jahr seines Lebens.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Sehr positiv",
"imagePrompt": "Home office during lockdown in March 2020: a wide shot of a living room turned office, Jan typing on a laptop at a desk, Lena on the phone at the dining table, and Bruno lying sprawled across both of their feet under the table, utterly content; daylight",
"imageAspect": "16:9",
"imageCharacters": [
"bruno",
"jan",
"lena"
]
},
{
"age": 6,
"month": 10,
"title": "„Buno“",
"note": "Ein Video-Standbild von Emma, die zum ersten Mal „Buno“ sagt und ihm die Hand auf die Nase legt.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Sehr positiv",
"imagePrompt": "In a living room: toddler Emma places her small hand on Bruno's nose, Bruno sitting very still and patient, both face to face at eye level; warm afternoon light, slightly blurry like a video still",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"emma"
]
},
{
"age": 7,
"month": 6,
"title": "Kreuzbandriss",
"note": "Lena fotografiert Bruno nach der OP in der Tierklinik, rasiertes Bein, Kopf auf ihrem Schoß.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Sehr negativ",
"imagePrompt": "In a veterinary clinic recovery room: Bruno lying on a blanket after knee surgery, one hind leg shaved and stitched, his head resting heavily in Lena's lap as she sits on the floor, his eyes half closed; cool clinical light, emotional",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"lena"
]
},
{
"age": 7,
"month": 8,
"title": "Unterwasserlaufband",
"note": "Die Physiotherapeutin fotografiert Bruno auf dem Unterwasserlaufband, Blick wie ein alter Mann in der Aquagymnastik.",
"area": "Persönliche Entwicklung",
"photo": "Fremdaufnahme",
"rating": "Neutral",
"imagePrompt": "In a dog physiotherapy practice: Bruno walking slowly on an underwater treadmill inside a glass tank, water up to his chest, with the resigned dignified expression of an old man at aqua aerobics; bright practice light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 7,
"month": 12,
"title": "Wieder auf dem Sofa",
"note": "Jan fotografiert Bruno, der zum ersten Mal seit der OP wieder allein aufs Sofa springt und sehr zufrieden mit sich ist.",
"area": "Wohnen",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "In a living room at Christmas: Bruno has just jumped onto a grey sofa for the first time after surgery and sits there extremely pleased with himself, chest out, Christmas tree lights in the background; cosy evening light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 8,
"month": 5,
"title": "Haus mit Garten",
"note": "Lena fotografiert Bruno am Umzugstag mitten auf dem Rasen des neuen Gartens, auf dem Rücken, alle Viere in der Luft.",
"area": "Wohnen",
"photo": "Fremdaufnahme",
"rating": "Sehr positiv",
"imagePrompt": "Moving day in May: Bruno lying on his back in the middle of the green lawn of a small suburban garden, all four legs in the air, tongue lolling, pure bliss, moving boxes and a house with an open patio door in the background; bright spring sun",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 8,
"month": 9,
"title": "Igel",
"note": "Jan fotografiert Bruno mit geschwollener Nase neben einem völlig unbeeindruckten Igel unter der Hecke.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Negativ",
"imagePrompt": "In a garden under a hedge in September: Bruno with a visibly swollen snout looking wounded at the camera, and next to him a small hedgehog completely unimpressed, curled up on the lawn; evening light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 9,
"month": 4,
"title": "Tumor an der Milz",
"note": "Lena fotografiert Bruno im Wartezimmer vor dem Ultraschall; der Tumor ist gutartig, das weiß aber noch keiner.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Negativ",
"imagePrompt": "In a veterinary waiting room: Bruno lying on the floor with his head on Lena's shoes as she sits on a chair, waiting, calm but tired; posters on the wall blurred, neutral clinical light, quiet mood",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"lena"
]
},
{
"age": 9,
"month": 7,
"title": "Letzte Ostsee",
"note": "Emma fotografiert Bruno am Strand, der die Wellen inzwischen ignoriert und lieber in der Sonne liegt.",
"area": "Reisen",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "On a Baltic Sea beach in July: Bruno lying comfortably in warm sand ignoring the small waves rolling in behind him, four-year-old Emma with a bucket digging next to him; soft summer evening light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"emma"
]
},
{
"age": 9,
"month": 11,
"title": "Rampe für die Treppe",
"note": "Jan fotografiert Bruno, der die neue Holzrampe zur Terrasse misstrauisch beschnuppert, Emma zeigt ihm, wie es geht.",
"area": "Wohnen",
"photo": "Fremdaufnahme",
"rating": "Neutral",
"imagePrompt": "On a garden terrace in November: a new wooden ramp leading up to the patio door, Bruno sniffing it suspiciously with one paw on it, four-year-old Emma standing at the top of the ramp waving him up; only one dog; overcast autumn light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"emma"
]
},
{
"age": 10,
"month": 2,
"title": "10. Geburtstag",
"note": "Lena fotografiert Bruno mit Partyhut vor einer Leberwursttorte mit zehn Kerzen, Emma hat sie selbst dekoriert.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Sehr positiv",
"imagePrompt": "Tenth birthday in a kitchen: Bruno wearing a small paper party hat sitting in front of a dog cake made of liver sausage decorated with ten candles and dog treats, five-year-old Emma next to him proudly presenting the cake she decorated; warm indoor light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"emma"
]
},
{
"age": 10,
"month": 5,
"title": "Nierenwerte",
"note": "Lena fotografiert Bruno beim Tierarzt, der jetzt Spezialfutter bekommt und es zunächst verweigert.",
"area": "Alltag",
"photo": "Fremdaufnahme",
"rating": "Negativ",
"imagePrompt": "In a kitchen: Bruno sitting in front of a full bowl of special diet kibble, looking at it with deep distrust and then up at the camera, refusing to eat; morning light",
"imageAspect": "4:3",
"imageCharacters": [
"bruno"
]
},
{
"age": 10,
"month": 8,
"title": "Letzter Sommer im Garten",
"note": "Jan fotografiert Emma, die Bruno im Garten aus ihrem Erstlesebuch vorliest; Bruno hört zu, mehr oder weniger.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Positiv",
"imagePrompt": "Last summer in the garden in August: Bruno lying on a blanket in the shade of an apple tree, five-year-old Emma sitting next to him reading aloud from a children's picture book (pages blank), holding it up for him to see; golden evening light, tender",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"emma"
]
},
{
"age": 10,
"month": 10,
"title": "Abschied",
"note": "Ein letztes Foto zeigt Bruno auf seiner Decke im Garten, Lena, Jan und Emma um ihn herum, die Tierärztin ist nach Hause gekommen.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Sehr negativ",
"imagePrompt": "In a garden in October: Bruno lying peacefully on his favourite blanket on the lawn, Lena, Jan and Emma kneeling around him stroking him, seen from slightly above, autumn leaves on the grass; soft overcast light, very quiet and emotional",
"imageAspect": "4:3",
"imageCharacters": [
"bruno",
"lena",
"jan",
"emma"
]
},
{
"age": 10,
"month": 11,
"title": "Pfotenabdruck",
"note": "Lena fotografiert die Erinnerungsecke im Flur: Brunos Pfotenabdruck in Ton, sein Halsband und das Foto mit dem Schnee auf der Nase.",
"area": "Familie",
"photo": "Fremdaufnahme",
"rating": "Neutral",
"imagePrompt": "A small memorial corner on a hallway shelf: a round clay disc with a dog paw print pressed into it, a worn brown leather dog collar with a tag, and a framed photo of a yellow Labrador with a white patch on the nose and snow on his snout; a small candle, soft warm light, still life",
"imageAspect": "3:4",
"imageCharacters": []
}
]
}