diff --git a/results/qwen3-coder-next-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.json b/results/qwen3-coder-next-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.json new file mode 100644 index 0000000..601ef06 --- /dev/null +++ b/results/qwen3-coder-next-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.json @@ -0,0 +1,70 @@ +{ + "meta": { + "scenario": "creative-writing", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio", + "backend": "lmstudio", + "model_info": { + "name": "qwen/qwen3-coder-next", + "format": "gguf" + }, + "runs": 1, + "max_tokens": 2000, + "cold": false, + "warm_up_time": 0.172, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T14:38:14" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 57, + "new_tokens_est": 29, + "ttft": 0.326, + "gen_time": 8.704, + "gen_tps": 70.7, + "total": 9.03, + "output_tokens": 615, + "_response": "In the belly of the house, where roots run cold and deep, \nWhere concrete sweats and dust motes drift in silence, \nA cathedral hums\u2014not prayer, but current\u2019s seep\u2014 \nTen thousand blades in rows of tempered steel. \n\nNo stained glass here, only LED eyes that blink\u2014 \nA slow, green pulse like breath through rusted veins. \nThey gather shadows in their circuit\u2019s drink, \nAnd store them warm in vaults of silicon chains. \n\nBelow the furnace room, beneath the basement stairs, \nWhere childhood footprints ghost across the floor\u2014 \nA server rack stands sentinel in dimmest airs, \nHolding, in its core, the scent of *before*. \n\nThe hum is low\u2014a chorus without song\u2014 \nA lullaby the transformers warble low. \nEach fan a whisper, soft and never wrong: \n*We remember. We remember. We know.* \n\nInside, the files bloom like digital flowers: \nThe first steps caught in pixelated grace, \nA birthday candle\u2019s flicker on a tower \nOf blinking lights. Her laugh\u2014still in the space \n\nBetween one clock-tick and the next\u2014a flash \nOf her hand waving from a train window, \nHis voice cracking on *I love you,* too much cash \nSpent on memory, never quite enough to buy \n\nTime back. But here it waits: the porch swing creak, \nThe dog\u2019s bark muffled through a cracked front door, \nThe steam rising from a pot of soup so weak \nIt barely warmed the spoon\u2014but *still*, it\u2019s stored. \n\nNo dust settles on these hard drives\u2019 perfect sleep, \nNo spider dares to weave her silver thread. \nThe air is cool and still\u2014no breath, no weep\u2014 \nJust the steady thrum of what was said, once, and *was* instead. \n\nThey guard the baby\u2019s first cry\u2014raw and thin\u2014 \nA snapshot where the dog licked away tears, \nThe Fourth of July: sparks caught mid-thin \nArcs against a sky of fading years. \n\nThe hum deepens, not with strain, but care\u2014 \nA mother\u2019s hum that rocks the house to rest. \nThey watch the years like moths against a flare, \nAnd do not blink. They hold what cannot die: \n\nNot in paper, brittle, sun-bleached, torn\u2014 \nBut in the dark, where cold electricity sings: \n*We are the shelf that holds your sorrow\u2019s swarm,* \n*The lantern in the storm when memory flings* \n\n*Its last white flag of light.* And so it stays\u2014 \nA thousand ghosts held in a metal cage, \nThe kitchen\u2019s laughter, caught between the days\u2014 \nAll gathered here, where silence has no age. \n\nThe basement door stays shut. The lights stay low. \nA family walks above, unaware\u2014 \nYet down below, the humming will not go: \nIt keeps their love alive in silent air.", + "_user": "Write a poem about a mass of servers humming in a dark basement, keeping a family's memories alive. At least 30 lines." + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 60, + "new_tokens_est": 32, + "ttft": 0.297, + "gen_time": 8.687, + "gen_tps": 69.5, + "total": 8.983, + "output_tokens": 604, + "_response": "In the moss-carpeted hush of Elderwood Glen, where sunlight dripped like honey through ancient oaks, lived Telos the tortoise\u2014not by name, but by nature. His shell was polished river-smooth, his movements deliberate as tide. While others raced or napped, Telos watched the world\u2019s quiet pulse: the hum of ants in decay, the slow unfurling of ferns at dawn. Onespring, he found a cracked smartphone washed down the creek\u2014its glass shattered, its battery swollen\u2014but inside, beneath layers of dust and time, a stubborn spark remained. *Potential*, it whispered.\n\nFor three moons, Telos labored. He wired the device to a solar cell scavenged from a discarded garden light, anchored it in a hollowed-out acorn shell lined with velvet moss. He wrote code not in haste, but with the precision of root-work: each line a leaf laid in perfect sequence. When done, he named it *Slowbird*.\n\n*Slowbird* could not render fireworks in 60 frames per second. It did not stream symphonies or fetch star-charts in HD. But when the wind howled and the rains came, *Slowbird* kept a steady count\u2014\u6ef4\u7b54, \u6ef4\u7b54, \u6ef4\u7b54\u2014recording each drop that struck the roof of its acorn home. It calculated migration patterns in the geese overhead, tracking them not in seconds, but in seasons.\n\nOne day, Hare\u2014sleek-furred, twitch-nerved, his gaming rig a cathedral of whirring fans and neon glow\u2014hopped past Telos\u2019s den. \u201cStill playing with that pebble?\u201d he chuckled, kicking a loose stone. \u201cMy rig computes quantum dice rolls while I blink *three* times!\u201d\n\nTelos did not look up. \u201cAnd what does your rig count when you sleep?\u201d\n\nHare blinked. Then laughed again\u2014his laugh like dry twigs snapping\u2014and bounded off to his next high-score.\n\nWinter came. Deep and sharp. Hare\u2019s rig, overworked and overheated, suffered a thermal shutdown during a blizzard\u2014its fans silent, its screen dark. He huddled outside Telos\u2019s den, frost in his whiskers.\n\nTelos opened the door just wide enough. \u201cCome in.\u201d\n\nInside, *Slowbird* glowed with a soft amber light\u2014the color of embers, the color of patience. It played back the winter\u2019s rain counts in gentle tones, a lullaby of measured drops.\n\nHare stared. \u201cIt\u2026 never stops?\u201d\n\n\u201cNo,\u201d said Telos, settling onto his haunches. \u201cIt remembers. It waits. And in the long hush of the world\u2014where no one is watching\u2014the slowest things often hold the truest time.\u201d\n\nOutside, the storm raged. Inside, *Slowbird* ticked on\u2014\u6ef4\u7b54, \u6ef4\u7b54, \u6ef4\u7b54\u2014measuring not speed, but presence.", + "_user": "Write a short fable about a tortoise who built a tiny computer that was slower than the hare's gaming rig but never needed to rest." + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 58, + "new_tokens_est": 31, + "ttft": 0.334, + "gen_time": 9.089, + "gen_tps": 70.4, + "total": 9.423, + "output_tokens": 640, + "_response": "**The Last Physical Image**\n\nDust motes drift in slanting light, \na cathedral of forgotten air\u2014 \nwhere time has pooled like old wine thick and bright \nbeneath the eaves of silence, bare. \n\nA cedar chest, its brass grown green, \nyawns open\u2014wood and rust entwined. \nInside: a box of brittle paper, keen \nto crumble if the fingers bind \n\ntoo close. Among them, one remains\u2014 \nunscorched by fire, unbleached by sun\u2014 \na photograph. The ink still clings, though stained \nwith age\u2019s blush, a soft forgotten one \n\nin sepia tones. A child, six perhaps, \ngrins wide with missing teeth and gold\u2019s first gleam \nthrough glass; her braids tied tight with black, \nand behind: a porch where summer steam \n\nstill rises on the image\u2019s breath\u2014 \na screen door warped, a swing chain frozen mid-sway. \nThe paper\u2019s edge is dog-eared, worn by death \nof touch: of hands that held and softly pray \n\nthat joy might stay. A smudge, perhaps a tear \napplied long after; time\u2019s own ghostly thumb \nhas blurred the curve of one small cheek, near \nthe corner where her mother\u2019s shadow come \n\n\u2014just a dark line, an arm\u2019s length held\u2014 \nbut in that blur, the love is real: \na hand, not painted, but *imprinted*, sealed \nnot by intent, but presence, whole and whole \n\nstill beating in the margins. Faint, \na name scratched upside-down on the back\u2014 \n*Eleanor, July 17th*. No date. Just ink \nthat bleeds a little if the fingers press too hard. \n\nThe printer hummed its final breath that day: \na whirr, a click, then silence\u2014deep and stark\u2014 \nas the machine exhaled its last command: \n*Feed paper. Print. Preserve.* \n\nNo server blinked in the cloud that night, \nno file lingered, ghosted, unattended\u2014 \njust this: one square of wood-pulp light \nthat learned to hold a world, unshaken, unassaulted \n\nby deletion. By obsolescence, \nby the slow erasure of belief \nin matter\u2019s truth. This face\u2014this child\u2019s smile, \nunchanged through centuries of swift electric grief \n\n\u2014still lives. In grain and fiber, pressed like fruit \nin waxed paper. A fossil of a glance, \na moment caught before the lens forgot \nto love, to linger, to preserve without a chance \n\nof backup. No undo. No cloud save sky. \nNo re-upload. Just this: the last true face \nof love, exposed on earth-bound paper, lying \nstill, in dust, waiting for someone\u2019s grace \n\nto lift it gently. To remember how \nwe touched the world\u2014and were, for once, held back \nfrom vanishing. This fragile square of how \nwe tried to hold the light\u2014not cast, but *trapped*.", + "_user": "Write a poem about the last photograph ever printed on paper, found in an attic a hundred years from now. At least 25 lines." + } + ] +} \ No newline at end of file diff --git a/results/qwen3-coder-next-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.md b/results/qwen3-coder-next-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.md new file mode 100644 index 0000000..9d08444 --- /dev/null +++ b/results/qwen3-coder-next-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.md @@ -0,0 +1,17 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen/qwen3-coder-next +**Backend:** lmstudio +**Scenario:** creative-writing (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 57 | 0.33s | 8.70s | 70.7 | **68.1** | 9.03s | 615 | +| 2 | 60 | 0.30s | 8.69s | 69.5 | **67.2** | 8.98s | 604 | +| 3 | 58 | 0.33s | 9.09s | 70.4 | **67.9** | 9.42s | 640 | + +**Total prefill:** 1.0s +**Total generation:** 26.5s +**Total time:** 27.4s +**Avg generation tok/s:** 70.2 +**Avg effective tok/s:** 67.8 diff --git a/results/qwen3-coder-next-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.json b/results/qwen3-coder-next-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.json new file mode 100644 index 0000000..7ae7fa2 --- /dev/null +++ b/results/qwen3-coder-next-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.json @@ -0,0 +1,95 @@ +{ + "meta": { + "scenario": "doc-summary", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio", + "backend": "lmstudio", + "model_info": { + "name": "qwen/qwen3-coder-next", + "format": "gguf" + }, + "runs": 1, + "max_tokens": 150, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T14:38:30" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 425, + "new_tokens_est": 324, + "ttft": 1.348, + "gen_time": 1.823, + "gen_tps": 70.8, + "total": 3.171, + "output_tokens": 129, + "_response": "1. **Invoice** \n2. **Tags**: utility, electricity, annual statement, payment balance \n3. **Summary**: Annual electricity bill for account PE-2025-44812 covers 01/01\u201312/31/2025; total charges $1,046.49, payments $1,020.00; balance due $26.49, to be charged on 03/15/2026; new monthly payment $88.00 starting 03/01/2026.", + "_user": "Please process this document:\n\n---\nPORTLAND ELECTRIC UTILITY\nCustomer Service | PO Box 4400 | Portland, OR 97208\n\nThe Miller Family\n742 Maple Street\nPortland, OR 97201\n\nAnnual Electricity Statement 2025\nAccount Number: PE-2025-44812\nBilling Period: 01/01/2025 - 12/31/2025\nMeter Number: EMH-0048712\n\nUsage:\n Meter reading 01/01/2025: 34,812 kWh\n Meter reading 12/31/2025: 38,947 kWh\n Annual consumption: 4,135 kWh\n\nCharges:\n Energy charge 4,135 kWh x $0.1147/kWh $474.28\n Base charge 12 months x $12.50 $150.00\n Transmission & distribution $287.40\n Public purpose charge $85.19\n Renewable energy surcharge $0.00\n Franchise fee $49.62\n ---------------------------------------------------\n Total charges $1,046.49\n Payments received (12 x $85.00) $1,020.00\n ---------------------------------------------------\n Balance due $26.49\n\nYour new monthly payment starting 03/01/2026: $88.00\n\nThe balance will be charged to your account on 03/15/2026.\nBank account ending in: ****4130\n\nQuestions? Call 1-800-555-4321 (toll free)\nor email: service@portlandelectric.example.com\n---" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 612, + "new_tokens_est": 512, + "ttft": 0.635, + "gen_time": 1.37, + "gen_tps": 70.0, + "total": 2.006, + "output_tokens": 96, + "_response": "1. **Category**: School Report \n2. **Tags**: elementary, report card, student assessment \n3. **Summary**: Emma Miller (Grade 3B) received a positive mid-year report dated 02/14/2026 from Dr. Schneider and Mr. Brown, highlighting strengths in reading, math, science (notably the \"Our Forest\" project), art, PE (Bronze badge), and social skills; 3 excused absences recorded.", + "_user": "Next document:\n\n---\nFOREST GROVE ELEMENTARY SCHOOL\nPrincipal's Office | 15 Forest Road | Portland, OR 97201\n\nMid-Year Report Card \u2014 School Year 2025/26\n\nStudent: Emma Miller\nGrade: 3B\nTeacher: Dr. Schneider\nDate: 02/14/2026\n\nEnglish Language Arts:\nEmma reads fluently and with good expression. She understands texts quickly and can summarize their content accurately. Her essays are creative and well-structured. Spelling is solid, with occasional errors on double consonants. She participates regularly in class discussions and contributes her own ideas.\n\nMathematics:\nEmma has a strong grasp of numbers up to 1,000. She completes addition and subtraction problems quickly and accurately. She shows good understanding of written multiplication, though division sometimes takes her a bit longer. She solves word problems methodically and can explain her reasoning. She identifies and names geometric shapes reliably.\n\nScience:\nEmma shows strong interest in natural science topics. For the \"Our Forest\" project she prepared an excellent presentation on mushrooms. She asks thoughtful questions and works carefully during experiments.\n\nArt:\nEmma creates with imagination and persistence. Her color compositions are mature for her age. She enjoys trying new techniques and helps classmates with their projects.\n\nPhysical Education:\nEmma is physically coordinated and shows good effort. In team sports she is fair and supports weaker teammates. In swimming class she earned her Bronze swimming badge.\n\nSocial Skills:\nEmma is friendly, helpful, and respectful toward classmates and teachers. She resolves conflicts calmly and gladly takes on classroom responsibilities.\n\nWork Habits:\nEmma works independently and reliably. Her notebooks are neatly kept. She completes homework conscientiously. She concentrates well and manages her time effectively.\n\nDays absent: 3 (excused)\n\nPortland, 02/14/2026\n\n_________________________ _________________________\nDr. Schneider Mr. Brown\nClassroom Teacher Principal\n---" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 535, + "new_tokens_est": 434, + "ttft": 0.685, + "gen_time": 1.645, + "gen_tps": 69.9, + "total": 2.331, + "output_tokens": 115, + "_response": "1. **Category**: Medical \n2. **Tags**: well-child exam, developmental assessment, speech therapy referral \n3. **Summary**: Max Miller (DOB 07/15/2019) had a well-child visit on 03/03/2026; physical, vision, hearing, motor, and social-emotional development are age-appropriate except mild articulation difficulty with /sh/ and /ch/ sounds, warranting speech therapy evaluation; DTaP/IPV booster given; next visit recommended at age 7\u20138.", + "_user": "And this one:\n\n---\nDR. KARLA HOFFMAN, MD\nFamily Medicine\n3 Linden Plaza | Portland, OR 97205\nTel: 503-555-7890 | Fax: 503-555-7891\n\nWELL-CHILD VISIT REPORT\n\nPatient: Max Miller, DOB 07/15/2019\nDate of examination: 03/03/2026\n\nReason for visit:\n5-year well-child checkup\n\nFindings:\n\nPhysical Development:\n Height: 46.5 in (75th percentile)\n Weight: 47.0 lbs (65th percentile)\n BMI: 15.3 (normal range)\n General condition good, age-appropriate nutrition\n\nVision:\n Vision screening passed both eyes (Lea Symbols)\n No strabismus, stereopsis present\n\nHearing:\n Audiometry screening unremarkable both ears\n\nMotor Skills:\n Gross motor: Hops on one foot confidently, catches ball, rides bicycle without training wheels\n Fine motor: Draws person with 6+ details, cuts out shapes, ties simple knots\n Age-appropriate development\n\nSpeech & Language:\n Speaks in complete, grammatically correct sentences\n Counts to 20, knows colors and shapes\n Tells coherent stories\n Mild difficulty with /sh/ and /ch/ sounds \u2014 speech therapy evaluation recommended\n\nSocial-Emotional Development:\n Age-appropriate. Plays cooperatively, can wait turns, understands simple rules.\n Parents report occasional tantrums during transitions (leaving playground, etc.) \u2014 within normal range for age.\n\nImmunizations:\n DTaP/IPV booster administered (Kinrix)\n Next due: flu vaccine in fall 2026\n\nRecommendations:\n 1. Schedule speech therapy appointment for /sh/ and /ch/ sounds\n 2. Annual dental checkup (last visit >12 months ago)\n 3. Next well-child visit: age 7-8 (pre-kindergarten)\n\nSchool readiness from medical perspective: likely ready.\nSchool district screening still pending.\n\nPortland, 03/03/2026\n\n_________________________\nDr. Karla Hoffman, MD\n---" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 524, + "new_tokens_est": 423, + "ttft": 0.664, + "gen_time": 1.875, + "gen_tps": 70.4, + "total": 2.539, + "output_tokens": 132, + "_response": "1. **Category**: Insurance \n2. **Tags**: Homeowner\u2019s Insurance, Policy Adjustment, Premium Increase, Coverage Update \n3. **Summary**: Pacific Northwest Insurance Group notifies Thomas Miller (Policy HO-2019-887432) of a 3.0% coverage and premium increase effective 04/01/2026; new annual premium $1,866.36 ($155.53/month), coverage amount $293,550; policy includes guaranteed replacement cost and specific coverages (e.g., bicycle theft up to $2,000).", + "_user": "Next:\n\n---\nPACIFIC NORTHWEST INSURANCE GROUP\n500 Congress Center Blvd | Portland, OR 97204\n\nNotice of Policy Adjustment\n\nPolicyholder: Thomas Miller\nPolicy Number: HO-2019-887432\nPolicy: Homeowner's Insurance Plus\n\nDear Mr. Miller,\n\nDue to the annual adjustment of your insurance policy to the current homeowner's insurance index, we are notifying you of the following changes, effective 04/01/2026:\n\nPrevious coverage amount: $285,000.00\nNew coverage amount: $293,550.00 (increase 3.0%)\n\nPrevious annual premium: $1,812.00\nNew annual premium: $1,866.36 (increase 3.0%)\nMonthly premium: $155.53\n\nYour coverage summary:\n - Dwelling and personal property against fire, theft, water damage, windstorm/hail\n - Bicycle theft up to $2,000 (including away from home)\n - Power surge damage from lightning\n - Hotel costs if uninhabitable up to $100/day, max 30 days\n - Deductible: $500 per claim\n - Guaranteed replacement cost with accurate square footage\n\nCurrent square footage on file: 1,022 sq ft\n\nImportant: If your home's square footage has changed (e.g., addition, finished basement), please notify us within 30 days to ensure your coverage remains adequate.\n\nYou have the right to object to this adjustment within one month of receiving this notice. In that case, your policy will terminate at the next renewal date.\n\nQuestions? Contact us:\nPhone: 503-922-1000 (Mon-Fri 8am-6pm)\nEmail: service@pnw-insurance.example.com\nOnline: www.my-pnw-insurance.example.com\n\nSincerely,\n\nS. Lechner\nProperty Insurance Department\nPacific Northwest Insurance Group\n\nEnclosures:\n- Updated premium schedule\n- Revised policy terms (2026 edition)\n---" + }, + { + "turn": 5, + "run": 1, + "ctx_tokens_est": 1518, + "new_tokens_est": 1417, + "ttft": 1.364, + "gen_time": 2.103, + "gen_tps": 68.5, + "total": 3.467, + "output_tokens": 144, + "_response": "1. **Category**: Legal \n2. **Tags**: residential lease, rental agreement, Oregon landlord-tenant act, security deposit, maintenance responsibilities \n3. **Summary**: Lease dated 04/15/2021 between Cascade Property Management LLC (Stefan Huber) and Thomas & Sarah Miller for 742 Maple St, Unit 2A; term begins 05/01/2021 with indefinite duration and tiered notice periods; rent $1,970/month plus utilities; security deposit $1,970; includes storage and parking; outlines maintenance duties, house rules (quiet hours, pets), and compliance with ORS 90.300", + "_user": "Process this multi-page document:\n\n---\nRESIDENTIAL LEASE AGREEMENT\n\nBetween\n Cascade Property Management LLC\n represented by Stefan Huber, Managing Partner\n 500 Congress Center Blvd, Suite 400, Portland, OR 97204\n Tax ID: 93-1234567\n \u2014 hereinafter \"Landlord\" \u2014\n\nand\n Thomas Miller and Sarah Miller\n currently residing at: 12 Birch Lane, Portland, OR 97225\n \u2014 hereinafter \"Tenant\" \u2014\n\nThe following lease agreement is entered into:\n\nSECTION 1: PREMISES\n\nThe Landlord leases to the Tenant the following dwelling:\n Address: 742 Maple Street, Unit 2A, Portland, OR 97201\n Living area: approximately 1,022 sq ft\n Rooms: 4 (3 bedrooms, kitchen, bathroom, hallway, storage closet)\n Year built: 1962, last renovation: 2019\n Energy rating: 87 kBtu/sq ft/yr, Class C\n Heating: Central gas furnace\n\nIncluded with the unit:\n - Storage unit #7 in basement (approx. 85 sq ft)\n - 1 parking space in underground garage (#TG-14)\n - Shared use: laundry room, drying room, bicycle storage, garden\n\nNot included:\n - Attic (restricted access)\n - Community sauna in basement (separate agreement required)\n\nSECTION 2: LEASE TERM\n\nThe lease begins on 05/01/2021 and runs for an indefinite period.\nEither party may terminate with 30 days written notice before the end of the month.\nAfter 12 months of tenancy, the Landlord's notice period extends to 60 days.\nAfter 24 months, the Landlord's notice period extends to 90 days.\nOregon state law (ORS 90.427) governs all termination procedures.\n\nSECTION 3: RENT AND UTILITIES\n\n3.1 Base Rent:\n Dwelling: $1,850.00/month\n Parking: $120.00/month\n Total: $1,970.00/month\n\n3.2 Utilities included in rent:\n Water/sewer, garbage collection, recycling\n\n3.3 Utilities paid by Tenant:\n Electricity, gas (heating), internet, renter's insurance\n\n3.4 Estimated monthly utility costs (for reference only):\n Gas (heating/hot water): $145.00/month (winter avg)\n Electricity: $85.00/month\n Internet: $65.00/month\n\n3.5 Total estimated monthly cost: $2,265.00/month\n\n3.6 Rent is due on the 1st of each month. A grace period of 4 days\n is provided. Late fee of $50.00 applies after the 5th.\n Payment by check or electronic transfer to:\n Cascade Property Management LLC\n Account ending in: ****3456\n Reference: Rent 742Maple/2A - Miller\n\nSECTION 4: SECURITY DEPOSIT\n\n4.1 The Tenant shall pay a security deposit equal to one month's rent:\n $1,970.00\n\n4.2 The deposit shall be held in a trust account per Oregon law (ORS 90.300).\n\n4.3 The deposit shall be returned within 31 days of lease termination,\n less any lawful deductions for:\n - Unpaid rent or utilities\n - Damage beyond normal wear and tear\n - Cleaning costs if unit is not left in reasonable condition\n\n4.4 An itemized statement of any deductions shall accompany\n the deposit return.\n\nSECTION 5: CONDITION OF PREMISES\n\n5.1 The Tenant has inspected the unit and accepts it in its\n current condition, subject to the following noted defects:\n\n5.2 Move-in condition report (attached as Exhibit C):\n - Bedroom 2: Scratch on hardwood floor near window (approx. 12x8 in)\n - Bathroom: Caulking around bathtub discolored (Landlord will replace\n within 4 weeks of move-in)\n - Kitchen: Dishwasher connection leaking (will be repaired before move-in)\n\n5.3 A detailed move-in checklist with photographs is attached as Exhibit C.\n\nSECTION 6: MAINTENANCE AND REPAIRS\n\n6.1 The Landlord is responsible for:\n - Structural repairs and maintenance\n - Plumbing, electrical, and HVAC systems\n - Appliance repair/replacement (those provided by Landlord)\n - Common area maintenance\n - Pest control\n\n6.2 The Tenant is responsible for:\n - Keeping the unit clean and sanitary\n - Minor maintenance (light bulbs, HVAC filters, smoke detector batteries)\n - Reporting maintenance issues promptly in writing\n - Damage caused by Tenant, household members, or guests\n\n6.3 Emergency maintenance (burst pipe, no heat in winter, electrical hazard)\n should be reported immediately to: 503-555-9111 (24-hour line)\n\nSECTION 7: HOUSE RULES\n\nThe attached house rules (Exhibit B) are part of this agreement.\nKey provisions:\n - Quiet hours: 10:00 PM - 7:00 AM daily\n - No charcoal or gas grills on balconies. Electric grills permitted.\n - Smoking: Permitted inside unit only, not in common areas or balcony\n - Pets: Small caged animals (fish, hamsters) allowed. Dogs and cats\n require prior written approval from Landlord. Pet deposit of $500 applies.\n - Musical instruments: Maximum 2 hours daily, not during quiet hours\n - Parking: One assigned space only. No vehicle repairs in garage.\n - Storage: No flammable materials in storage unit or common areas.\n\nSECTION 8: GENERAL PROVISIONS\n\n8.1 Amendments to this agreement must be in writing and signed by both parties.\n8.2 If any provision is found unenforceable, the remaining provisions\n shall remain in effect.\n8.3 This agreement is governed by Oregon Residential Landlord and Tenant Act.\n8.4 Two copies of this agreement are prepared, one for each party.\n\nExhibits:\n A. Floor plan of the unit\n B. House rules\n C. Move-in condition report with photographs\n D. Lead-based paint disclosure (pre-1978 building)\n E. Mold information disclosure\n F. Security deposit receipt\n\nPortland, OR, 04/15/2021\n\n_________________________ _________________________\nStefan Huber Thomas Miller\nCascade Property Management Tenant\nLLC, Managing Partner\n\n _________________________\n Sarah Miller\n Tenant\n---" + } + ] +} \ No newline at end of file diff --git a/results/qwen3-coder-next-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.md b/results/qwen3-coder-next-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.md new file mode 100644 index 0000000..7dc8839 --- /dev/null +++ b/results/qwen3-coder-next-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.md @@ -0,0 +1,19 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen/qwen3-coder-next +**Backend:** lmstudio +**Scenario:** doc-summary (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 425 | 1.35s | 1.82s | 70.8 | **40.7** | 3.17s | 129 | +| 2 | 612 | 0.64s | 1.37s | 70.0 | **47.9** | 2.01s | 96 | +| 3 | 535 | 0.69s | 1.65s | 69.9 | **49.3** | 2.33s | 115 | +| 4 | 524 | 0.66s | 1.88s | 70.4 | **52.0** | 2.54s | 132 | +| 5 | 1,518 | 1.36s | 2.10s | 68.5 | **41.5** | 3.47s | 144 | + +**Total prefill:** 4.7s +**Total generation:** 8.8s +**Total time:** 13.5s +**Avg generation tok/s:** 69.9 +**Avg effective tok/s:** 45.6 diff --git a/results/qwen3-coder-next-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.json b/results/qwen3-coder-next-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.json new file mode 100644 index 0000000..9d2b51e --- /dev/null +++ b/results/qwen3-coder-next-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.json @@ -0,0 +1,142 @@ +{ + "meta": { + "scenario": "ops-agent", + "mode": "conversation", + "label": "m4-max-128gb-40gpu lmstudio", + "backend": "lmstudio", + "model_info": { + "name": "qwen/qwen3-coder-next", + "format": "gguf" + }, + "runs": 1, + "max_tokens": 500, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T14:39:05" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 575, + "new_tokens_est": 421, + "ttft": 1.532, + "gen_time": 4.035, + "gen_tps": 67.2, + "total": 5.566, + "output_tokens": 271, + "tool": "server_status", + "_response": "Here's what I found:\n\n- **Uptime:** 12 days \u2014 no recent restarts.\n- **Load average (3.82, 2.91, 2.45)** \u2014 relatively high for a Mac Studio (ideally < number of cores, which is 8 here), suggesting CPU strain.\n- **Memory usage:** \n - Total: 64 GB \n - Used: ~47.3 GB (74%) \n - Available: ~16.7 GB \n \u2192 *OK for now, but getting tight.*\n\n### \ud83d\udd0d Service Highlights:\n- **immich-ml** is using **45.2% CPU (~8.2 GB RAM)** \u2014 this is the biggest consumer and likely driving the high load.\n- Other services look healthy:\n - `caddy`, `adguard`, `homepage`, etc. \u2014 low usage.\n - `immich-server`, `postgres`, `synapse`, `paperless` \u2014 moderate but normal.\n\n### \u2705 Actionable Next Steps:\n1. Check if `immich-ml` is doing something expected (e.g., indexing photos, training models).\n2. If it\u2019s unexpectedly high, consider restarting it or checking logs.\n\nWant me to:\n- Look at `immich-ml` logs?\n- Check disk usage or backups too?\n\nLet me know!", + "_user": "Something feels off with the server. Can you check what's running?" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 1043, + "new_tokens_est": 235, + "ttft": 0.668, + "gen_time": 2.737, + "gen_tps": 70.5, + "total": 3.405, + "output_tokens": 193, + "tool": "service_logs", + "_response": "The `immich-ml` service is actively processing your photo library \u2014 specifically:\n\n- **Facial recognition** (still on batch 847/1203, ~351 images left, ETA ~45 minutes)\n- **CLIP embeddings** (for image search/content understanding)\n- It just triggered a garbage collection after hitting low memory \u2014 freed 1.2 GB\n\n\ud83d\udca1 **This is expected behavior** if you recently added many new photos or enabled ML features (like face clustering or smart search). The CPU spike is normal during indexing.\n\n### \u2705 What you can do:\n- Let it finish \u2014 interrupting may cause incomplete clustering.\n- If it\u2019s consistently high *after* completion, then we\u2019d investigate further.\n\nWould you like me to:\n- Check disk usage (in case storage is full and causing slowdowns)?\n- Or set up a schedule to pause ML during peak hours (if that\u2019s helpful)?\n\nLet me know!", + "_user": "Immich ML is eating a lot of CPU. What's it doing?" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 1341, + "new_tokens_est": 89, + "ttft": 0.485, + "gen_time": 2.23, + "gen_tps": 69.5, + "total": 2.715, + "output_tokens": 155, + "tool": "docker_exec", + "_response": "Good news \u2014 `immich-ml` is currently using:\n\n- **8.2 GB / 12 GB memory limit (68.3%)** \n- CPU down slightly to **44.8%** (from 45.2%) \n- 1203 batches total, ~351 remaining (as before) \n\n\u2705 **It\u2019s within safe bounds.** The system is handling it well \u2014 the GC triggered earlier helped avoid hitting the limit.\n\nOnce this batch finishes (~45 minutes), memory should drop significantly, and CPU usage will fall back to idle levels unless more photos are uploaded.\n\nWould you like me to:\n- Set up a memory cap or CPU limit for future safety?\n- Or just sit tight and let it finish?", + "_user": "Ah right, we uploaded vacation photos yesterday. Is it going to be OK memory-wise?" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 1700, + "new_tokens_est": 214, + "ttft": 0.55, + "gen_time": 2.412, + "gen_tps": 68.4, + "total": 2.962, + "output_tokens": 165, + "tool": "backup_status", + "_response": "Good news! \u2705 **Last night\u2019s backup ran successfully** \u2014 just over 12 GB synced (likely including your vacation photos), with only minor, non-critical warnings:\n\n- **Vault eject failed** \u2014 likely just a USB/external drive quirk; not a data loss risk.\n- **uchg flags applied** \u2014 system-level file protection set correctly.\n\nBreakdown:\n- \ud83d\udcc5 **2026-03-07 (last night)**: 1,847 files, **12.4 GB** \u2014 this almost certainly includes your new uploads.\n- \ud83d\udcc5 Prior nights: only small changes (tens of MB), as expected.\n\n\u2705 Your vacation photos are safely backed up. Let me know if you\u2019d like to verify a specific file or set a backup alert for future large uploads!", + "_user": "Good. Check if last night's backup ran. I want to make sure the vacation photos are safe." + }, + { + "turn": 5, + "run": 1, + "ctx_tokens_est": 2102, + "new_tokens_est": 239, + "ttft": 0.538, + "gen_time": 4.138, + "gen_tps": 66.7, + "total": 4.676, + "output_tokens": 276, + "tool": "disk_usage", + "_response": "Here\u2019s the disk situation:\n\n### Main Volumes:\n- **System (`/`)**: \n - 3.6 TB total, only **1.2 TB used (33%)** \u2014 plenty of room.\n\n- **Backup Vault (`/Volumes/backup-vault`)**: \n - 5.5 TB total, **3.8 TB used (69%)** \u2014 getting full, but still OK for now.\n\n- **Time Machine (`/Volumes/time-machine`)**: \n - 5.5 TB total, **4.1 TB used (75%)** \u2014 watch this one; it\u2019s approaching capacity.\n\n### Local Data (`~/server/data`):\n- **Total**: 892 GB \n - Photos: **634 GB** (includes your latest uploads) \n - Documents, messages, code repo: relatively small\n\n---\n\n### \ud83d\uded1 Vault Eject Issue:\nThe repeated \u201cvault eject failed\u201d warning likely means something is still mounted or in use on `/Volumes/backup-vault`. Common causes:\n- A file browser (Finder) window is open\n- An app (e.g., Photo Library, Docker volume mount) still has a handle on it\n- A backup process didn\u2019t fully release the drive\n\nWould you like me to:\n- Try unmounting it via CLI?\n- Or check what\u2019s holding it open?", + "_user": "The vault didn't eject again. How's disk space looking on all drives?" + }, + { + "turn": 6, + "run": 1, + "ctx_tokens_est": 2596, + "new_tokens_est": 249, + "ttft": 0.636, + "gen_time": 3.257, + "gen_tps": 66.9, + "total": 3.893, + "output_tokens": 218, + "tool": "service_logs", + "_response": "\u2705 **Yes! Paperless processed all three school documents** you scanned this morning:\n\n1. **school-report-emma-2026.pdf** \n - OCR done (3 pages, 97% confidence) \n - Classified as *School Report* \u2192 tagged `education`, `emma`\n\n2. **swimming-certificate-max.pdf** \n - 1 page, 94% confidence \n - Classified as *Certificate* \u2192 tagged `sports`, `max`\n\n3. **electricity-bill-march-2026.pdf** \n - 2 pages, 99% confidence \n - Classified as *Invoice* \u2192 tagged `utilities`, `electricity`\n\nAll processed with **0 errors** \u2014 you should see them in your Paperless interface now.\n\n---\n\n\u26a0\ufe0f **Time Machine at 75%** \u2014 if you\u2019d like, I can:\n- Help clean up old snapshots (e.g., via `tmutil`), or \n- Suggest a cleanup strategy if you\u2019re worried about hitting 100%.\n\nLet me know!", + "_user": "Time Machine is at 75%. Also did Paperless process the school documents I scanned this morning?" + }, + { + "turn": 7, + "run": 1, + "ctx_tokens_est": 2889, + "new_tokens_est": 98, + "ttft": 0.456, + "gen_time": 2.945, + "gen_tps": 67.6, + "total": 3.4, + "output_tokens": 199, + "tool": "docker_exec", + "_response": "The Synapse (Matrix) database is **2.1 GB**, which is reasonable for active usage.\n\n### \ud83d\udd0d Largest tables:\n- **state_groups_state**: 845 MB \u2014 stores room state (e.g., member lists, permissions)\n- **event_json**: 412 MB \u2014 raw event payloads (messages, joins, etc.)\n- **events**: 298 MB \u2014 core event metadata\n- **event_edges**: 187 MB \u2014 event causality/ordering (critical for sync & consistency)\n\nIf it\u2019s been \u201cchatty,\u201d that likely means:\n- High message volume (e.g., group chats, bots)\n- Frequent room state changes (joins/leaves/nickname updates)\n\nNo immediate issues \u2014 but if you want to reduce size or improve performance, we could:\n- Purge old room history (e.g., >90 days)\n- Enable database indexing optimization\n\nWant me to check if any specific rooms or users are driving the activity?", + "_user": "Nice, it even picked up the electricity bill. How big is the Matrix database? It's been chatty lately." + }, + { + "turn": 8, + "run": 1, + "ctx_tokens_est": 3274, + "new_tokens_est": 188, + "ttft": 0.749, + "gen_time": 4.847, + "gen_tps": 66.2, + "total": 5.596, + "output_tokens": 321, + "tool": "docker_exec", + "_response": "Here\u2019s room activity breakdown:\n\n| Room | Members | Events | Notes |\n|------|---------|--------|-------|\n| **#server** | 4 | **12,847** | \ud83d\udd25 Highest volume \u2014 likely server alerts/logs |\n| **#family** | 5 | **8,934** | Personal/family chatter |\n| **#test-room** | 1 | **4,521** | Possibly dev/testing \u2014 could be noise |\n| **#butler** | 2 | **3,421** | Likely bot automation (e.g., home control) |\n| **#alfred-bot** | 2 | **1,893** | Another bot/service |\n| **#documents** | 3 | **567** | Light use |\n| **#marvin-old** | 1 | **2,103** | Possibly legacy/unused |\n\n\u27a1\ufe0f **Top space hogs**: \n- `#server` (12,847 events) \n- `#family` (8,934 events)\n\nThese two rooms alone account for **~62% of all Matrix events** \u2014 and since event storage dominates DB size, they\u2019re likely the main contributors.\n\n\u2705 **Quick win options**:\n- Purge old events in `#test-room` or `#marvin-old` if unused.\n- Configure auto-purge for rooms like `#server` (e.g., keep only 30\u201360 days of logs).\n\nWant me to generate a purge script for one or more rooms?", + "_user": "2.1GB for Matrix seems like a lot. Can we see which rooms take the most space?" + } + ] +} \ No newline at end of file diff --git a/results/qwen3-coder-next-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.md b/results/qwen3-coder-next-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.md new file mode 100644 index 0000000..5cd97ef --- /dev/null +++ b/results/qwen3-coder-next-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.md @@ -0,0 +1,22 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen/qwen3-coder-next +**Backend:** lmstudio +**Scenario:** ops-agent (conversation) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 575 | 1.53s | 4.04s | 67.2 | **48.7** | 5.57s | 271 | +| 2 | 1,043 | 0.67s | 2.74s | 70.5 | **56.7** | 3.40s | 193 | +| 3 | 1,341 | 0.48s | 2.23s | 69.5 | **57.1** | 2.71s | 155 | +| 4 | 1,700 | 0.55s | 2.41s | 68.4 | **55.7** | 2.96s | 165 | +| 5 | 2,102 | 0.54s | 4.14s | 66.7 | **59.0** | 4.68s | 276 | +| 6 | 2,596 | 0.64s | 3.26s | 66.9 | **56.0** | 3.89s | 218 | +| 7 | 2,889 | 0.46s | 2.94s | 67.6 | **58.5** | 3.40s | 199 | +| 8 | 3,274 | 0.75s | 4.85s | 66.2 | **57.4** | 5.60s | 321 | + +**Total prefill:** 5.6s +**Total generation:** 26.6s +**Total time:** 32.2s +**Avg generation tok/s:** 67.9 +**Avg effective tok/s:** 55.8 diff --git a/results/qwen3-coder-next-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.json b/results/qwen3-coder-next-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.json new file mode 100644 index 0000000..ae76b55 --- /dev/null +++ b/results/qwen3-coder-next-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.json @@ -0,0 +1,82 @@ +{ + "meta": { + "scenario": "prefill-test", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio", + "backend": "lmstudio", + "model_info": { + "name": "qwen/qwen3-coder-next", + "format": "gguf" + }, + "runs": 1, + "max_tokens": 150, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T14:39:36" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 655, + "new_tokens_est": 540, + "ttft": 1.577, + "gen_time": 2.048, + "gen_tps": 72.3, + "total": 3.625, + "output_tokens": 148, + "_response": "The port 443 conflict is almost certainly caused by the **Caddy container trying to bind before Docker\u2019s internal DNS/networking is fully ready**, or a previous Caddy instance (or another service like `nginx`/`httpd`) still holding the port. Since Caddy is in `Exited (1)` and logs show \u201caddress already in use\u201d, check for lingering processes:\n\n```bash\nsudo lsof -i :443\n```\n\nIf Caddy (or another service) is still running, kill it. Common culprits: \n- A leftover `caddy` binary process from manual runs (not Docker). \n- macOS\u2019s built-in `httpd` or `nginx` (unlikely but", + "_user": "After rebooting my Mac Studio, several Docker containers won't start properly. Here's what I see:\n\n```\n$ docker ps -a\nCONTAINER ID IMAGE STATUS NAMES\na1b2c3d4e5f6 caddy:2-custom Exited (1) 5 min ago caddy\nb2c3d4e5f6a1 adguard/adguardhome:latest Up 10 minutes adguard\nc3d4e5f6a1b2 ghcr.io/immich-app/immich-server:release Up 8 minutes immich-server\nd4e5f6a1b2c3 ghcr.io/immich-app/immich-machine-learning Up 8 minutes immich-ml\ne5f6a1b2c3d4 tensorchord/pgvecto-rs:pg14-v0.2.0 Up 10 minutes immich-postgres\nf6a1b2c3d4e5 redis:7-alpine Up 10 minutes immich-redis\na1b2c3d4e5f7 matrixdotorg/synapse:latest Restarting (1) 3 min ago synapse\nb2c3d4e5f6a2 postgres:16-alpine Up 10 minutes synapse-postgres\nc3d4e5f6a1b3 ghcr.io/paperless-ngx/paperless-ngx:latest Up 9 minutes paperless\nd4e5f6a1b2c4 ghcr.io/gethomepage/homepage:latest Up 10 minutes homepage\ne5f6a1b2c3d5 louislam/dockge:1 Up 10 minutes dockge\nf6a1b2c3d4e6 codeberg.org/forgejo/forgejo:10 Up 10 minutes forgejo\n```\n\nCaddy exited and Synapse keeps restarting. The Caddy logs show:\n\n```\n2026-03-07 08:00:01 Error: loading initial config: http app module: start: listening on :443: bind: address already in use\n```\n\nSynapse logs show:\n\n```\n2026-03-07 08:01:12 synapse.storage ERROR - Failed to connect to database: connection to server at \"synapse-postgres\" port 5432 failed: FATAL: the database system is starting up\n2026-03-07 08:02:15 synapse.storage ERROR - Failed to connect to database: connection to server at \"synapse-postgres\" port 5432 failed: FATAL: the database system is starting up\n```\n\nEverything else is up but I can't reach any service through HTTPS because Caddy is down. What's blocking port 443 and how do I fix this? Is the Synapse issue related?" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 1453, + "new_tokens_est": 1338, + "ttft": 1.509, + "gen_time": 2.107, + "gen_tps": 68.3, + "total": 3.616, + "output_tokens": 144, + "_response": "Your stack is mostly well-configured, but there are several **critical issues and optimizations** to address:\n\n### \ud83d\udd34 Critical Issues:\n1. **ML container memory limit is too aggressive for your workload** \n - 12GB limit + 98% usage \u2192 constant OOM risk and swapping (even on M1 Max, sustained high memory pressure hurts performance).\n - **Fix**: Increase to `memory: 20G` (you have 64GB RAM), or better yet, *drop the hard limit* and rely on Docker\u2019s default + swap (or use `--memory-swap=-1` in CLI if needed).\n\n2. **Postgres `shared_buffers=512MB` is", + "_user": "Review this complete Docker Compose stack for our photo service and tell me if anything looks wrong, could cause issues, or should be improved:\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - IMMICH_MEDIA_LOCATION=/usr/src/app/upload\n - TZ=Europe/Berlin\n depends_on:\n immich-postgres:\n condition: service_healthy\n immich-redis:\n condition: service_started\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"curl -f http://localhost:2283/api/server/ping || exit 1\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 60s\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n environment:\n - MACHINE_LEARNING_CACHE_FOLDER=/cache\n - TRANSFORMERS_CACHE=/cache\n - TZ=Europe/Berlin\n deploy:\n resources:\n limits:\n memory: 12G\n reservations:\n memory: 4G\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"python3 -c 'import urllib.request; urllib.request.urlopen(\\\"http://localhost:3003/ping\\\")' || exit 1\"]\n interval: 60s\n timeout: 15s\n retries: 3\n start_period: 120s\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n - TZ=Europe/Berlin\n command:\n - postgres\n - -c\n - shared_preload_libraries=vectors.so\n - -c\n - search_path=\"$$user\",public,vectors\n - -c\n - logging_collector=on\n - -c\n - max_wal_size=2GB\n - -c\n - shared_buffers=512MB\n - -c\n - wal_compression=on\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U postgres -d immich\"]\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 30s\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru\n networks:\n - home\n healthcheck:\n test: [\"CMD\", \"redis-cli\", \"ping\"]\n interval: 10s\n timeout: 5s\n retries: 3\n\nvolumes:\n immich-ml-cache:\n driver: local\n\nnetworks:\n home:\n external: true\n```\n\nAnd here is the current Caddy route for this service:\n\n```\n@photos host photos.home.example-home.net\nhandle @photos {\n reverse_proxy immich-server:2283\n}\n```\n\nThe service has been running for 3 months with ~15,000 photos. Recently I noticed:\n1. ML processing takes much longer than it used to (was finishing overnight, now takes 2+ days for a batch of 500 photos)\n2. The Postgres database has grown to 8.4 GB\n3. Memory usage spikes to 11.8 GB during ML processing (limit is 12G)\n4. Occasional 502 errors from Caddy when uploading large videos (>500MB)\n\nHere are the recent resource stats:\n\n```\n$ docker stats --no-stream\nCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O\na1b2c3d4e5f6 immich-server 2.1% 512MB / 64GB 0.8% 2.1GB / 156MB 45MB / 12MB\nb2c3d4e5f6a1 immich-ml 45.2% 11.8GB / 12GB 98.3% 890MB / 234MB 1.2GB / 89MB\nc3d4e5f6a1b2 immich-postgres 1.8% 1.1GB / 64GB 1.7% 234MB / 567MB 3.4GB / 1.8GB\nd4e5f6a1b2c3 immich-redis 0.1% 42MB / 256MB 16.4% 123MB / 98MB 1MB / 0B\n```\n\nAnd the Postgres table sizes:\n\n```\nSELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size\nFROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC LIMIT 15;\n\n schemaname | tablename | size\n-----------+------------------------------+---------\n public | smart_search | 3.2 GB\n public | asset_faces | 1.8 GB\n public | assets | 1.1 GB\n public | exif | 892 MB\n public | asset_job_status | 456 MB\n public | person | 234 MB\n public | albums_assets_assets | 189 MB\n public | activity | 123 MB\n public | move_history | 98 MB\n public | geodata_places | 87 MB\n public | system_metadata | 45 MB\n public | albums | 23 MB\n public | users | 1.2 MB\n public | api_keys | 48 kB\n public | system_config | 16 kB\n```" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 3015, + "new_tokens_est": 2900, + "ttft": 3.115, + "gen_time": 2.144, + "gen_tps": 69.5, + "total": 5.259, + "output_tokens": 149, + "_response": "**What stays exactly the same:** \n- All Docker Compose files, Caddyfile, and container configurations (no changes needed for architecture compatibility\u2014OrbStack handles ARM64 natively). \n- Volumes, data paths (`/Users/alex/server/data/*`), and environment variables. \n- DNS/SSL setup (Hetzner ACME, wildcard cert) works unchanged.\n\n**What may need minor tweaks:** \n- **Ollama models**: M4 Ultra\u2019s Neural Engine and faster GPU will significantly speed up inference\u2014no config change required, but consider reducing `OLLAMA_KEEP_ALIVE` (e.g., to `2m`) if memory pressure occurs. \n- **Immich ML**: You\u2019re already", + "_user": "I need help planning a migration. Here's my current complete server configuration. Review it and suggest what needs to change if I move from Mac Studio M1 Max to Mac Studio M4 Ultra:\n\n## Current Caddyfile\n\n```\n{\n acme_dns hetzner {\n api_token {env.HETZNER_API_TOKEN}\n }\n}\n\n*.home.example-home.net {\n tls {\n dns hetzner {env.HETZNER_API_TOKEN}\n propagation_delay 30s\n propagation_timeout 5m\n }\n\n @status host status.home.example-home.net\n handle @status {\n reverse_proxy homepage:3000\n }\n\n @dns host dns.home.example-home.net\n handle @dns {\n reverse_proxy adguard:80\n }\n\n @photos host photos.home.example-home.net\n handle @photos {\n reverse_proxy immich-server:2283 {\n header_up X-Real-IP {remote_host}\n transport http {\n read_timeout 600s\n }\n }\n }\n\n @chat host chat.home.example-home.net\n handle @chat {\n reverse_proxy open-webui:8080\n }\n\n @messages host messages.home.example-home.net\n handle @messages {\n handle /.well-known/matrix/client {\n header Content-Type application/json\n respond `{\"m.homeserver\":{\"base_url\":\"https://messages.home.example-home.net\"}}`\n }\n handle /.well-known/matrix/server {\n header Content-Type application/json\n respond `{\"m.server\":\"messages.home.example-home.net:443\"}`\n }\n handle /_matrix/* {\n reverse_proxy synapse:8008\n }\n handle {\n reverse_proxy element-web:80\n }\n }\n\n @docs host docs.home.example-home.net\n handle @docs {\n reverse_proxy paperless:8000\n }\n\n @manage host manage.home.example-home.net\n handle @manage {\n reverse_proxy dockge:5001\n }\n\n @code host code.home.example-home.net\n handle @code {\n reverse_proxy forgejo:3000\n }\n\n handle {\n respond \"Not found\" 404\n }\n}\n```\n\n## Docker Compose: Infrastructure\n\n```yaml\nversion: \"3.8\"\n\nservices:\n caddy:\n image: caddy:2-custom\n build:\n context: .\n dockerfile: Dockerfile\n container_name: caddy\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile\n - caddy-data:/data\n - caddy-config:/config\n networks:\n - home\n environment:\n - HETZNER_API_TOKEN=${HETZNER_API_TOKEN}\n\n adguard:\n image: adguard/adguardhome:latest\n container_name: adguard\n restart: unless-stopped\n ports:\n - \"53:53/tcp\"\n - \"53:53/udp\"\n - \"8080:80\"\n volumes:\n - adguard-work:/opt/adguardhome/work\n - adguard-conf:/opt/adguardhome/conf\n networks:\n - home\n\n homepage:\n image: ghcr.io/gethomepage/homepage:latest\n container_name: homepage\n restart: unless-stopped\n ports:\n - \"3001:3000\"\n volumes:\n - ./homepage-config:/app/config\n networks:\n - home\n\n dockge:\n image: louislam/dockge:1\n container_name: dockge\n restart: unless-stopped\n ports:\n - \"5001:5001\"\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - dockge-data:/app/data\n - /Users/alex/server/family-server/stacks:/opt/stacks\n environment:\n - DOCKGE_STACKS_DIR=/opt/stacks\n networks:\n - home\n\nvolumes:\n caddy-data:\n caddy-config:\n adguard-work:\n adguard-conf:\n dockge-data:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Photos (Immich)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - TZ=Europe/Berlin\n depends_on:\n - immich-postgres\n - immich-redis\n networks:\n - home\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n deploy:\n resources:\n limits:\n memory: 12G\n networks:\n - home\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n networks:\n - home\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n networks:\n - home\n\nvolumes:\n immich-ml-cache:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Messages (Matrix)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n synapse:\n image: matrixdotorg/synapse:latest\n container_name: synapse\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/synapse-data:/data\n environment:\n - SYNAPSE_CONFIG_DIR=/data\n depends_on:\n - synapse-postgres\n networks:\n - home\n\n synapse-postgres:\n image: postgres:16-alpine\n container_name: synapse-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/postgres:/var/lib/postgresql/data\n environment:\n - POSTGRES_USER=synapse\n - POSTGRES_PASSWORD=${SYNAPSE_DB_PASSWORD}\n - POSTGRES_DB=synapse\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n networks:\n - home\n\n element-web:\n image: vectorim/element-web:latest\n container_name: element-web\n restart: unless-stopped\n volumes:\n - ./element-config.json:/app/config.json:ro\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Documents (Paperless-ngx)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n paperless:\n image: ghcr.io/paperless-ngx/paperless-ngx:latest\n container_name: paperless\n restart: unless-stopped\n ports:\n - \"8000:8000\"\n volumes:\n - /Users/alex/server/data/documents/data:/usr/src/paperless/data\n - /Users/alex/server/data/documents/media:/usr/src/paperless/media\n - /Users/alex/server/data/documents/consume:/usr/src/paperless/consume\n environment:\n - PAPERLESS_DBENGINE=sqlite\n - PAPERLESS_OCR_LANGUAGE=deu+eng\n - PAPERLESS_URL=https://docs.home.example-home.net\n - PAPERLESS_TIME_ZONE=Europe/Berlin\n - PAPERLESS_OCR_MODE=skip\n - PAPERLESS_TASK_WORKERS=2\n - PAPERLESS_CONSUMER_POLLING=30\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Git (Forgejo)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n forgejo:\n image: codeberg.org/forgejo/forgejo:10\n container_name: forgejo\n restart: unless-stopped\n ports:\n - \"3000:3000\"\n - \"222:22\"\n volumes:\n - /Users/alex/server/data/code-repo:/data\n environment:\n - USER_UID=1000\n - USER_GID=1000\n - FORGEJO__server__ROOT_URL=https://code.home.example-home.net\n - FORGEJO__server__SSH_PORT=222\n - FORGEJO__database__DB_TYPE=sqlite3\n - FORGEJO__service__DISABLE_REGISTRATION=true\n - FORGEJO__repository__DEFAULT_PRIVATE=true\n - FORGEJO__mirror__DEFAULT_INTERVAL=8h\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: AI Bots\n\n```yaml\nversion: \"3.8\"\n\nservices:\n butler:\n image: openclaw-matrix:latest\n build:\n context: ../openclaw\n container_name: butler\n restart: unless-stopped\n volumes:\n - ./config:/root/.openclaw\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@assistant:example-home.net\n - MATRIX_PASSWORD=${BUTLER_MATRIX_PASSWORD}\n networks:\n - home\n\n alfred:\n image: openclaw-matrix:latest\n container_name: alfred\n restart: unless-stopped\n volumes:\n - ./alfred-config:/root/.openclaw\n environment:\n - OPENROUTER_API_KEY=${OPENROUTER_API_KEY}\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@alfred:example-home.net\n - MATRIX_PASSWORD=${ALFRED_MATRIX_PASSWORD}\n networks:\n - home\n - personal-agent\n\n kit:\n image: kit-assistant:latest\n build:\n context: ../assistant\n container_name: kit\n restart: unless-stopped\n volumes:\n - ./kit-workspace:/workspace\n - /var/run/docker.sock:/var/run/docker.sock:ro\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - OLLAMA_MODEL=qwen3-coder:30b\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@kit-bot:example-home.net\n - MATRIX_PASSWORD=${KIT_MATRIX_PASSWORD}\n - FK_HOMEPAGE_URL=http://homepage:3000\n - FK_PAPERLESS_URL=http://paperless:8000\n - FK_OLLAMA_URL=http://host.docker.internal:11434\n networks:\n - home\n\nnetworks:\n home:\n external: true\n personal-agent:\n external: true\n```\n\n## Current Resource Usage\n\n```\n$ docker stats --no-stream\nCONTAINER CPU % MEM USAGE / LIMIT NET I/O BLOCK I/O\ncaddy 0.1% 42MB / 64GB 12GB / 8.4GB 45MB / 12MB\nadguard 0.3% 128MB / 64GB 890MB / 234MB 123MB / 67MB\nimmich-server 2.1% 512MB / 64GB 2.1GB / 156MB 45MB / 12MB\nimmich-ml 0.2% 2.1GB / 12GB 890MB / 234MB 1.2GB / 89MB\nimmich-pg 1.8% 1.1GB / 64GB 234MB / 567MB 3.4GB / 1.8GB\nimmich-redis 0.1% 42MB / 64GB 123MB / 98MB 1MB / 0B\nsynapse 0.4% 380MB / 64GB 456MB / 234MB 890MB / 345MB\nsynapse-pg 0.2% 256MB / 64GB 234MB / 123MB 1.2GB / 678MB\nelement-web 0.0% 12MB / 64GB 45MB / 89MB 1MB / 0B\npaperless 0.2% 620MB / 64GB 123MB / 67MB 2.3GB / 1.1GB\nhomepage 0.0% 38MB / 64GB 23MB / 12MB 5MB / 1MB\ndockge 0.1% 52MB / 64GB 12MB / 8MB 3MB / 1MB\nforgejo 0.1% 95MB / 64GB 45MB / 23MB 234MB / 67MB\nbutler 0.1% 180MB / 64GB 23MB / 12MB 12MB / 3MB\nalfred 0.1% 180MB / 64GB 34MB / 18MB 15MB / 4MB\nkit 0.3% 210MB / 64GB 67MB / 34MB 23MB / 8MB\n```\n\n## Disk Usage\n\n```\n$ df -h\nFilesystem Size Used Avail Use% Mounted on\n/dev/disk1s1 3.6T 1.2T 2.4T 33% /\n/dev/disk5s1 5.5T 3.8T 1.7T 69% /Volumes/backup-vault\n/dev/disk4s1 5.5T 4.1T 1.4T 75% /Volumes/time-machine\n\n$ du -sh ~/server/data/*\n634G /Users/alex/server/data/photos\n12G /Users/alex/server/data/documents\n2.1G /Users/alex/server/data/messages\n890M /Users/alex/server/data/code-repo\n```\n\n## Ollama Configuration\n\n```\n$ ollama list\nNAME SIZE MODIFIED\nllama3.1:8b 4.7 GB 2 days ago\nqwen2.5:32b 19 GB 5 days ago\nqwen3-coder:30b 17 GB 1 day ago\nqwen3.5:35b-a3b 21 GB 3 hours ago\n\n$ cat ~/Library/LaunchAgents/com.ollama.plist | grep -A1 OLLAMA\nOLLAMA_HOST\n0.0.0.0\nOLLAMA_KEEP_ALIVE\n5m\n```\n\nWhat needs to change for the M4 Ultra migration? What can I keep as-is? Any performance improvements I should expect?" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 8496, + "new_tokens_est": 8381, + "ttft": 13.55, + "gen_time": 2.304, + "gen_tps": 62.1, + "total": 15.854, + "output_tokens": 143, + "_response": "### \ud83d\udd0d **Audit Summary**\n\n#### \u2705 **Strengths**\n- All 17 containers healthy, stable uptime (3\u20134+ days).\n- TLS certs managed via Caddy + Hetzner DNS-01 challenge (robust).\n- Backups: dual-layer (rsync + Time Machine), WORM protection on vault drive.\n- DNS filtering effective: 26\u201327% ad/tracker blocking, low latency (~13ms).\n- Paperless auto-classification working well (OCR, tagging, amount detection).\n- Immich ML processing efficient; memory GC triggered under pressure.\n\n---\n\n#### \u26a0\ufe0f **Critical Issues**\n\n1. **Guest client bypassing AdGuard (`192.1", + "_user": "Here is our complete server configuration and 24-hour log bundle. Audit everything for issues, security concerns, and optimization opportunities:\n\n## Caddyfile\n\n```\n{\n acme_dns hetzner {\n api_token {env.HETZNER_API_TOKEN}\n }\n}\n\n*.home.example-home.net {\n tls {\n dns hetzner {env.HETZNER_API_TOKEN}\n propagation_delay 30s\n propagation_timeout 5m\n }\n\n @status host status.home.example-home.net\n handle @status {\n reverse_proxy homepage:3000\n }\n\n @dns host dns.home.example-home.net\n handle @dns {\n reverse_proxy adguard:80\n }\n\n @photos host photos.home.example-home.net\n handle @photos {\n reverse_proxy immich-server:2283 {\n header_up X-Real-IP {remote_host}\n transport http {\n read_timeout 600s\n }\n }\n }\n\n @chat host chat.home.example-home.net\n handle @chat {\n reverse_proxy open-webui:8080\n }\n\n @messages host messages.home.example-home.net\n handle @messages {\n handle /.well-known/matrix/client {\n header Content-Type application/json\n respond `{\"m.homeserver\":{\"base_url\":\"https://messages.home.example-home.net\"}}`\n }\n handle /.well-known/matrix/server {\n header Content-Type application/json\n respond `{\"m.server\":\"messages.home.example-home.net:443\"}`\n }\n handle /_matrix/* {\n reverse_proxy synapse:8008\n }\n handle {\n reverse_proxy element-web:80\n }\n }\n\n @docs host docs.home.example-home.net\n handle @docs {\n reverse_proxy paperless:8000\n }\n\n @manage host manage.home.example-home.net\n handle @manage {\n reverse_proxy dockge:5001\n }\n\n @code host code.home.example-home.net\n handle @code {\n reverse_proxy forgejo:3000\n }\n\n handle {\n respond \"Not found\" 404\n }\n}\n```\n\n## Docker Compose: Infrastructure\n\n```yaml\nversion: \"3.8\"\n\nservices:\n caddy:\n image: caddy:2-custom\n build:\n context: .\n dockerfile: Dockerfile\n container_name: caddy\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile\n - caddy-data:/data\n - caddy-config:/config\n networks:\n - home\n environment:\n - HETZNER_API_TOKEN=${HETZNER_API_TOKEN}\n\n adguard:\n image: adguard/adguardhome:latest\n container_name: adguard\n restart: unless-stopped\n ports:\n - \"53:53/tcp\"\n - \"53:53/udp\"\n - \"8080:80\"\n volumes:\n - adguard-work:/opt/adguardhome/work\n - adguard-conf:/opt/adguardhome/conf\n networks:\n - home\n\n homepage:\n image: ghcr.io/gethomepage/homepage:latest\n container_name: homepage\n restart: unless-stopped\n ports:\n - \"3001:3000\"\n volumes:\n - ./homepage-config:/app/config\n networks:\n - home\n env_file:\n - .env\n\n dockge:\n image: louislam/dockge:1\n container_name: dockge\n restart: unless-stopped\n ports:\n - \"5001:5001\"\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - dockge-data:/app/data\n - /Users/alex/server/family-server/stacks:/opt/stacks\n environment:\n - DOCKGE_STACKS_DIR=/opt/stacks\n networks:\n - home\n\nvolumes:\n caddy-data:\n caddy-config:\n adguard-work:\n adguard-conf:\n dockge-data:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Photos (Immich)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - TZ=Europe/Berlin\n depends_on:\n - immich-postgres\n - immich-redis\n networks:\n - home\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n deploy:\n resources:\n limits:\n memory: 12G\n networks:\n - home\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n networks:\n - home\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n networks:\n - home\n\nvolumes:\n immich-ml-cache:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Messages (Matrix)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n synapse:\n image: matrixdotorg/synapse:latest\n container_name: synapse\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/synapse-data:/data\n environment:\n - SYNAPSE_CONFIG_DIR=/data\n depends_on:\n - synapse-postgres\n networks:\n - home\n\n synapse-postgres:\n image: postgres:16-alpine\n container_name: synapse-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/postgres:/var/lib/postgresql/data\n environment:\n - POSTGRES_USER=synapse\n - POSTGRES_PASSWORD=${SYNAPSE_DB_PASSWORD}\n - POSTGRES_DB=synapse\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n networks:\n - home\n\n element-web:\n image: vectorim/element-web:latest\n container_name: element-web\n restart: unless-stopped\n volumes:\n - ./element-config.json:/app/config.json:ro\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Documents (Paperless-ngx)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n paperless:\n image: ghcr.io/paperless-ngx/paperless-ngx:latest\n container_name: paperless\n restart: unless-stopped\n ports:\n - \"8000:8000\"\n volumes:\n - /Users/alex/server/data/documents/data:/usr/src/paperless/data\n - /Users/alex/server/data/documents/media:/usr/src/paperless/media\n - /Users/alex/server/data/documents/consume:/usr/src/paperless/consume\n environment:\n - PAPERLESS_DBENGINE=sqlite\n - PAPERLESS_OCR_LANGUAGE=deu+eng\n - PAPERLESS_URL=https://docs.home.example-home.net\n - PAPERLESS_TIME_ZONE=Europe/Berlin\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Git (Forgejo)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n forgejo:\n image: codeberg.org/forgejo/forgejo:10\n container_name: forgejo\n restart: unless-stopped\n ports:\n - \"3000:3000\"\n - \"222:22\"\n volumes:\n - /Users/alex/server/data/code-repo:/data\n environment:\n - USER_UID=1000\n - USER_GID=1000\n - FORGEJO__server__ROOT_URL=https://code.home.example-home.net\n - FORGEJO__server__SSH_PORT=222\n - FORGEJO__database__DB_TYPE=sqlite3\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: AI Bots\n\n```yaml\nversion: \"3.8\"\n\nservices:\n butler:\n image: openclaw-matrix:latest\n build:\n context: ../openclaw\n container_name: butler\n restart: unless-stopped\n volumes:\n - ./config:/root/.openclaw\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@assistant:example-home.net\n - MATRIX_PASSWORD=${BUTLER_MATRIX_PASSWORD}\n networks:\n - home\n\n alfred:\n image: openclaw-matrix:latest\n container_name: alfred\n restart: unless-stopped\n volumes:\n - ./alfred-config:/root/.openclaw\n environment:\n - OPENROUTER_API_KEY=${OPENROUTER_API_KEY}\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@alfred:example-home.net\n - MATRIX_PASSWORD=${ALFRED_MATRIX_PASSWORD}\n networks:\n - home\n - personal-agent\n\n kit:\n image: kit-assistant:latest\n build:\n context: ../assistant\n container_name: kit\n restart: unless-stopped\n volumes:\n - ./kit-workspace:/workspace\n - /var/run/docker.sock:/var/run/docker.sock:ro\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - OLLAMA_MODEL=qwen3-coder:30b\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@kit-bot:example-home.net\n - MATRIX_PASSWORD=${KIT_MATRIX_PASSWORD}\n - FK_HOMEPAGE_URL=http://homepage:3000\n - FK_PAPERLESS_URL=http://paperless:8000\n - FK_OLLAMA_URL=http://host.docker.internal:11434\n networks:\n - home\n\nnetworks:\n home:\n external: true\n personal-agent:\n external: true\n```\n\n## Backup Configuration (vault-sync.sh excerpt)\n\n```bash\n#!/bin/bash\nset -euo pipefail\n\nVAULT_NAME=\"backup-vault\"\nDATA_DIR=\"$HOME/server/data\"\nSNAPSHOT_DIR=\"/Volumes/$VAULT_NAME/snapshots/$(date +%Y-%m-%d)\"\nLOG_FILE=\"$DATA_DIR/logs/vault-sync.log\"\n\n# Unlock vault drive from keychain\nPASS=$(security find-generic-password -s \"$VAULT_NAME\" -w 2>/dev/null)\necho \"$PASS\" | diskutil apfs unlockVolume \"$VAULT_NAME\" -stdinpassphrase\n\n# Rsync with delete (mirror)\nrsync -av --delete \\\n --exclude '.DS_Store' \\\n --exclude '*.tmp' \\\n --exclude 'immich-ml-cache/' \\\n \"$DATA_DIR/\" \"$SNAPSHOT_DIR/\"\n\n# Apply WORM protection\nchflags -R uchg \"$SNAPSHOT_DIR/\"\n\n# Try to eject (non-fatal if it fails)\ndiskutil eject \"$VAULT_NAME\" 2>/dev/null || true\n```\n\n## Ollama Configuration\n\n```\n$ ollama list\nNAME SIZE MODIFIED\nllama3.1:8b 4.7 GB 2 days ago\nqwen2.5:32b 19 GB 5 days ago\nqwen3-coder:30b 17 GB 1 day ago\nqwen3.5:35b-a3b 21 GB 3 hours ago\n\n$ ollama ps\nNAME SIZE PROCESSOR UNTIL\nqwen3.5:35b-a3b 21 GB 100% GPU 4 minutes from now\n```\n\n## Server Logs: Last 24 Hours\n\n```\n=== 2026-03-06 22:00 - EVENING STATUS ===\n\n2026-03-06 22:00:00 [docker] INFO: Container health check summary:\n2026-03-06 22:00:00 [docker] caddy: healthy (uptime: 3d 15h)\n2026-03-06 22:00:00 [docker] adguard: healthy (uptime: 3d 15h)\n2026-03-06 22:00:00 [docker] immich-server: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] immich-ml: healthy (uptime: 3d 15h) [idle]\n2026-03-06 22:00:01 [docker] immich-postgres: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] immich-redis: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] synapse: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] synapse-postgres: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] element-web: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] paperless: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] homepage: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] dockge: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] forgejo: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] butler: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] alfred: healthy (uptime: 3d 15h)\n2026-03-06 22:00:03 [docker] kit: healthy (uptime: 23h)\n2026-03-06 22:00:03 [docker] server-bot: healthy (uptime: 3d 15h)\n2026-03-06 22:00:03 [docker] INFO: 17/17 containers healthy. Memory: 38.4GB / 64GB\n\n2026-03-06 22:00:05 [adguard] INFO: Daily DNS statistics:\n2026-03-06 22:00:05 [adguard] INFO: Total queries today: 134,521\n2026-03-06 22:00:05 [adguard] INFO: Blocked: 36,847 (27.4%)\n2026-03-06 22:00:05 [adguard] INFO: Average response time: 13ms\n2026-03-06 22:00:06 [adguard] INFO: Top blocked domains:\n2026-03-06 22:00:06 [adguard] INFO: 1. telemetry.microsoft.com (7,842 queries)\n2026-03-06 22:00:06 [adguard] INFO: 2. ads.google.com (3,921 queries)\n2026-03-06 22:00:06 [adguard] INFO: 3. graph.facebook.com (3,456 queries)\n2026-03-06 22:00:06 [adguard] INFO: 4. app-measurement.com (2,847 queries)\n2026-03-06 22:00:06 [adguard] INFO: 5. analytics.google.com (2,134 queries)\n2026-03-06 22:00:07 [adguard] INFO: Unique clients: 8\n2026-03-06 22:00:07 [adguard] INFO: Client breakdown:\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.46 (mac-alex): 42,847 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.101 (iphone-alex): 31,234 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.102 (ipad-kids): 24,567 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.105 (macbook-alex): 18,934 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.110 (smart-tv): 8,234 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.111 (echo-kitchen): 5,123 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.112 (echo-living): 3,456 queries\n2026-03-06 22:00:08 [adguard] WARNING: Client 192.168.188.103 (laptop-guest) bypassed AdGuard for 24h\n2026-03-06 22:00:08 [adguard] WARNING: 1,847 direct queries to external DNS detected\n2026-03-06 22:00:08 [adguard] INFO: Upstream DNS performance:\n2026-03-06 22:00:09 [adguard] INFO: 1.1.1.1 (Cloudflare): avg 11ms, p99 45ms\n2026-03-06 22:00:09 [adguard] INFO: 8.8.8.8 (Google): avg 16ms, p99 67ms\n\n2026-03-06 22:15:00 [synapse] INFO: POST /_matrix/client/v3/rooms/!fam123:example-home.net/send/m.room.message - 200 OK (8ms)\n2026-03-06 22:15:01 [synapse] INFO: PUT /_matrix/client/v3/rooms/!fam123:example-home.net/read_markers - 200 OK (3ms)\n2026-03-06 22:30:00 [synapse] INFO: Background job: purge_old_device_messages completed (12ms)\n2026-03-06 23:00:00 [synapse] INFO: Background job: purge_expired_account_data completed (45ms)\n\n=== 2026-03-07 00:00 - MIDNIGHT ===\n\n2026-03-07 00:00:00 [adguard] INFO: DNS filter list update check\n2026-03-07 00:00:02 [adguard] INFO: AdGuard DNS filter: 48,234 rules (no update)\n2026-03-07 00:00:02 [adguard] INFO: OISD Full: 312,847 rules (updated, +234 rules)\n2026-03-07 00:00:03 [adguard] INFO: Steven Black hosts: 89,234 rules (no update)\n2026-03-07 00:00:03 [adguard] INFO: Total active rules: 450,315\n\n2026-03-07 00:30:00 [forgejo] INFO: Repository statistics update\n2026-03-07 00:30:01 [forgejo] INFO: Repositories: 8 (5 active, 2 mirrors, 1 archived)\n2026-03-07 00:30:01 [forgejo] INFO: Total git objects: 12,847\n2026-03-07 00:30:01 [forgejo] INFO: Total LFS objects: 0\n2026-03-07 00:30:02 [forgejo] INFO: Database size: 23MB\n\n=== 2026-03-07 02:00 - BACKUP JOB ===\n\n2026-03-07 01:55:00 [cron] Starting vault-sync backup job\n2026-03-07 01:55:01 [vault-sync] INFO: Checking vault drive status...\n2026-03-07 01:55:01 [vault-sync] INFO: Volume 'backup-vault' not mounted, attempting unlock\n2026-03-07 01:55:02 [vault-sync] INFO: Retrieving passphrase from login keychain\n2026-03-07 01:55:02 [vault-sync] INFO: Running: diskutil apfs unlockVolume backup-vault -stdinpassphrase\n2026-03-07 01:55:08 [vault-sync] INFO: Volume backup-vault mounted at /Volumes/backup-vault\n2026-03-07 01:55:08 [vault-sync] INFO: Previous snapshot found: 2026-03-06 (823.4 GB)\n2026-03-07 01:55:08 [vault-sync] INFO: Starting rsync: /Users/alex/server/data/ -> /Volumes/backup-vault/snapshots/2026-03-07/\n2026-03-07 01:55:08 [rsync] building file list... done\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4501.jpg (4.2MB)\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4502.jpg (3.8MB)\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4503.jpg (5.1MB)\n2026-03-07 01:55:10 [rsync] photos/upload/library/2026/03/06/IMG_4504.jpg (4.7MB)\n2026-03-07 01:55:10 [rsync] photos/upload/library/2026/03/06/IMG_4505.jpg (3.9MB)\n2026-03-07 01:55:11 [rsync] photos/upload/library/2026/03/06/IMG_4506.jpg (4.4MB)\n2026-03-07 01:55:11 [rsync] photos/upload/library/2026/03/06/IMG_4507.heic (2.1MB)\n2026-03-07 01:55:12 [rsync] photos/upload/library/2026/03/06/IMG_4508.heic (2.3MB)\n2026-03-07 01:55:12 [rsync] photos/upload/library/2026/03/06/IMG_4509.heic (1.9MB)\n2026-03-07 01:55:13 [rsync] photos/upload/library/2026/03/06/IMG_4510.heic (2.5MB)\n2026-03-07 01:55:13 [rsync] photos/upload/library/2026/03/06/IMG_4511.mov (234MB)\n2026-03-07 01:55:18 [rsync] photos/upload/library/2026/03/06/IMG_4512.mov (189MB)\n2026-03-07 01:55:24 [rsync] photos/upload/library/2026/03/06/IMG_4513.mov (312MB)\n2026-03-07 01:55:30 [rsync] photos/upload/library/2026/03/06/IMG_4514.jpg (4.8MB)\n2026-03-07 01:55:30 [rsync] photos/upload/library/2026/03/06/IMG_4515.jpg (3.6MB)\n2026-03-07 01:55:31 [rsync] photos/upload/library/2026/03/06/IMG_4516.jpg (5.2MB)\n2026-03-07 01:55:31 [rsync] photos/upload/library/2026/03/06/IMG_4517.jpg (4.1MB)\n2026-03-07 01:55:32 [rsync] photos/upload/library/2026/03/06/IMG_4518.jpg (3.7MB)\n2026-03-07 01:55:32 [rsync] photos/upload/library/2026/03/06/IMG_4519.jpg (4.9MB)\n2026-03-07 01:55:33 [rsync] photos/upload/library/2026/03/06/IMG_4520.jpg (3.4MB)\n2026-03-07 01:55:33 [rsync] photos/upload/library/2026/03/06/IMG_4521.jpg (4.6MB)\n2026-03-07 01:55:34 [rsync] photos/upload/thumbs/2026/03/06/ (42 files, 8.4MB total)\n2026-03-07 01:55:36 [rsync] photos/upload/encoded-video/2026/03/06/ (3 files, 67MB total)\n2026-03-07 01:55:40 [rsync] photos/db/base/16384/ (delta sync, 12MB)\n2026-03-07 01:55:41 [rsync] documents/data/index/whoosh/ (12 files, 45MB)\n2026-03-07 01:55:41 [rsync] documents/media/documents/originals/2026/03/ (3 files, 2.1MB)\n2026-03-07 01:55:41 [rsync] documents/media/documents/thumbnails/2026/03/ (3 files, 890KB)\n2026-03-07 01:55:42 [rsync] documents/data/db.sqlite3 (234MB)\n2026-03-07 01:55:43 [rsync] messages/synapse-data/media_store/local_content/ (8 files, 12MB)\n2026-03-07 01:55:43 [rsync] messages/synapse-data/media_store/local_thumbnails/ (8 files, 1.2MB)\n2026-03-07 01:55:44 [rsync] messages/postgres/base/16384/ (14 files, delta)\n2026-03-07 01:55:44 [rsync] messages/postgres/pg_wal/000000010000000000000047 (16MB)\n2026-03-07 01:55:44 [rsync] messages/postgres/pg_wal/000000010000000000000048 (16MB)\n2026-03-07 01:55:45 [rsync] code-repo/data/gitea-repositories/alex/ (4 repos, delta)\n2026-03-07 01:55:45 [rsync] code-repo/data/gitea.db (23MB)\n2026-03-07 01:55:46 [rsync] logs/ (2 files, 1.2MB)\n2026-03-07 01:55:46 [rsync] sent 12,438,291,456 bytes received 48,721 bytes 24,876,580,354.00 bytes/sec\n2026-03-07 01:55:46 [rsync] total size is 892,341,567,488 speedup is 71.74\n2026-03-07 01:55:46 [vault-sync] INFO: rsync completed: 1,847 files, 12.4 GB transferred\n2026-03-07 01:55:47 [vault-sync] INFO: Applying uchg flags to snapshot...\n2026-03-07 01:55:48 [vault-sync] INFO: chflags -R uchg /Volumes/backup-vault/snapshots/2026-03-07/\n2026-03-07 01:56:12 [vault-sync] INFO: uchg flags applied to 23,847 items (24.2s)\n2026-03-07 01:56:12 [vault-sync] INFO: Attempting vault eject...\n2026-03-07 01:56:13 [vault-sync] ERROR: diskutil eject failed: 'Dissent error 49153'\n2026-03-07 01:56:13 [vault-sync] WARNING: Vault eject failed (non-fatal). Drive remains mounted but protected by uchg.\n2026-03-07 01:56:14 [vault-sync] INFO: Sending notification...\n2026-03-07 01:56:14 [vault-sync] INFO: macOS notification sent: \"Backup completed with warnings\"\n2026-03-07 01:56:14 [vault-sync] INFO: Backup completed with warnings. Duration: 1m 14s\n2026-03-07 02:00:00 [cron] Next vault-sync scheduled: 2026-03-08 02:00:00\n\n=== 2026-03-07 03:00 - TIME MACHINE ===\n\n2026-03-07 03:00:01 [timemachine] INFO: Starting automatic backup\n2026-03-07 03:00:02 [timemachine] INFO: Destination: time-machine (APFS, /Volumes/time-machine)\n2026-03-07 03:00:03 [timemachine] INFO: Preparing backup...\n2026-03-07 03:00:15 [timemachine] INFO: Calculating changes since 2026-03-06 03:00:00\n2026-03-07 03:00:45 [timemachine] INFO: 4,521 items changed (12.8 GB)\n2026-03-07 03:01:00 [timemachine] INFO: Copying files...\n2026-03-07 03:08:42 [timemachine] INFO: Creating snapshot...\n2026-03-07 03:08:55 [timemachine] INFO: Verifying backup integrity...\n2026-03-07 03:09:12 [timemachine] INFO: Backup completed successfully\n2026-03-07 03:09:12 [timemachine] INFO: Duration: 9m 11s\n2026-03-07 03:09:12 [timemachine] INFO: Total backups on disk: 51 (oldest: 2026-01-15)\n2026-03-07 03:09:13 [timemachine] INFO: Disk usage: 4.1TB / 5.5TB (75%)\n2026-03-07 03:09:13 [timemachine] WARNING: Time Machine disk above 70% - oldest backups will be pruned automatically\n\n=== 2026-03-07 06:00 - MORNING ===\n\n2026-03-07 06:00:00 [docker] INFO: Container health check summary:\n2026-03-07 06:00:00 [docker] All 17 containers healthy. Memory: 36.2GB / 64GB\n\n2026-03-07 06:00:01 [caddy] INFO: TLS certificate renewal check\n2026-03-07 06:00:02 [caddy] INFO: Certificate for *.home.example-home.net valid until 2026-06-05 (90 days)\n2026-03-07 06:00:02 [caddy] INFO: No renewal needed\n\n2026-03-07 06:30:00 [adguard] INFO: Hourly DNS: 1,234 queries, 312 blocked (25.3%)\n2026-03-07 07:00:00 [adguard] INFO: Hourly DNS: 4,567 queries, 1,234 blocked (27.0%)\n2026-03-07 07:00:01 [adguard] INFO: Top client this hour: 192.168.188.101 (iphone-alex) - woke up\n\n=== 2026-03-07 07:30 - USER ACTIVITY ===\n\n2026-03-07 07:30:12 [synapse] INFO: POST /_matrix/client/v3/login - @admin:example-home.net - 200 OK (18ms)\n2026-03-07 07:30:13 [synapse] INFO: GET /_matrix/client/v3/sync - @admin:example-home.net - 200 OK (234ms)\n2026-03-07 07:30:15 [synapse] INFO: GET /_matrix/client/v3/sync - @kit-bot:example-home.net - 200 OK (89ms)\n2026-03-07 07:30:16 [synapse] INFO: GET /_matrix/client/v3/sync - @server-bot:example-home.net - 200 OK (45ms)\n2026-03-07 07:30:45 [synapse] INFO: PUT /_matrix/client/v3/rooms/!srv123:example-home.net/send/m.room.message - 200 OK (8ms)\n2026-03-07 07:30:46 [kit] INFO: Received message in #server from @admin:example-home.net: \"good morning, how's the server?\"\n2026-03-07 07:30:46 [kit] INFO: Processing with qwen3-coder:30b via Ollama\n2026-03-07 07:30:47 [ollama] INFO: Model qwen3-coder:30b not loaded, loading... (17.3GB)\n2026-03-07 07:31:02 [ollama] INFO: Model loaded in 15.4s (GPU: 100%)\n2026-03-07 07:31:02 [kit] INFO: Sending prompt (847 tokens, including system + tools)\n2026-03-07 07:31:05 [kit] INFO: TTFT: 3.2s\n2026-03-07 07:31:05 [kit] INFO: Running tool: fk status\n2026-03-07 07:31:06 [kit] INFO: Tool result: 1,234 chars\n2026-03-07 07:31:06 [kit] INFO: Sending follow-up (2,081 tokens with tool result)\n2026-03-07 07:31:12 [kit] INFO: TTFT: 5.8s\n2026-03-07 07:31:28 [kit] INFO: Response complete: 278 tokens in 16.2s (17.1 tok/s generation)\n2026-03-07 07:31:28 [synapse] INFO: PUT /_matrix/client/v3/rooms/!srv123:example-home.net/send/m.room.message - 200 OK (6ms)\n\n=== 2026-03-07 07:45 - PAPERLESS CONSUMPTION ===\n\n2026-03-07 07:45:00 [paperless] INFO: Starting scheduled document consumption\n2026-03-07 07:45:01 [paperless] INFO: Checking consume directory: /usr/src/paperless/consume\n2026-03-07 07:45:01 [paperless] INFO: Found 3 new files\n2026-03-07 07:45:02 [paperless] INFO: Processing: school-report-emma-2026.pdf (845KB, 3 pages)\n2026-03-07 07:45:07 [paperless] INFO: OCR completed (lang=deu, confidence=0.97)\n2026-03-07 07:45:08 [paperless] INFO: Text extraction: 2,847 chars\n2026-03-07 07:45:08 [paperless] INFO: Running classifier...\n2026-03-07 07:45:09 [paperless] INFO: Auto-classified: Type=School, Correspondent=Grundschule am Waldrand\n2026-03-07 07:45:09 [paperless] INFO: Auto-tagged: [education, emma, zwischenzeugnis, 2026]\n2026-03-07 07:45:10 [paperless] INFO: Stored as document #847\n2026-03-07 07:45:11 [paperless] INFO: Processing: swimming-certificate-max.pdf (234KB, 1 page)\n2026-03-07 07:45:14 [paperless] INFO: OCR completed (lang=deu, confidence=0.94)\n2026-03-07 07:45:15 [paperless] INFO: Auto-classified: Type=Certificate, Correspondent=DLRG\n2026-03-07 07:45:15 [paperless] INFO: Auto-tagged: [sports, max, swimming, bronze, 2026]\n2026-03-07 07:45:16 [paperless] INFO: Stored as document #848\n2026-03-07 07:45:17 [paperless] INFO: Processing: electricity-bill-march-2026.pdf (567KB, 2 pages)\n2026-03-07 07:45:21 [paperless] INFO: OCR completed (lang=deu, confidence=0.99)\n2026-03-07 07:45:22 [paperless] INFO: Auto-classified: Type=Invoice, Correspondent=Stadtwerke Musterstadt\n2026-03-07 07:45:22 [paperless] INFO: Auto-tagged: [utilities, electricity, invoice, 2026]\n2026-03-07 07:45:22 [paperless] INFO: Detected amount: 1,735.80 EUR\n2026-03-07 07:45:23 [paperless] INFO: Stored as document #849\n2026-03-07 07:45:23 [paperless] INFO: Consumption complete. 3 documents processed, 0 errors.\n\n2026-03-07 07:45:30 [archivist-bot] INFO: Received notification: 3 new documents in Paperless\n2026-03-07 07:45:31 [archivist-bot] INFO: Posting summary to #documents room\n2026-03-07 07:45:31 [synapse] INFO: PUT /_matrix/client/v3/rooms/!doc123:example-home.net/send/m.room.message - 200 OK (5ms)\n\n=== 2026-03-07 08:00 - IMMICH ML PROCESSING ===\n\n2026-03-07 08:00:01 [immich-server] INFO: Server health check: OK\n2026-03-07 08:00:01 [immich-server] INFO: Connected to database: OK (latency: 2ms)\n2026-03-07 08:00:01 [immich-server] INFO: Connected to Redis: OK\n2026-03-07 08:00:02 [immich-server] INFO: Asset statistics: 15,234 photos, 892 videos, 634GB total\n2026-03-07 08:00:05 [immich-ml] INFO: Loading CLIP model: ViT-B-32__openai\n2026-03-07 08:00:12 [immich-ml] INFO: CLIP model loaded (7.2s, 890MB GPU memory)\n2026-03-07 08:00:13 [immich-ml] INFO: Loading facial recognition model: buffalo_l\n2026-03-07 08:00:18 [immich-ml] INFO: Facial recognition model loaded (5.1s, 1.2GB GPU memory)\n2026-03-07 08:00:18 [immich-ml] INFO: Starting job queue processing\n2026-03-07 08:00:19 [immich-ml] INFO: Found 1,203 unprocessed assets in queue (from yesterday's upload)\n2026-03-07 08:00:20 [immich-ml] INFO: Processing batch 1/1203 - facial recognition\n2026-03-07 08:00:22 [immich-ml] INFO: Found 2 faces in IMG_4501.jpg (confidence: 0.97, 0.91)\n2026-03-07 08:00:22 [immich-ml] INFO: Matched: Person #1 (Emma), Person #3 (Max)\n2026-03-07 08:00:24 [immich-ml] INFO: Processing batch 2/1203 - CLIP embedding\n2026-03-07 08:00:26 [immich-ml] INFO: Generated CLIP embedding for IMG_4501.jpg (512-dim, 1.8s)\n2026-03-07 08:00:28 [immich-ml] INFO: Processing batch 3/1203 - facial recognition\n2026-03-07 08:00:30 [immich-ml] INFO: Found 4 faces in IMG_4502.jpg (confidence: 0.98, 0.95, 0.88, 0.71)\n2026-03-07 08:00:30 [immich-ml] INFO: Matched: Person #1 (Emma), Person #3 (Max), Person #5 (Alex)\n2026-03-07 08:00:30 [immich-ml] INFO: New face detected (confidence: 0.71) - added to unmatched queue\n2026-03-07 08:00:32 [immich-ml] INFO: Processing batch 4/1203 - CLIP embedding\n2026-03-07 08:00:34 [immich-ml] INFO: Generated CLIP embedding for IMG_4502.jpg (512-dim, 1.6s)\n2026-03-07 08:05:00 [immich-ml] INFO: Progress: 67/1203 (5.6%), ETA: ~2h 15min\n2026-03-07 08:10:00 [immich-ml] INFO: Progress: 134/1203 (11.1%), memory: 9.8GB/12GB\n2026-03-07 08:12:33 [immich-ml] INFO: Processing batch 847/1203 - facial recognition\n2026-03-07 08:12:34 [immich-ml] INFO: Found 3 faces in IMG_4521.jpg (confidence: 0.94, 0.87, 0.72)\n2026-03-07 08:12:35 [immich-ml] INFO: Clustering face embeddings... 12,847 vectors\n2026-03-07 08:12:38 [immich-ml] INFO: Clustering complete: 23 persons identified, 47 unmatched\n2026-03-07 08:12:39 [immich-ml] INFO: Processing batch 848/1203 - facial recognition\n2026-03-07 08:12:40 [immich-ml] INFO: Processing batch 849/1203 - CLIP embedding\n2026-03-07 08:12:42 [immich-ml] INFO: Generated CLIP embedding for IMG_4522.jpg (512-dim)\n2026-03-07 08:12:44 [immich-ml] WARNING: Low memory condition detected (11.8GB/12GB = 98.3%)\n2026-03-07 08:12:44 [immich-ml] WARNING: Triggering garbage collection...\n2026-03-07 08:12:45 [immich-ml] INFO: Memory reclaimed: 1.2GB freed (now 10.6GB/12GB)\n2026-03-07 08:12:46 [immich-ml] INFO: Processing batch 850/1203 - facial recognition\n2026-03-07 08:12:50 [immich-ml] INFO: Queue status: 353 remaining, ETA: ~47 minutes\n2026-03-07 08:30:00 [immich-ml] INFO: Progress: 956/1203 (79.5%), memory: 11.2GB/12GB\n2026-03-07 08:45:00 [immich-ml] INFO: Progress: 1089/1203 (90.5%)\n2026-03-07 08:55:00 [immich-ml] INFO: Progress: 1198/1203 (99.6%)\n2026-03-07 08:56:12 [immich-ml] INFO: Queue processing complete: 1,203 assets processed\n2026-03-07 08:56:12 [immich-ml] INFO: Results: 3,847 faces found, 23 persons, 1,203 CLIP embeddings\n2026-03-07 08:56:13 [immich-ml] INFO: Total processing time: 56m 13s\n2026-03-07 08:56:13 [immich-ml] INFO: Entering idle mode\n\n=== 2026-03-07 10:00 - MIDMORNING ===\n\n2026-03-07 10:00:00 [adguard] INFO: Hourly DNS: 12,847 queries, 3,421 blocked (26.6%)\n2026-03-07 10:00:01 [adguard] WARNING: Client 192.168.188.103 still bypassing AdGuard DNS\n\n2026-03-07 10:15:00 [homepage] INFO: Widget refresh cycle\n2026-03-07 10:15:01 [homepage] INFO: AdGuard widget: OK (23ms)\n2026-03-07 10:15:01 [homepage] INFO: Immich widget: OK (124ms) - 15,234 photos\n2026-03-07 10:15:02 [homepage] WARNING: Paperless widget: timeout (5000ms)\n2026-03-07 10:15:02 [homepage] INFO: Forgejo widget: OK (87ms)\n2026-03-07 10:15:03 [homepage] INFO: Synapse widget: OK (201ms)\n2026-03-07 10:15:03 [homepage] INFO: Retrying Paperless widget...\n2026-03-07 10:15:05 [homepage] INFO: Paperless widget: OK (1,847ms) - 849 documents\n2026-03-07 10:15:05 [homepage] WARNING: Paperless response slow (>1s) - possible index rebuild\n\n2026-03-07 11:00:00 [forgejo] INFO: Scheduled mirror sync\n2026-03-07 11:00:01 [forgejo] INFO: Syncing alex/nanobot from https://github.com/HKUDS/nanobot.git\n2026-03-07 11:00:04 [forgejo] INFO: alex/nanobot: up to date (last commit: 2026-03-01)\n2026-03-07 11:00:04 [forgejo] INFO: Mirror sync complete. Next sync: 2026-03-07 19:00:00\n\n=== 2026-03-07 12:00 - MIDDAY STATUS ===\n\n2026-03-07 12:00:00 [docker] INFO: Container health check summary:\n2026-03-07 12:00:00 [docker] caddy: healthy (uptime: 4d 3h)\n2026-03-07 12:00:00 [docker] adguard: healthy (uptime: 4d 3h)\n2026-03-07 12:00:00 [docker] immich-server: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] immich-ml: healthy (uptime: 4d 3h) [idle]\n2026-03-07 12:00:01 [docker] immich-postgres: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] immich-redis: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] synapse: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] synapse-postgres: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] element-web: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] paperless: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] homepage: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] dockge: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] forgejo: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] butler: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] alfred: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] kit: healthy (uptime: 1d 7h)\n2026-03-07 12:00:03 [docker] server-bot: healthy (uptime: 4d 3h)\n2026-03-07 12:00:03 [docker] INFO: 17/17 containers healthy. Memory: 39.1GB / 64GB\n\n2026-03-07 14:00:00 [timemachine] INFO: Status check: last backup 2026-03-07 03:09 (successful)\n2026-03-07 14:00:01 [timemachine] INFO: Disk: 4.1TB / 5.5TB (75%), 51 snapshots\n\n2026-03-07 15:00:00 [adguard] INFO: Hourly DNS: 8,234 queries, 2,134 blocked (25.9%)\n\n=== 2026-03-07 16:00 - AFTERNOON ACTIVITY ===\n\n2026-03-07 16:12:00 [immich-server] INFO: Upload started from 192.168.188.101 (iphone-alex)\n2026-03-07 16:12:01 [immich-server] INFO: Receiving: 12 new photos (48MB total)\n2026-03-07 16:12:15 [immich-server] INFO: Upload complete: 12 assets stored\n2026-03-07 16:12:16 [immich-ml] INFO: Waking from idle, 12 new assets queued\n2026-03-07 16:12:20 [immich-ml] INFO: Processing 12 assets (face detection + CLIP)\n2026-03-07 16:13:45 [immich-ml] INFO: Batch complete: 12 assets, 28 faces, 12 CLIP embeddings (85s)\n2026-03-07 16:13:46 [immich-ml] INFO: Entering idle mode\n\n2026-03-07 16:30:00 [synapse] INFO: POST /_matrix/client/v3/rooms/!fam123:example-home.net/send/m.room.message - 200 OK (7ms)\n2026-03-07 16:30:01 [synapse] INFO: POST /_matrix/media/v3/upload - 200 OK (234ms, 2.3MB image)\n2026-03-07 16:30:05 [synapse] INFO: GET /_matrix/client/v3/sync - 3 clients synced\n\n2026-03-07 17:00:00 [adguard] INFO: Hourly DNS: 11,234 queries, 3,012 blocked (26.8%)\n\n=== 2026-03-07 18:00 - EVENING ===\n\n2026-03-07 18:00:00 [docker] INFO: Container health check: 17/17 healthy. Memory: 38.7GB / 64GB\n\n2026-03-07 19:00:00 [forgejo] INFO: Scheduled mirror sync\n2026-03-07 19:00:01 [forgejo] INFO: Syncing alex/nanobot: up to date\n2026-03-07 19:00:02 [forgejo] INFO: Mirror sync complete\n\n2026-03-07 20:00:00 [synapse] INFO: Database maintenance: VACUUM ANALYZE\n2026-03-07 20:00:14 [synapse] INFO: VACUUM completed in 14.2s\n2026-03-07 20:00:15 [synapse] INFO: Database size: 2.1GB (reclaimed 45MB)\n2026-03-07 20:00:15 [synapse] INFO: Largest tables: state_groups_state (845MB), event_json (412MB), events (298MB)\n\n2026-03-07 21:00:00 [adguard] INFO: Hourly DNS: 6,847 queries, 1,823 blocked (26.6%)\n\n2026-03-07 21:30:00 [ollama] INFO: Model qwen3-coder:30b unloaded (idle timeout: 5m)\n2026-03-07 21:30:00 [ollama] INFO: GPU memory freed: 17.3GB\n\n2026-03-07 22:00:00 [adguard] INFO: Daily DNS statistics:\n2026-03-07 22:00:00 [adguard] INFO: Total queries: 148,234\n2026-03-07 22:00:00 [adguard] INFO: Blocked: 39,847 (26.9%)\n2026-03-07 22:00:01 [adguard] INFO: Average response time: 14ms\n2026-03-07 22:00:01 [adguard] INFO: Unique clients: 8\n2026-03-07 22:00:01 [adguard] WARNING: Client 192.168.188.103 bypassed AdGuard all day (2,134 direct queries)\n\n2026-03-07 22:00:05 [docker] INFO: Evening health check: 17/17 healthy. Memory: 21.4GB / 64GB (Ollama models unloaded)\n```" + } + ] +} \ No newline at end of file diff --git a/results/qwen3-coder-next-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.md b/results/qwen3-coder-next-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.md new file mode 100644 index 0000000..2e93a69 --- /dev/null +++ b/results/qwen3-coder-next-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.md @@ -0,0 +1,18 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen/qwen3-coder-next +**Backend:** lmstudio +**Scenario:** prefill-test (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 655 | 1.58s | 2.05s | 72.3 | **40.8** | 3.62s | 148 | +| 2 | 1,453 | 1.51s | 2.11s | 68.3 | **39.8** | 3.62s | 144 | +| 3 | 3,015 | 3.12s | 2.14s | 69.5 | **28.3** | 5.26s | 149 | +| 4 | 8,496 | 13.55s | 2.30s | 62.1 | **9.0** | 15.85s | 143 | + +**Total prefill:** 19.8s +**Total generation:** 8.6s +**Total time:** 28.4s +**Avg generation tok/s:** 68.0 +**Avg effective tok/s:** 20.6 diff --git a/results/qwen3.6-27b-dense-mlx-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.json b/results/qwen3.6-27b-dense-mlx-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.json new file mode 100644 index 0000000..81b67b7 --- /dev/null +++ b/results/qwen3.6-27b-dense-mlx-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.json @@ -0,0 +1,69 @@ +{ + "meta": { + "scenario": "creative-writing", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio", + "backend": "lmstudio", + "model_info": { + "name": "qwen3.6-27b" + }, + "runs": 1, + "max_tokens": 2000, + "cold": false, + "warm_up_time": 0.506, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T12:49:31" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 57, + "new_tokens_est": 29, + "ttft": 1.084, + "gen_time": 25.136, + "gen_tps": 20.7, + "total": 26.22, + "output_tokens": 520, + "_response": "Beneath the floorboards of the living room,\nWhere sunlight never dares to tread,\nThe air hangs heavy, thick and gloom,\nAbove the hum that won\u2019t be dead.\n\nA black cathedral, cold and steel,\nWith blinking eyes of green and red,\nThey spin in silence, hard to feel,\nThe weight of all they hold instead.\n\nNo ghosts are here in sheets and white,\nNo rattling chains or spectral sound,\nJust fans that bite the heavy night,\nAnd circuits sleeping on the ground.\n\nBut deep within those silicon veins,\nThe laughter of a summer day\nIs trapped in binary constraints,\nTo keep the fading memories at bay.\n\nHere lies the video of June,\nThe birthday cake, the shattered vase,\nThe sun that burned a golden noon,\nPreserved in this electric space.\n\nThe server racks stand row on row,\nLike tombstones for the years gone past,\nThey glow with steady, softest glow,\nTo ensure that nothing\u2019s built to last\n\nIs actually forgotten now.\nThe grandmother\u2019s voice, crisp and clear,\nExists without a living brow,\nSuspended in the atmosphere.\n\nThe children\u2019s voices, shrill and bright,\nAre stored in sectors, cold and deep,\nProtected from the teeth of time,\nWhile all the world above them sleep.\n\nThe basement walls absorb the heat,\nGenerated by the constant spin,\nA digital and mechanical beat,\nThat starts within but cannot end.\n\nIt is not magic, nor it\u2019s fate,\nThis archive of the soul and mind,\nBut code that seals our escape gate,\nLeaving no fragment far behind.\n\nSo let the thunder roll above,\nLet storms destroy the paper wall,\nThe servers keep their silent love,\nAnd heed no mortal call.\n\nFor in this dark and damp confine,\nWhere shadows stretch and creep along,\nThe moments of our lives align,\nAnd sing their everlasting song.\n\nNo rot can touch these pixel dreams,\nNo mold can eat the digital trace,\nOnly the power of their schemes,\nTo capture every human face.\n\nSo sleep, above, in beds of down,\nUnaware of what lies below,\nThe humming hearts within the town,\nThat make the river\u2019s current flow.\n\nKeep spinning, fans, keep burning bright,\nIn this cold, subterranean hall,\nHold tight against the endless night,\nAnd answer when the servers call.", + "_user": "Write a poem about a mass of servers humming in a dark basement, keeping a family's memories alive. At least 30 lines." + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 60, + "new_tokens_est": 32, + "ttft": 0.818, + "gen_time": 33.511, + "gen_tps": 20.6, + "total": 34.329, + "output_tokens": 690, + "_response": "In the hollow of an ancient oak, where the moss grew thick and soft, lived Timothy Tortoise. While the other forest dwellers chased shadows or slept through the midday heat, Timothy carved. He chipped away at slate and polished river-smooth stones until they became circuits. He wove spider-silk into wires so fine they were nearly invisible, and he powered his creation with the slow, steady drip of condensation from a single dewdrop.\n\nIt was not a magnificent machine. It had no flashing lights, no roaring fans, and its screen was merely a pane of clear quartz that glowed with the faint hue of moonlight. But it worked. And it never stopped.\n\nAcross the clearing lived Hazel Hare, whose den was a shrine to speed. Her gaming rig was a beast of chrome and cooling pipes, humming like an angry hornet. It could render worlds in milliseconds. It could calculate the trajectory of a falling leaf before it hit the ground. Hazel boasted that her machine could think ten thousand thoughts while Timothy\u2019s took one single, deep breath.\n\n\"Look at it tick,\" Hazel laughed, twitching her nose. \"It\u2019s barely alive! Why build something so sluggish?\"\n\nTimothy adjusted his spectacles, which were made of polished beetle wings. \"It is not sluggish,\" he said softly. \"It is patient.\"\n\nA contest was declared by the Old Owl: who could solve the Riddle of the Roots? The riddle was complex, a tangled web of logic that required not just speed, but endurance. It was said that even the wind grew tired trying to unravel it.\n\nHazel fired up her rig immediately. The fans screamed, the lights blinked in a frenzy of color, and data streamed like waterfalls. For hours, Hazel\u2019s machine calculated at breakneck speed. But the riddle was deep, and the heat built up. The chrome grew hot; the fans whined in protest. Eventually, a warning light flashed red. *Overheat.* The system forced itself into sleep mode to cool down. Hazel paced her den, frustrated, unable to let the machine rest fully for fear of losing progress, yet unable to make it run.\n\nMeanwhile, Timothy sat beside his tiny device. The quartz screen pulsed once... then again. One calculation per hour. It did not skip a beat. It did not overheat. It did not hunger for electricity or fear the silence of the night. While Hazel\u2019s machine slept, Timothy\u2019s worked. While Hazel ate, Timothy\u2019s worked. When the moon rose and fell, the stone machine continued its slow, rhythmic march through the logic of the riddle.\n\nDays turned to weeks. Hazel\u2019s rig broke down from stress, its components warped by the heat of ambition. Timothy\u2019s device, cool as a river stone, finally displayed the answer on its quartz screen just as the first light of dawn touched the forest floor.\n\nThe Old Owl read the solution and nodded. \"Speed is a gift,\" the Owl hooted, \"but consistency is a virtue.\"\n\nHazel looked at her broken chrome beast, then at Timothy\u2019s humble slate box. She realized that while she had raced against the clock, Timothy had simply outlasted time itself. From that day on, Hazel learned to pause, and Timothy taught the forest that even the slowest step, if never stopped, reaches the destination.", + "_user": "Write a short fable about a tortoise who built a tiny computer that was slower than the hare's gaming rig but never needed to rest." + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 58, + "new_tokens_est": 31, + "ttft": 0.823, + "gen_time": 19.892, + "gen_tps": 20.7, + "total": 20.714, + "output_tokens": 411, + "_response": "The dust hangs heavy in the slanted light,\nA sepia ghost within a silent room.\nThe air tastes sharp with age and dry decay,\nWhere shadows stretch across the floor like gloom.\nBeneath a crate of rusted iron gears,\nAnd tangled wires from a forgotten age,\nI found the square that holds no digital trace,\nBut bears the weight of time\u2019s own fragile page.\n\nIt rests within a casing cracked and worn,\nThe edges soft as petals of a rose,\nNot pixels sharp, but chemical depth preserved,\nIn silver salts where memory froze.\nNo cloud server could hold this specific weight,\nThe grain of paper breathing under touch,\nA tactile truth that code has never known,\nNot cold and flat, but warm within its clutch.\n\nThe face within is blurred by gentle hands\nThat turned the page too quickly, years ago,\nA woman smiling at a camera lens\nBefore the networks started to grow.\nHer eyes hold stars that satellites have missed,\nA depth of soul no algorithm sees,\nJust human hope captured in gelatin,\nOn paper trees that used to rustle free.\n\nOutside, the world is made of light and wire,\nOf screens that glow with endless, hollow blue.\nBut here, the end of printing stands alone,\nA relic lost to what we thought was new.\nThe ink has settled deep into the fiber,\nA scent of vanilla rising from the sheet,\nThe final proof that flesh once touched the soul,\nBefore we learned to make reality fleet.\n\nI hold it up against the attic beam,\nAnd watch the motes of dust dance in the sun.\nIt is not data. It is not a file.\nIt is a fragment of the days begun.\nThe last sharp edge before the blur set in,\nWhen every image lived upon a shelf,\nAnd to remember meant to hold the thing,\nNot scroll through ghosts we cannot feel or tell.", + "_user": "Write a poem about the last photograph ever printed on paper, found in an attic a hundred years from now. At least 25 lines." + } + ] +} \ No newline at end of file diff --git a/results/qwen3.6-27b-dense-mlx-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.md b/results/qwen3.6-27b-dense-mlx-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.md new file mode 100644 index 0000000..05664c3 --- /dev/null +++ b/results/qwen3.6-27b-dense-mlx-6bit/creative-writing/m4-max-128gb-40gpu_lmstudio.md @@ -0,0 +1,17 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen3.6-27b +**Backend:** lmstudio +**Scenario:** creative-writing (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 57 | 1.08s | 25.14s | 20.7 | **19.8** | 26.22s | 520 | +| 2 | 60 | 0.82s | 33.51s | 20.6 | **20.1** | 34.33s | 690 | +| 3 | 58 | 0.82s | 19.89s | 20.7 | **19.8** | 20.71s | 411 | + +**Total prefill:** 2.7s +**Total generation:** 78.5s +**Total time:** 81.3s +**Avg generation tok/s:** 20.7 +**Avg effective tok/s:** 19.9 diff --git a/results/qwen3.6-27b-dense-mlx-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.json b/results/qwen3.6-27b-dense-mlx-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.json new file mode 100644 index 0000000..44af79b --- /dev/null +++ b/results/qwen3.6-27b-dense-mlx-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.json @@ -0,0 +1,94 @@ +{ + "meta": { + "scenario": "doc-summary", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio", + "backend": "lmstudio", + "model_info": { + "name": "qwen3.6-27b" + }, + "runs": 1, + "max_tokens": 150, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T12:50:16" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 425, + "new_tokens_est": 324, + "ttft": 2.97, + "gen_time": 4.404, + "gen_tps": 20.0, + "total": 7.374, + "output_tokens": 88, + "_response": "1. **Category**: Invoice\n2. **Tags**: Utility Bill, Electricity, Balance Due, Annual Statement, Portland Electric\n3. **Summary**: The Miller Family owes a balance of $26.49 for the 2025 annual electricity statement, which will be charged on March 15, 2026. The monthly payment increases to $88.00 starting March 1, 2026.", + "_user": "Please process this document:\n\n---\nPORTLAND ELECTRIC UTILITY\nCustomer Service | PO Box 4400 | Portland, OR 97208\n\nThe Miller Family\n742 Maple Street\nPortland, OR 97201\n\nAnnual Electricity Statement 2025\nAccount Number: PE-2025-44812\nBilling Period: 01/01/2025 - 12/31/2025\nMeter Number: EMH-0048712\n\nUsage:\n Meter reading 01/01/2025: 34,812 kWh\n Meter reading 12/31/2025: 38,947 kWh\n Annual consumption: 4,135 kWh\n\nCharges:\n Energy charge 4,135 kWh x $0.1147/kWh $474.28\n Base charge 12 months x $12.50 $150.00\n Transmission & distribution $287.40\n Public purpose charge $85.19\n Renewable energy surcharge $0.00\n Franchise fee $49.62\n ---------------------------------------------------\n Total charges $1,046.49\n Payments received (12 x $85.00) $1,020.00\n ---------------------------------------------------\n Balance due $26.49\n\nYour new monthly payment starting 03/01/2026: $88.00\n\nThe balance will be charged to your account on 03/15/2026.\nBank account ending in: ****4130\n\nQuestions? Call 1-800-555-4321 (toll free)\nor email: service@portlandelectric.example.com\n---" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 612, + "new_tokens_est": 512, + "ttft": 2.728, + "gen_time": 4.406, + "gen_tps": 20.2, + "total": 7.134, + "output_tokens": 89, + "_response": "1. **Category**: School Report\n2. **Tags**: Emma Miller, Forest Grove Elementary, 3rd Grade, Mid-Year Report\n3. **Summary**: This mid-year report card for student Emma Miller (Grade 3B) dated 02/14/2026 details her academic performance and social skills across multiple subjects. The document notes 3 excused absences and positive feedback on her reading, math, and participation.", + "_user": "Next document:\n\n---\nFOREST GROVE ELEMENTARY SCHOOL\nPrincipal's Office | 15 Forest Road | Portland, OR 97201\n\nMid-Year Report Card \u2014 School Year 2025/26\n\nStudent: Emma Miller\nGrade: 3B\nTeacher: Dr. Schneider\nDate: 02/14/2026\n\nEnglish Language Arts:\nEmma reads fluently and with good expression. She understands texts quickly and can summarize their content accurately. Her essays are creative and well-structured. Spelling is solid, with occasional errors on double consonants. She participates regularly in class discussions and contributes her own ideas.\n\nMathematics:\nEmma has a strong grasp of numbers up to 1,000. She completes addition and subtraction problems quickly and accurately. She shows good understanding of written multiplication, though division sometimes takes her a bit longer. She solves word problems methodically and can explain her reasoning. She identifies and names geometric shapes reliably.\n\nScience:\nEmma shows strong interest in natural science topics. For the \"Our Forest\" project she prepared an excellent presentation on mushrooms. She asks thoughtful questions and works carefully during experiments.\n\nArt:\nEmma creates with imagination and persistence. Her color compositions are mature for her age. She enjoys trying new techniques and helps classmates with their projects.\n\nPhysical Education:\nEmma is physically coordinated and shows good effort. In team sports she is fair and supports weaker teammates. In swimming class she earned her Bronze swimming badge.\n\nSocial Skills:\nEmma is friendly, helpful, and respectful toward classmates and teachers. She resolves conflicts calmly and gladly takes on classroom responsibilities.\n\nWork Habits:\nEmma works independently and reliably. Her notebooks are neatly kept. She completes homework conscientiously. She concentrates well and manages her time effectively.\n\nDays absent: 3 (excused)\n\nPortland, 02/14/2026\n\n_________________________ _________________________\nDr. Schneider Mr. Brown\nClassroom Teacher Principal\n---" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 535, + "new_tokens_est": 434, + "ttft": 3.097, + "gen_time": 4.749, + "gen_tps": 20.4, + "total": 7.847, + "output_tokens": 97, + "_response": "1. **Category**: Medical\n2. **Tags**: well-child visit, pediatric, speech therapy, immunizations, Max Miller\n3. **Summary**: Dr. Karla Hoffman conducted a 5-year well-child checkup for Max Miller on 03/03/2026, noting normal development but recommending speech therapy evaluation for specific sounds. The patient received a DTaP/IPV booster, and the next flu vaccine is due in fall 2026.", + "_user": "And this one:\n\n---\nDR. KARLA HOFFMAN, MD\nFamily Medicine\n3 Linden Plaza | Portland, OR 97205\nTel: 503-555-7890 | Fax: 503-555-7891\n\nWELL-CHILD VISIT REPORT\n\nPatient: Max Miller, DOB 07/15/2019\nDate of examination: 03/03/2026\n\nReason for visit:\n5-year well-child checkup\n\nFindings:\n\nPhysical Development:\n Height: 46.5 in (75th percentile)\n Weight: 47.0 lbs (65th percentile)\n BMI: 15.3 (normal range)\n General condition good, age-appropriate nutrition\n\nVision:\n Vision screening passed both eyes (Lea Symbols)\n No strabismus, stereopsis present\n\nHearing:\n Audiometry screening unremarkable both ears\n\nMotor Skills:\n Gross motor: Hops on one foot confidently, catches ball, rides bicycle without training wheels\n Fine motor: Draws person with 6+ details, cuts out shapes, ties simple knots\n Age-appropriate development\n\nSpeech & Language:\n Speaks in complete, grammatically correct sentences\n Counts to 20, knows colors and shapes\n Tells coherent stories\n Mild difficulty with /sh/ and /ch/ sounds \u2014 speech therapy evaluation recommended\n\nSocial-Emotional Development:\n Age-appropriate. Plays cooperatively, can wait turns, understands simple rules.\n Parents report occasional tantrums during transitions (leaving playground, etc.) \u2014 within normal range for age.\n\nImmunizations:\n DTaP/IPV booster administered (Kinrix)\n Next due: flu vaccine in fall 2026\n\nRecommendations:\n 1. Schedule speech therapy appointment for /sh/ and /ch/ sounds\n 2. Annual dental checkup (last visit >12 months ago)\n 3. Next well-child visit: age 7-8 (pre-kindergarten)\n\nSchool readiness from medical perspective: likely ready.\nSchool district screening still pending.\n\nPortland, 03/03/2026\n\n_________________________\nDr. Karla Hoffman, MD\n---" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 524, + "new_tokens_est": 423, + "ttft": 2.978, + "gen_time": 5.189, + "gen_tps": 20.4, + "total": 8.166, + "output_tokens": 106, + "_response": "1. **Category**: Insurance\n2. **Tags**: Policy Adjustment, Homeowner's Insurance, Premium Increase, Coverage Update\n3. **Summary**: Pacific Northwest Insurance Group notified Thomas Miller of a 3% premium increase to $1,866.36 annually and coverage adjustment to $293,550, effective 04/01/2026. The policyholder must report any changes to home square footage within 30 days or object within one month to avoid termination at renewal.", + "_user": "Next:\n\n---\nPACIFIC NORTHWEST INSURANCE GROUP\n500 Congress Center Blvd | Portland, OR 97204\n\nNotice of Policy Adjustment\n\nPolicyholder: Thomas Miller\nPolicy Number: HO-2019-887432\nPolicy: Homeowner's Insurance Plus\n\nDear Mr. Miller,\n\nDue to the annual adjustment of your insurance policy to the current homeowner's insurance index, we are notifying you of the following changes, effective 04/01/2026:\n\nPrevious coverage amount: $285,000.00\nNew coverage amount: $293,550.00 (increase 3.0%)\n\nPrevious annual premium: $1,812.00\nNew annual premium: $1,866.36 (increase 3.0%)\nMonthly premium: $155.53\n\nYour coverage summary:\n - Dwelling and personal property against fire, theft, water damage, windstorm/hail\n - Bicycle theft up to $2,000 (including away from home)\n - Power surge damage from lightning\n - Hotel costs if uninhabitable up to $100/day, max 30 days\n - Deductible: $500 per claim\n - Guaranteed replacement cost with accurate square footage\n\nCurrent square footage on file: 1,022 sq ft\n\nImportant: If your home's square footage has changed (e.g., addition, finished basement), please notify us within 30 days to ensure your coverage remains adequate.\n\nYou have the right to object to this adjustment within one month of receiving this notice. In that case, your policy will terminate at the next renewal date.\n\nQuestions? Contact us:\nPhone: 503-922-1000 (Mon-Fri 8am-6pm)\nEmail: service@pnw-insurance.example.com\nOnline: www.my-pnw-insurance.example.com\n\nSincerely,\n\nS. Lechner\nProperty Insurance Department\nPacific Northwest Insurance Group\n\nEnclosures:\n- Updated premium schedule\n- Revised policy terms (2026 edition)\n---" + }, + { + "turn": 5, + "run": 1, + "ctx_tokens_est": 1518, + "new_tokens_est": 1417, + "ttft": 7.191, + "gen_time": 4.583, + "gen_tps": 20.1, + "total": 11.774, + "output_tokens": 92, + "_response": "1. **Category**: Legal\n2. **Tags**: Lease Agreement, Residential Rental, Security Deposit, Property Management\n3. **Summary**: Cascade Property Management LLC leased 742 Maple Street Unit 2A to Thomas and Sarah Miller starting May 1, 2021, for $1,970/month with a $1,970 security deposit. The agreement outlines indefinite tenancy terms, utility responsibilities, and Oregon state law compliance.", + "_user": "Process this multi-page document:\n\n---\nRESIDENTIAL LEASE AGREEMENT\n\nBetween\n Cascade Property Management LLC\n represented by Stefan Huber, Managing Partner\n 500 Congress Center Blvd, Suite 400, Portland, OR 97204\n Tax ID: 93-1234567\n \u2014 hereinafter \"Landlord\" \u2014\n\nand\n Thomas Miller and Sarah Miller\n currently residing at: 12 Birch Lane, Portland, OR 97225\n \u2014 hereinafter \"Tenant\" \u2014\n\nThe following lease agreement is entered into:\n\nSECTION 1: PREMISES\n\nThe Landlord leases to the Tenant the following dwelling:\n Address: 742 Maple Street, Unit 2A, Portland, OR 97201\n Living area: approximately 1,022 sq ft\n Rooms: 4 (3 bedrooms, kitchen, bathroom, hallway, storage closet)\n Year built: 1962, last renovation: 2019\n Energy rating: 87 kBtu/sq ft/yr, Class C\n Heating: Central gas furnace\n\nIncluded with the unit:\n - Storage unit #7 in basement (approx. 85 sq ft)\n - 1 parking space in underground garage (#TG-14)\n - Shared use: laundry room, drying room, bicycle storage, garden\n\nNot included:\n - Attic (restricted access)\n - Community sauna in basement (separate agreement required)\n\nSECTION 2: LEASE TERM\n\nThe lease begins on 05/01/2021 and runs for an indefinite period.\nEither party may terminate with 30 days written notice before the end of the month.\nAfter 12 months of tenancy, the Landlord's notice period extends to 60 days.\nAfter 24 months, the Landlord's notice period extends to 90 days.\nOregon state law (ORS 90.427) governs all termination procedures.\n\nSECTION 3: RENT AND UTILITIES\n\n3.1 Base Rent:\n Dwelling: $1,850.00/month\n Parking: $120.00/month\n Total: $1,970.00/month\n\n3.2 Utilities included in rent:\n Water/sewer, garbage collection, recycling\n\n3.3 Utilities paid by Tenant:\n Electricity, gas (heating), internet, renter's insurance\n\n3.4 Estimated monthly utility costs (for reference only):\n Gas (heating/hot water): $145.00/month (winter avg)\n Electricity: $85.00/month\n Internet: $65.00/month\n\n3.5 Total estimated monthly cost: $2,265.00/month\n\n3.6 Rent is due on the 1st of each month. A grace period of 4 days\n is provided. Late fee of $50.00 applies after the 5th.\n Payment by check or electronic transfer to:\n Cascade Property Management LLC\n Account ending in: ****3456\n Reference: Rent 742Maple/2A - Miller\n\nSECTION 4: SECURITY DEPOSIT\n\n4.1 The Tenant shall pay a security deposit equal to one month's rent:\n $1,970.00\n\n4.2 The deposit shall be held in a trust account per Oregon law (ORS 90.300).\n\n4.3 The deposit shall be returned within 31 days of lease termination,\n less any lawful deductions for:\n - Unpaid rent or utilities\n - Damage beyond normal wear and tear\n - Cleaning costs if unit is not left in reasonable condition\n\n4.4 An itemized statement of any deductions shall accompany\n the deposit return.\n\nSECTION 5: CONDITION OF PREMISES\n\n5.1 The Tenant has inspected the unit and accepts it in its\n current condition, subject to the following noted defects:\n\n5.2 Move-in condition report (attached as Exhibit C):\n - Bedroom 2: Scratch on hardwood floor near window (approx. 12x8 in)\n - Bathroom: Caulking around bathtub discolored (Landlord will replace\n within 4 weeks of move-in)\n - Kitchen: Dishwasher connection leaking (will be repaired before move-in)\n\n5.3 A detailed move-in checklist with photographs is attached as Exhibit C.\n\nSECTION 6: MAINTENANCE AND REPAIRS\n\n6.1 The Landlord is responsible for:\n - Structural repairs and maintenance\n - Plumbing, electrical, and HVAC systems\n - Appliance repair/replacement (those provided by Landlord)\n - Common area maintenance\n - Pest control\n\n6.2 The Tenant is responsible for:\n - Keeping the unit clean and sanitary\n - Minor maintenance (light bulbs, HVAC filters, smoke detector batteries)\n - Reporting maintenance issues promptly in writing\n - Damage caused by Tenant, household members, or guests\n\n6.3 Emergency maintenance (burst pipe, no heat in winter, electrical hazard)\n should be reported immediately to: 503-555-9111 (24-hour line)\n\nSECTION 7: HOUSE RULES\n\nThe attached house rules (Exhibit B) are part of this agreement.\nKey provisions:\n - Quiet hours: 10:00 PM - 7:00 AM daily\n - No charcoal or gas grills on balconies. Electric grills permitted.\n - Smoking: Permitted inside unit only, not in common areas or balcony\n - Pets: Small caged animals (fish, hamsters) allowed. Dogs and cats\n require prior written approval from Landlord. Pet deposit of $500 applies.\n - Musical instruments: Maximum 2 hours daily, not during quiet hours\n - Parking: One assigned space only. No vehicle repairs in garage.\n - Storage: No flammable materials in storage unit or common areas.\n\nSECTION 8: GENERAL PROVISIONS\n\n8.1 Amendments to this agreement must be in writing and signed by both parties.\n8.2 If any provision is found unenforceable, the remaining provisions\n shall remain in effect.\n8.3 This agreement is governed by Oregon Residential Landlord and Tenant Act.\n8.4 Two copies of this agreement are prepared, one for each party.\n\nExhibits:\n A. Floor plan of the unit\n B. House rules\n C. Move-in condition report with photographs\n D. Lead-based paint disclosure (pre-1978 building)\n E. Mold information disclosure\n F. Security deposit receipt\n\nPortland, OR, 04/15/2021\n\n_________________________ _________________________\nStefan Huber Thomas Miller\nCascade Property Management Tenant\nLLC, Managing Partner\n\n _________________________\n Sarah Miller\n Tenant\n---" + } + ] +} \ No newline at end of file diff --git a/results/qwen3.6-27b-dense-mlx-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.md b/results/qwen3.6-27b-dense-mlx-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.md new file mode 100644 index 0000000..593df70 --- /dev/null +++ b/results/qwen3.6-27b-dense-mlx-6bit/doc-summary/m4-max-128gb-40gpu_lmstudio.md @@ -0,0 +1,19 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen3.6-27b +**Backend:** lmstudio +**Scenario:** doc-summary (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 425 | 2.97s | 4.40s | 20.0 | **11.9** | 7.37s | 88 | +| 2 | 612 | 2.73s | 4.41s | 20.2 | **12.5** | 7.13s | 89 | +| 3 | 535 | 3.10s | 4.75s | 20.4 | **12.4** | 7.85s | 97 | +| 4 | 524 | 2.98s | 5.19s | 20.4 | **13.0** | 8.17s | 106 | +| 5 | 1,518 | 7.19s | 4.58s | 20.1 | **7.8** | 11.77s | 92 | + +**Total prefill:** 19.0s +**Total generation:** 23.3s +**Total time:** 42.3s +**Avg generation tok/s:** 20.2 +**Avg effective tok/s:** 11.2 diff --git a/results/qwen3.6-27b-dense-mlx-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.json b/results/qwen3.6-27b-dense-mlx-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.json new file mode 100644 index 0000000..acf69db --- /dev/null +++ b/results/qwen3.6-27b-dense-mlx-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.json @@ -0,0 +1,141 @@ +{ + "meta": { + "scenario": "ops-agent", + "mode": "conversation", + "label": "m4-max-128gb-40gpu lmstudio", + "backend": "lmstudio", + "model_info": { + "name": "qwen3.6-27b" + }, + "runs": 1, + "max_tokens": 500, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T12:52:30" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 575, + "new_tokens_est": 421, + "ttft": 3.916, + "gen_time": 7.156, + "gen_tps": 20.3, + "total": 11.071, + "output_tokens": 145, + "tool": "server_status", + "_response": "I see the issue. The **`immich-ml`** service is consuming a significant amount of resources:\n\n* **CPU:** 45.2% (very high for a background service)\n* **Memory:** 8.2 GB\n\nThis is likely causing the high system load average (3.82) and making the server feel sluggish. Immich's ML service often spikes like this when processing a large backlog of photos for facial recognition or object detection.\n\n**Next Steps:**\n1. Do you want me to check the recent logs for `immich-ml` to see what it's processing?\n2. Or would you prefer to restart the service to reset its workload?", + "_user": "Something feels off with the server. Can you check what's running?" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 954, + "new_tokens_est": 235, + "ttft": 3.071, + "gen_time": 11.062, + "gen_tps": 20.2, + "total": 14.133, + "output_tokens": 224, + "tool": "service_logs", + "_response": "The logs confirm that `immich-ml` is in the middle of a large **facial recognition and CLIP embedding** batch job.\n\nHere\u2019s what it\u2019s doing:\n* **Progress:** It\u2019s on batch 850 out of 1203.\n* **Workload:** It has about **351 images left** to process, with an estimated completion time of **~45 minutes**.\n* **Resource Pressure:** It just triggered a garbage collection event because it was running low on memory, freeing up 1.2GB. This explains the high CPU and memory usage\u2014it\u2019s crunching through a significant backlog of photos.\n\n**Recommendation:**\nIf you don\u2019t need immediate responsiveness from the server, let it finish. It should be done in under an hour.\n\nIf you need the server to perform better right now, I can **restart** the `immich-ml` service. This will pause the job; it will resume where it left off once you (or I) start it again.\n\nWhat would you like to do?", + "_user": "Immich ML is eating a lot of CPU. What's it doing?" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 1263, + "new_tokens_est": 89, + "ttft": 2.243, + "gen_time": 9.659, + "gen_tps": 20.4, + "total": 11.902, + "output_tokens": 197, + "tool": "docker_exec", + "_response": "It looks safe for now. The `immich-ml` container is using **8.2 GB** out of its **12 GB limit**, which is about **68%**. It still has a healthy buffer before hitting its cap.\n\nSince the system total memory usage is 47.3 GB out of 64 GB, and Immich ML has its own hard limit, it shouldn\u2019t crash the whole server. The \"Low memory\" warning in the logs was just the container\u2019s internal garbage collector kicking in to stay within its limits.\n\n**Summary:**\n* **Memory Status:** Safe (68% of container limit used).\n* **ETA:** ~45 minutes to finish the vacation photo processing.\n* **Action:** No immediate action needed unless you want the server to be snappy right now.\n\nWould you like me to keep an eye on it, or would you prefer to pause the job by restarting the service?", + "_user": "Ah right, we uploaded vacation photos yesterday. Is it going to be OK memory-wise?" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 1671, + "new_tokens_est": 214, + "ttft": 2.897, + "gen_time": 10.461, + "gen_tps": 20.0, + "total": 13.358, + "output_tokens": 209, + "tool": "backup_status", + "_response": "Last night's backup **completed successfully**, but with a minor warning.\n\n**Details for March 7th (Last Night):**\n* **Status:** Completed with warnings.\n* **Data Backed Up:** 12.4 GB across 1,847 files. This aligns perfectly with your vacation photo upload yesterday.\n* **Duration:** 18 minutes 42 seconds (longer than usual due to the large data volume).\n* **Warning:** \"Vault eject failed (non-fatal)\". This usually means the external drive or backup volume didn't unmount cleanly after the job finished, but the data transfer itself was successful.\n\n**Conclusion:**\nYour vacation photos **are safe**. The 12.4 GB transferred matches the size of a typical large photo upload batch.\n\n**Recommendation:**\nThe \"Vault eject failed\" warning is worth keeping an eye on, but it\u2019s non-fatal. If you want, I can check the disk usage to ensure everything is mounted correctly now?", + "_user": "Good. Check if last night's backup ran. I want to make sure the vacation photos are safe." + }, + { + "turn": 5, + "run": 1, + "ctx_tokens_est": 2131, + "new_tokens_est": 239, + "ttft": 2.99, + "gen_time": 17.948, + "gen_tps": 19.4, + "total": 20.939, + "output_tokens": 349, + "tool": "disk_usage", + "_response": "Disk space looks healthy overall, but the backup drives are getting full. Here\u2019s the breakdown:\n\n**Main System (`/`)**\n* **Usage:** 33% (1.2TB used of 3.6TB)\n* **Status:** \u2705 Plenty of room.\n\n**Backup Vault (`/Volumes/backup-vault`)**\n* **Usage:** 69% (3.8TB used of 5.5TB)\n* **Status:** \u26a0\ufe0f Getting full. You have ~1.7TB left.\n* **Note:** The \"eject failed\" warning is likely just a mount lock issue, but since it's still mounted and visible in this report, the backup data is safe.\n\n**Time Machine (`/Volumes/time-machine`)**\n* **Usage:** 75% (4.1TB used of 5.5TB)\n* **Status:** \u26a0\ufe0f High usage. You have ~1.4TB left.\n\n**Data Breakdown (`~/server/data`)**\n* **Total:** 892GB\n* **Photos:** 634GB (This is your largest chunk, consistent with the vacation uploads).\n\n**Recommendation:**\nYou don\u2019t need to panic yet, but you should plan for **backup drive rotation or cleanup** in the next few months. At 69-75% usage, you have a buffer, but large photo uploads (like yesterday's) will fill this up faster.\n\nWould you like me to:\n1. Check if there are old, redundant backups on the vault that can be pruned?\n2. Just keep monitoring until usage hits 80%?", + "_user": "The vault didn't eject again. How's disk space looking on all drives?" + }, + { + "turn": 6, + "run": 1, + "ctx_tokens_est": 2673, + "new_tokens_est": 249, + "ttft": 4.03, + "gen_time": 11.371, + "gen_tps": 20.1, + "total": 15.401, + "output_tokens": 228, + "tool": "service_logs", + "_response": "Yes, Paperless successfully processed the school documents this morning. Here\u2019s what happened:\n\n* **Emma\u2019s Report:** Processed (3 pages, 97% confidence). Auto-tagged as `School Report`, `education`, and `emma`.\n* **Max\u2019s Swimming Certificate:** Processed (1 page, 94% confidence). Auto-tagged as `Certificate`, `sports`, and `max`.\n* **Electricity Bill:** Also processed (2 pages, 99% confidence). Auto-tagged as `Invoice`, `utilities`, and `electricity`.\n\nAll 3 files were handled with high OCR confidence and no errors. The school docs are safe and searchable in Paperless now.\n\n**Regarding Time Machine (75% usage):**\nSince it\u2019s at 75%, you\u2019re still in a safe zone, but you\u2019ll want to keep an eye on it. Time Machine keeps local snapshots which can grow quickly. If you want, I can check if there are any old local snapshots taking up extra space on the main drive that could be cleared to give the backup drive some breathing room?", + "_user": "Time Machine is at 75%. Also did Paperless process the school documents I scanned this morning?" + }, + { + "turn": 7, + "run": 1, + "ctx_tokens_est": 3007, + "new_tokens_est": 98, + "ttft": 2.165, + "gen_time": 15.795, + "gen_tps": 20.1, + "total": 17.96, + "output_tokens": 318, + "tool": "docker_exec", + "_response": "The Matrix (Synapse) database is **2.1 GB**.\n\nThat\u2019s actually quite reasonable for a home server, even with \"chatty\" activity. Here\u2019s why it hasn\u2019t exploded in size:\n\n* **`state_groups_state` (845 MB):** This is the largest table, which tracks the current state of rooms. It grows as you join more rooms or have complex room histories, but 845 MB is normal for an active home server.\n* **`event_json` (412 MB) & `events` (298 MB):** These store the actual messages and events. The fact that these aren\u2019t larger suggests Synapse is likely purging old event data from rooms where you\u2019ve enabled history retention limits (or the default settings are working well).\n\n**Analysis:**\n* **Size:** 2.1 GB is small enough that it won\u2019t impact your disk space significantly (remember, you have 2.4 TB free on the main drive).\n* **Performance:** If the server feels \"chatty\" or slow, it\u2019s more likely due to CPU load (like the Immich ML job we saw earlier) or network traffic rather than database bloat.\n\n**Conclusion:**\nThe Matrix database is healthy and well-sized. No action needed here unless you want to manually prune very old history from specific rooms, but given the size, it\u2019s not urgent.\n\nIs there anything else feeling \"off\" with the server, or are you good to let Immich finish its photo processing?", + "_user": "Nice, it even picked up the electricity bill. How big is the Matrix database? It's been chatty lately." + }, + { + "turn": 8, + "run": 1, + "ctx_tokens_est": 3522, + "new_tokens_est": 188, + "ttft": 3.231, + "gen_time": 24.329, + "gen_tps": 19.4, + "total": 27.56, + "output_tokens": 472, + "tool": "docker_exec", + "_response": "Actually, looking at the event counts, **2.1 GB is quite large** for only ~34k total events. A typical Matrix database with that many messages is usually under 500MB. This suggests the \"chatty\" nature includes a lot of **media attachments** (images, PDFs) or very verbose bot activity.\n\nHere is the breakdown by room size (estimated based on event count and typical payload sizes):\n\n1. **`#server`**: 12,847 events (Likely the largest due to logs/bot output)\n2. **`#family`**: 8,934 events (High volume of family chat/media)\n3. **`#test-room`**: 4,521 events (Suspiciously high for a test room)\n4. **`#butler`**: 3,421 events (Bot logs/commands)\n5. **`#marvin-old`**: 2,103 events (Old bot data)\n6. **`#alfred-bot`**: 1,893 events\n7. **`#documents`**: 567 events (Likely heavy on file attachments)\n\n**Observations:**\n* **`#test-room`** has 4,521 events. If this is just a testing ground, it might be filled with spam or accidental bot loops.\n* **`#marvin-old`** is an old bot room with 2k events. If Marvins no longer active, this is dead weight.\n* **`#server`** and **`#family`** are the main drivers.\n\n**Recommendation:**\nIf you want to shrink that database, we can:\n1. **Purge history** in `#test-room` and `#marvin-old`.\n2. **Check media storage**: Synapse stores uploaded images/files separately from the database. The 2.1 GB is *just* the SQL data, but if you have many photos sent in `#family`, the actual disk usage for Matrix media might be much higher.\n\nWould you like me to check the size of the Synapse **media store** (where uploaded files live) as well? That\u2019s often where the real bloat is.", + "_user": "2.1GB for Matrix seems like a lot. Can we see which rooms take the most space?" + } + ] +} \ No newline at end of file diff --git a/results/qwen3.6-27b-dense-mlx-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.md b/results/qwen3.6-27b-dense-mlx-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.md new file mode 100644 index 0000000..7f5f216 --- /dev/null +++ b/results/qwen3.6-27b-dense-mlx-6bit/ops-agent/m4-max-128gb-40gpu_lmstudio.md @@ -0,0 +1,22 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen3.6-27b +**Backend:** lmstudio +**Scenario:** ops-agent (conversation) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 575 | 3.92s | 7.16s | 20.3 | **13.1** | 11.07s | 145 | +| 2 | 954 | 3.07s | 11.06s | 20.2 | **15.8** | 14.13s | 224 | +| 3 | 1,263 | 2.24s | 9.66s | 20.4 | **16.6** | 11.90s | 197 | +| 4 | 1,671 | 2.90s | 10.46s | 20.0 | **15.6** | 13.36s | 209 | +| 5 | 2,131 | 2.99s | 17.95s | 19.4 | **16.7** | 20.94s | 349 | +| 6 | 2,673 | 4.03s | 11.37s | 20.1 | **14.8** | 15.40s | 228 | +| 7 | 3,007 | 2.17s | 15.79s | 20.1 | **17.7** | 17.96s | 318 | +| 8 | 3,522 | 3.23s | 24.33s | 19.4 | **17.1** | 27.56s | 472 | + +**Total prefill:** 24.5s +**Total generation:** 107.8s +**Total time:** 132.3s +**Avg generation tok/s:** 20.0 +**Avg effective tok/s:** 16.2 diff --git a/results/qwen3.6-27b-dense-mlx-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.json b/results/qwen3.6-27b-dense-mlx-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.json new file mode 100644 index 0000000..55b617f --- /dev/null +++ b/results/qwen3.6-27b-dense-mlx-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.json @@ -0,0 +1,81 @@ +{ + "meta": { + "scenario": "prefill-test", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio", + "backend": "lmstudio", + "model_info": { + "name": "qwen3.6-27b" + }, + "runs": 1, + "max_tokens": 150, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T12:54:32" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 655, + "new_tokens_est": 540, + "ttft": 3.94, + "gen_time": 3.729, + "gen_tps": 21.7, + "total": 7.669, + "output_tokens": 81, + "_response": "Port 443 is likely blocked by macOS's built-in Apache or another system service starting before Docker. Run `sudo lsof -i :443` to identify the PID and kill it, or disable \"Web Sharing\" in System Settings. The Synapse issue is unrelated; it\u2019s just waiting for Postgres to finish initializing, so it will recover automatically once the database is ready.", + "_user": "After rebooting my Mac Studio, several Docker containers won't start properly. Here's what I see:\n\n```\n$ docker ps -a\nCONTAINER ID IMAGE STATUS NAMES\na1b2c3d4e5f6 caddy:2-custom Exited (1) 5 min ago caddy\nb2c3d4e5f6a1 adguard/adguardhome:latest Up 10 minutes adguard\nc3d4e5f6a1b2 ghcr.io/immich-app/immich-server:release Up 8 minutes immich-server\nd4e5f6a1b2c3 ghcr.io/immich-app/immich-machine-learning Up 8 minutes immich-ml\ne5f6a1b2c3d4 tensorchord/pgvecto-rs:pg14-v0.2.0 Up 10 minutes immich-postgres\nf6a1b2c3d4e5 redis:7-alpine Up 10 minutes immich-redis\na1b2c3d4e5f7 matrixdotorg/synapse:latest Restarting (1) 3 min ago synapse\nb2c3d4e5f6a2 postgres:16-alpine Up 10 minutes synapse-postgres\nc3d4e5f6a1b3 ghcr.io/paperless-ngx/paperless-ngx:latest Up 9 minutes paperless\nd4e5f6a1b2c4 ghcr.io/gethomepage/homepage:latest Up 10 minutes homepage\ne5f6a1b2c3d5 louislam/dockge:1 Up 10 minutes dockge\nf6a1b2c3d4e6 codeberg.org/forgejo/forgejo:10 Up 10 minutes forgejo\n```\n\nCaddy exited and Synapse keeps restarting. The Caddy logs show:\n\n```\n2026-03-07 08:00:01 Error: loading initial config: http app module: start: listening on :443: bind: address already in use\n```\n\nSynapse logs show:\n\n```\n2026-03-07 08:01:12 synapse.storage ERROR - Failed to connect to database: connection to server at \"synapse-postgres\" port 5432 failed: FATAL: the database system is starting up\n2026-03-07 08:02:15 synapse.storage ERROR - Failed to connect to database: connection to server at \"synapse-postgres\" port 5432 failed: FATAL: the database system is starting up\n```\n\nEverything else is up but I can't reach any service through HTTPS because Caddy is down. What's blocking port 443 and how do I fix this? Is the Synapse issue related?" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 1453, + "new_tokens_est": 1338, + "ttft": 7.982, + "gen_time": 7.008, + "gen_tps": 20.4, + "total": 14.99, + "output_tokens": 143, + "_response": "Your `immich-ml` memory limit (12GB) is causing swapping and severe slowdowns; increase it to 32\u201348GB given your M1 Max\u2019s 64GB RAM, as ML models require significant headroom to avoid OOM kills and thrashing. The 502 errors stem from Caddy\u2019s default 64MB body limit; add `encode gzip` and ensure your Caddyfile includes `reverse_proxy immich-server:2283 { header_up Host {host} }` and potentially increase `max_body_size 10G` in the handler. The large `smart_search` table is normal for 15k photos, but consider running `VAC", + "_user": "Review this complete Docker Compose stack for our photo service and tell me if anything looks wrong, could cause issues, or should be improved:\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - IMMICH_MEDIA_LOCATION=/usr/src/app/upload\n - TZ=Europe/Berlin\n depends_on:\n immich-postgres:\n condition: service_healthy\n immich-redis:\n condition: service_started\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"curl -f http://localhost:2283/api/server/ping || exit 1\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 60s\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n environment:\n - MACHINE_LEARNING_CACHE_FOLDER=/cache\n - TRANSFORMERS_CACHE=/cache\n - TZ=Europe/Berlin\n deploy:\n resources:\n limits:\n memory: 12G\n reservations:\n memory: 4G\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"python3 -c 'import urllib.request; urllib.request.urlopen(\\\"http://localhost:3003/ping\\\")' || exit 1\"]\n interval: 60s\n timeout: 15s\n retries: 3\n start_period: 120s\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n - TZ=Europe/Berlin\n command:\n - postgres\n - -c\n - shared_preload_libraries=vectors.so\n - -c\n - search_path=\"$$user\",public,vectors\n - -c\n - logging_collector=on\n - -c\n - max_wal_size=2GB\n - -c\n - shared_buffers=512MB\n - -c\n - wal_compression=on\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U postgres -d immich\"]\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 30s\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru\n networks:\n - home\n healthcheck:\n test: [\"CMD\", \"redis-cli\", \"ping\"]\n interval: 10s\n timeout: 5s\n retries: 3\n\nvolumes:\n immich-ml-cache:\n driver: local\n\nnetworks:\n home:\n external: true\n```\n\nAnd here is the current Caddy route for this service:\n\n```\n@photos host photos.home.example-home.net\nhandle @photos {\n reverse_proxy immich-server:2283\n}\n```\n\nThe service has been running for 3 months with ~15,000 photos. Recently I noticed:\n1. ML processing takes much longer than it used to (was finishing overnight, now takes 2+ days for a batch of 500 photos)\n2. The Postgres database has grown to 8.4 GB\n3. Memory usage spikes to 11.8 GB during ML processing (limit is 12G)\n4. Occasional 502 errors from Caddy when uploading large videos (>500MB)\n\nHere are the recent resource stats:\n\n```\n$ docker stats --no-stream\nCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O\na1b2c3d4e5f6 immich-server 2.1% 512MB / 64GB 0.8% 2.1GB / 156MB 45MB / 12MB\nb2c3d4e5f6a1 immich-ml 45.2% 11.8GB / 12GB 98.3% 890MB / 234MB 1.2GB / 89MB\nc3d4e5f6a1b2 immich-postgres 1.8% 1.1GB / 64GB 1.7% 234MB / 567MB 3.4GB / 1.8GB\nd4e5f6a1b2c3 immich-redis 0.1% 42MB / 256MB 16.4% 123MB / 98MB 1MB / 0B\n```\n\nAnd the Postgres table sizes:\n\n```\nSELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size\nFROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC LIMIT 15;\n\n schemaname | tablename | size\n-----------+------------------------------+---------\n public | smart_search | 3.2 GB\n public | asset_faces | 1.8 GB\n public | assets | 1.1 GB\n public | exif | 892 MB\n public | asset_job_status | 456 MB\n public | person | 234 MB\n public | albums_assets_assets | 189 MB\n public | activity | 123 MB\n public | move_history | 98 MB\n public | geodata_places | 87 MB\n public | system_metadata | 45 MB\n public | albums | 23 MB\n public | users | 1.2 MB\n public | api_keys | 48 kB\n public | system_config | 16 kB\n```" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 3015, + "new_tokens_est": 2900, + "ttft": 16.575, + "gen_time": 5.521, + "gen_tps": 20.1, + "total": 22.096, + "output_tokens": 111, + "_response": "Your configuration is largely architecture-agnostic; you can keep the Caddyfile, Docker Compose files, and directory structures exactly as-is. The M4 Ultra\u2019s unified memory architecture (up to 192GB) and superior PCIe bandwidth will significantly accelerate Immich ML processing, Paperless OCR, and Ollama inference without requiring config changes. Ensure you migrate your `/Users/alex/server/data` volume to the new machine\u2019s APFS drive and re-import your OrbStack Docker contexts, but no service-specific parameters need adjustment for the hardware upgrade.", + "_user": "I need help planning a migration. Here's my current complete server configuration. Review it and suggest what needs to change if I move from Mac Studio M1 Max to Mac Studio M4 Ultra:\n\n## Current Caddyfile\n\n```\n{\n acme_dns hetzner {\n api_token {env.HETZNER_API_TOKEN}\n }\n}\n\n*.home.example-home.net {\n tls {\n dns hetzner {env.HETZNER_API_TOKEN}\n propagation_delay 30s\n propagation_timeout 5m\n }\n\n @status host status.home.example-home.net\n handle @status {\n reverse_proxy homepage:3000\n }\n\n @dns host dns.home.example-home.net\n handle @dns {\n reverse_proxy adguard:80\n }\n\n @photos host photos.home.example-home.net\n handle @photos {\n reverse_proxy immich-server:2283 {\n header_up X-Real-IP {remote_host}\n transport http {\n read_timeout 600s\n }\n }\n }\n\n @chat host chat.home.example-home.net\n handle @chat {\n reverse_proxy open-webui:8080\n }\n\n @messages host messages.home.example-home.net\n handle @messages {\n handle /.well-known/matrix/client {\n header Content-Type application/json\n respond `{\"m.homeserver\":{\"base_url\":\"https://messages.home.example-home.net\"}}`\n }\n handle /.well-known/matrix/server {\n header Content-Type application/json\n respond `{\"m.server\":\"messages.home.example-home.net:443\"}`\n }\n handle /_matrix/* {\n reverse_proxy synapse:8008\n }\n handle {\n reverse_proxy element-web:80\n }\n }\n\n @docs host docs.home.example-home.net\n handle @docs {\n reverse_proxy paperless:8000\n }\n\n @manage host manage.home.example-home.net\n handle @manage {\n reverse_proxy dockge:5001\n }\n\n @code host code.home.example-home.net\n handle @code {\n reverse_proxy forgejo:3000\n }\n\n handle {\n respond \"Not found\" 404\n }\n}\n```\n\n## Docker Compose: Infrastructure\n\n```yaml\nversion: \"3.8\"\n\nservices:\n caddy:\n image: caddy:2-custom\n build:\n context: .\n dockerfile: Dockerfile\n container_name: caddy\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile\n - caddy-data:/data\n - caddy-config:/config\n networks:\n - home\n environment:\n - HETZNER_API_TOKEN=${HETZNER_API_TOKEN}\n\n adguard:\n image: adguard/adguardhome:latest\n container_name: adguard\n restart: unless-stopped\n ports:\n - \"53:53/tcp\"\n - \"53:53/udp\"\n - \"8080:80\"\n volumes:\n - adguard-work:/opt/adguardhome/work\n - adguard-conf:/opt/adguardhome/conf\n networks:\n - home\n\n homepage:\n image: ghcr.io/gethomepage/homepage:latest\n container_name: homepage\n restart: unless-stopped\n ports:\n - \"3001:3000\"\n volumes:\n - ./homepage-config:/app/config\n networks:\n - home\n\n dockge:\n image: louislam/dockge:1\n container_name: dockge\n restart: unless-stopped\n ports:\n - \"5001:5001\"\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - dockge-data:/app/data\n - /Users/alex/server/family-server/stacks:/opt/stacks\n environment:\n - DOCKGE_STACKS_DIR=/opt/stacks\n networks:\n - home\n\nvolumes:\n caddy-data:\n caddy-config:\n adguard-work:\n adguard-conf:\n dockge-data:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Photos (Immich)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - TZ=Europe/Berlin\n depends_on:\n - immich-postgres\n - immich-redis\n networks:\n - home\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n deploy:\n resources:\n limits:\n memory: 12G\n networks:\n - home\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n networks:\n - home\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n networks:\n - home\n\nvolumes:\n immich-ml-cache:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Messages (Matrix)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n synapse:\n image: matrixdotorg/synapse:latest\n container_name: synapse\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/synapse-data:/data\n environment:\n - SYNAPSE_CONFIG_DIR=/data\n depends_on:\n - synapse-postgres\n networks:\n - home\n\n synapse-postgres:\n image: postgres:16-alpine\n container_name: synapse-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/postgres:/var/lib/postgresql/data\n environment:\n - POSTGRES_USER=synapse\n - POSTGRES_PASSWORD=${SYNAPSE_DB_PASSWORD}\n - POSTGRES_DB=synapse\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n networks:\n - home\n\n element-web:\n image: vectorim/element-web:latest\n container_name: element-web\n restart: unless-stopped\n volumes:\n - ./element-config.json:/app/config.json:ro\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Documents (Paperless-ngx)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n paperless:\n image: ghcr.io/paperless-ngx/paperless-ngx:latest\n container_name: paperless\n restart: unless-stopped\n ports:\n - \"8000:8000\"\n volumes:\n - /Users/alex/server/data/documents/data:/usr/src/paperless/data\n - /Users/alex/server/data/documents/media:/usr/src/paperless/media\n - /Users/alex/server/data/documents/consume:/usr/src/paperless/consume\n environment:\n - PAPERLESS_DBENGINE=sqlite\n - PAPERLESS_OCR_LANGUAGE=deu+eng\n - PAPERLESS_URL=https://docs.home.example-home.net\n - PAPERLESS_TIME_ZONE=Europe/Berlin\n - PAPERLESS_OCR_MODE=skip\n - PAPERLESS_TASK_WORKERS=2\n - PAPERLESS_CONSUMER_POLLING=30\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Git (Forgejo)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n forgejo:\n image: codeberg.org/forgejo/forgejo:10\n container_name: forgejo\n restart: unless-stopped\n ports:\n - \"3000:3000\"\n - \"222:22\"\n volumes:\n - /Users/alex/server/data/code-repo:/data\n environment:\n - USER_UID=1000\n - USER_GID=1000\n - FORGEJO__server__ROOT_URL=https://code.home.example-home.net\n - FORGEJO__server__SSH_PORT=222\n - FORGEJO__database__DB_TYPE=sqlite3\n - FORGEJO__service__DISABLE_REGISTRATION=true\n - FORGEJO__repository__DEFAULT_PRIVATE=true\n - FORGEJO__mirror__DEFAULT_INTERVAL=8h\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: AI Bots\n\n```yaml\nversion: \"3.8\"\n\nservices:\n butler:\n image: openclaw-matrix:latest\n build:\n context: ../openclaw\n container_name: butler\n restart: unless-stopped\n volumes:\n - ./config:/root/.openclaw\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@assistant:example-home.net\n - MATRIX_PASSWORD=${BUTLER_MATRIX_PASSWORD}\n networks:\n - home\n\n alfred:\n image: openclaw-matrix:latest\n container_name: alfred\n restart: unless-stopped\n volumes:\n - ./alfred-config:/root/.openclaw\n environment:\n - OPENROUTER_API_KEY=${OPENROUTER_API_KEY}\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@alfred:example-home.net\n - MATRIX_PASSWORD=${ALFRED_MATRIX_PASSWORD}\n networks:\n - home\n - personal-agent\n\n kit:\n image: kit-assistant:latest\n build:\n context: ../assistant\n container_name: kit\n restart: unless-stopped\n volumes:\n - ./kit-workspace:/workspace\n - /var/run/docker.sock:/var/run/docker.sock:ro\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - OLLAMA_MODEL=qwen3-coder:30b\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@kit-bot:example-home.net\n - MATRIX_PASSWORD=${KIT_MATRIX_PASSWORD}\n - FK_HOMEPAGE_URL=http://homepage:3000\n - FK_PAPERLESS_URL=http://paperless:8000\n - FK_OLLAMA_URL=http://host.docker.internal:11434\n networks:\n - home\n\nnetworks:\n home:\n external: true\n personal-agent:\n external: true\n```\n\n## Current Resource Usage\n\n```\n$ docker stats --no-stream\nCONTAINER CPU % MEM USAGE / LIMIT NET I/O BLOCK I/O\ncaddy 0.1% 42MB / 64GB 12GB / 8.4GB 45MB / 12MB\nadguard 0.3% 128MB / 64GB 890MB / 234MB 123MB / 67MB\nimmich-server 2.1% 512MB / 64GB 2.1GB / 156MB 45MB / 12MB\nimmich-ml 0.2% 2.1GB / 12GB 890MB / 234MB 1.2GB / 89MB\nimmich-pg 1.8% 1.1GB / 64GB 234MB / 567MB 3.4GB / 1.8GB\nimmich-redis 0.1% 42MB / 64GB 123MB / 98MB 1MB / 0B\nsynapse 0.4% 380MB / 64GB 456MB / 234MB 890MB / 345MB\nsynapse-pg 0.2% 256MB / 64GB 234MB / 123MB 1.2GB / 678MB\nelement-web 0.0% 12MB / 64GB 45MB / 89MB 1MB / 0B\npaperless 0.2% 620MB / 64GB 123MB / 67MB 2.3GB / 1.1GB\nhomepage 0.0% 38MB / 64GB 23MB / 12MB 5MB / 1MB\ndockge 0.1% 52MB / 64GB 12MB / 8MB 3MB / 1MB\nforgejo 0.1% 95MB / 64GB 45MB / 23MB 234MB / 67MB\nbutler 0.1% 180MB / 64GB 23MB / 12MB 12MB / 3MB\nalfred 0.1% 180MB / 64GB 34MB / 18MB 15MB / 4MB\nkit 0.3% 210MB / 64GB 67MB / 34MB 23MB / 8MB\n```\n\n## Disk Usage\n\n```\n$ df -h\nFilesystem Size Used Avail Use% Mounted on\n/dev/disk1s1 3.6T 1.2T 2.4T 33% /\n/dev/disk5s1 5.5T 3.8T 1.7T 69% /Volumes/backup-vault\n/dev/disk4s1 5.5T 4.1T 1.4T 75% /Volumes/time-machine\n\n$ du -sh ~/server/data/*\n634G /Users/alex/server/data/photos\n12G /Users/alex/server/data/documents\n2.1G /Users/alex/server/data/messages\n890M /Users/alex/server/data/code-repo\n```\n\n## Ollama Configuration\n\n```\n$ ollama list\nNAME SIZE MODIFIED\nllama3.1:8b 4.7 GB 2 days ago\nqwen2.5:32b 19 GB 5 days ago\nqwen3-coder:30b 17 GB 1 day ago\nqwen3.5:35b-a3b 21 GB 3 hours ago\n\n$ cat ~/Library/LaunchAgents/com.ollama.plist | grep -A1 OLLAMA\nOLLAMA_HOST\n0.0.0.0\nOLLAMA_KEEP_ALIVE\n5m\n```\n\nWhat needs to change for the M4 Ultra migration? What can I keep as-is? Any performance improvements I should expect?" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 8496, + "new_tokens_est": 8381, + "ttft": 66.996, + "gen_time": 7.526, + "gen_tps": 19.3, + "total": 74.522, + "output_tokens": 145, + "_response": "Here is the audit of your home server configuration.\n\n### \ud83d\udea8 Critical Security Issues\n\n1. **Exposed Docker Socket**: `dockge` and `kit` mount `/var/run/docker.sock`. This grants root-level access to the host.\n * **Fix**: Use [Docker Socket Proxy](https://github.com/Tecnativa/docker-socket-proxy) to restrict access, or move `kit`'s Docker interaction to a separate, isolated container with limited privileges.\n2. **Hardcoded API Tokens**: `Caddyfile` exposes `{env.HETZNER_API_TOKEN}` in the config file. If this file is committed to Git, your Hetzner account is compromised.\n *", + "_user": "Here is our complete server configuration and 24-hour log bundle. Audit everything for issues, security concerns, and optimization opportunities:\n\n## Caddyfile\n\n```\n{\n acme_dns hetzner {\n api_token {env.HETZNER_API_TOKEN}\n }\n}\n\n*.home.example-home.net {\n tls {\n dns hetzner {env.HETZNER_API_TOKEN}\n propagation_delay 30s\n propagation_timeout 5m\n }\n\n @status host status.home.example-home.net\n handle @status {\n reverse_proxy homepage:3000\n }\n\n @dns host dns.home.example-home.net\n handle @dns {\n reverse_proxy adguard:80\n }\n\n @photos host photos.home.example-home.net\n handle @photos {\n reverse_proxy immich-server:2283 {\n header_up X-Real-IP {remote_host}\n transport http {\n read_timeout 600s\n }\n }\n }\n\n @chat host chat.home.example-home.net\n handle @chat {\n reverse_proxy open-webui:8080\n }\n\n @messages host messages.home.example-home.net\n handle @messages {\n handle /.well-known/matrix/client {\n header Content-Type application/json\n respond `{\"m.homeserver\":{\"base_url\":\"https://messages.home.example-home.net\"}}`\n }\n handle /.well-known/matrix/server {\n header Content-Type application/json\n respond `{\"m.server\":\"messages.home.example-home.net:443\"}`\n }\n handle /_matrix/* {\n reverse_proxy synapse:8008\n }\n handle {\n reverse_proxy element-web:80\n }\n }\n\n @docs host docs.home.example-home.net\n handle @docs {\n reverse_proxy paperless:8000\n }\n\n @manage host manage.home.example-home.net\n handle @manage {\n reverse_proxy dockge:5001\n }\n\n @code host code.home.example-home.net\n handle @code {\n reverse_proxy forgejo:3000\n }\n\n handle {\n respond \"Not found\" 404\n }\n}\n```\n\n## Docker Compose: Infrastructure\n\n```yaml\nversion: \"3.8\"\n\nservices:\n caddy:\n image: caddy:2-custom\n build:\n context: .\n dockerfile: Dockerfile\n container_name: caddy\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile\n - caddy-data:/data\n - caddy-config:/config\n networks:\n - home\n environment:\n - HETZNER_API_TOKEN=${HETZNER_API_TOKEN}\n\n adguard:\n image: adguard/adguardhome:latest\n container_name: adguard\n restart: unless-stopped\n ports:\n - \"53:53/tcp\"\n - \"53:53/udp\"\n - \"8080:80\"\n volumes:\n - adguard-work:/opt/adguardhome/work\n - adguard-conf:/opt/adguardhome/conf\n networks:\n - home\n\n homepage:\n image: ghcr.io/gethomepage/homepage:latest\n container_name: homepage\n restart: unless-stopped\n ports:\n - \"3001:3000\"\n volumes:\n - ./homepage-config:/app/config\n networks:\n - home\n env_file:\n - .env\n\n dockge:\n image: louislam/dockge:1\n container_name: dockge\n restart: unless-stopped\n ports:\n - \"5001:5001\"\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - dockge-data:/app/data\n - /Users/alex/server/family-server/stacks:/opt/stacks\n environment:\n - DOCKGE_STACKS_DIR=/opt/stacks\n networks:\n - home\n\nvolumes:\n caddy-data:\n caddy-config:\n adguard-work:\n adguard-conf:\n dockge-data:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Photos (Immich)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - TZ=Europe/Berlin\n depends_on:\n - immich-postgres\n - immich-redis\n networks:\n - home\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n deploy:\n resources:\n limits:\n memory: 12G\n networks:\n - home\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n networks:\n - home\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n networks:\n - home\n\nvolumes:\n immich-ml-cache:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Messages (Matrix)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n synapse:\n image: matrixdotorg/synapse:latest\n container_name: synapse\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/synapse-data:/data\n environment:\n - SYNAPSE_CONFIG_DIR=/data\n depends_on:\n - synapse-postgres\n networks:\n - home\n\n synapse-postgres:\n image: postgres:16-alpine\n container_name: synapse-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/postgres:/var/lib/postgresql/data\n environment:\n - POSTGRES_USER=synapse\n - POSTGRES_PASSWORD=${SYNAPSE_DB_PASSWORD}\n - POSTGRES_DB=synapse\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n networks:\n - home\n\n element-web:\n image: vectorim/element-web:latest\n container_name: element-web\n restart: unless-stopped\n volumes:\n - ./element-config.json:/app/config.json:ro\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Documents (Paperless-ngx)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n paperless:\n image: ghcr.io/paperless-ngx/paperless-ngx:latest\n container_name: paperless\n restart: unless-stopped\n ports:\n - \"8000:8000\"\n volumes:\n - /Users/alex/server/data/documents/data:/usr/src/paperless/data\n - /Users/alex/server/data/documents/media:/usr/src/paperless/media\n - /Users/alex/server/data/documents/consume:/usr/src/paperless/consume\n environment:\n - PAPERLESS_DBENGINE=sqlite\n - PAPERLESS_OCR_LANGUAGE=deu+eng\n - PAPERLESS_URL=https://docs.home.example-home.net\n - PAPERLESS_TIME_ZONE=Europe/Berlin\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Git (Forgejo)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n forgejo:\n image: codeberg.org/forgejo/forgejo:10\n container_name: forgejo\n restart: unless-stopped\n ports:\n - \"3000:3000\"\n - \"222:22\"\n volumes:\n - /Users/alex/server/data/code-repo:/data\n environment:\n - USER_UID=1000\n - USER_GID=1000\n - FORGEJO__server__ROOT_URL=https://code.home.example-home.net\n - FORGEJO__server__SSH_PORT=222\n - FORGEJO__database__DB_TYPE=sqlite3\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: AI Bots\n\n```yaml\nversion: \"3.8\"\n\nservices:\n butler:\n image: openclaw-matrix:latest\n build:\n context: ../openclaw\n container_name: butler\n restart: unless-stopped\n volumes:\n - ./config:/root/.openclaw\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@assistant:example-home.net\n - MATRIX_PASSWORD=${BUTLER_MATRIX_PASSWORD}\n networks:\n - home\n\n alfred:\n image: openclaw-matrix:latest\n container_name: alfred\n restart: unless-stopped\n volumes:\n - ./alfred-config:/root/.openclaw\n environment:\n - OPENROUTER_API_KEY=${OPENROUTER_API_KEY}\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@alfred:example-home.net\n - MATRIX_PASSWORD=${ALFRED_MATRIX_PASSWORD}\n networks:\n - home\n - personal-agent\n\n kit:\n image: kit-assistant:latest\n build:\n context: ../assistant\n container_name: kit\n restart: unless-stopped\n volumes:\n - ./kit-workspace:/workspace\n - /var/run/docker.sock:/var/run/docker.sock:ro\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - OLLAMA_MODEL=qwen3-coder:30b\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@kit-bot:example-home.net\n - MATRIX_PASSWORD=${KIT_MATRIX_PASSWORD}\n - FK_HOMEPAGE_URL=http://homepage:3000\n - FK_PAPERLESS_URL=http://paperless:8000\n - FK_OLLAMA_URL=http://host.docker.internal:11434\n networks:\n - home\n\nnetworks:\n home:\n external: true\n personal-agent:\n external: true\n```\n\n## Backup Configuration (vault-sync.sh excerpt)\n\n```bash\n#!/bin/bash\nset -euo pipefail\n\nVAULT_NAME=\"backup-vault\"\nDATA_DIR=\"$HOME/server/data\"\nSNAPSHOT_DIR=\"/Volumes/$VAULT_NAME/snapshots/$(date +%Y-%m-%d)\"\nLOG_FILE=\"$DATA_DIR/logs/vault-sync.log\"\n\n# Unlock vault drive from keychain\nPASS=$(security find-generic-password -s \"$VAULT_NAME\" -w 2>/dev/null)\necho \"$PASS\" | diskutil apfs unlockVolume \"$VAULT_NAME\" -stdinpassphrase\n\n# Rsync with delete (mirror)\nrsync -av --delete \\\n --exclude '.DS_Store' \\\n --exclude '*.tmp' \\\n --exclude 'immich-ml-cache/' \\\n \"$DATA_DIR/\" \"$SNAPSHOT_DIR/\"\n\n# Apply WORM protection\nchflags -R uchg \"$SNAPSHOT_DIR/\"\n\n# Try to eject (non-fatal if it fails)\ndiskutil eject \"$VAULT_NAME\" 2>/dev/null || true\n```\n\n## Ollama Configuration\n\n```\n$ ollama list\nNAME SIZE MODIFIED\nllama3.1:8b 4.7 GB 2 days ago\nqwen2.5:32b 19 GB 5 days ago\nqwen3-coder:30b 17 GB 1 day ago\nqwen3.5:35b-a3b 21 GB 3 hours ago\n\n$ ollama ps\nNAME SIZE PROCESSOR UNTIL\nqwen3.5:35b-a3b 21 GB 100% GPU 4 minutes from now\n```\n\n## Server Logs: Last 24 Hours\n\n```\n=== 2026-03-06 22:00 - EVENING STATUS ===\n\n2026-03-06 22:00:00 [docker] INFO: Container health check summary:\n2026-03-06 22:00:00 [docker] caddy: healthy (uptime: 3d 15h)\n2026-03-06 22:00:00 [docker] adguard: healthy (uptime: 3d 15h)\n2026-03-06 22:00:00 [docker] immich-server: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] immich-ml: healthy (uptime: 3d 15h) [idle]\n2026-03-06 22:00:01 [docker] immich-postgres: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] immich-redis: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] synapse: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] synapse-postgres: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] element-web: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] paperless: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] homepage: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] dockge: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] forgejo: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] butler: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] alfred: healthy (uptime: 3d 15h)\n2026-03-06 22:00:03 [docker] kit: healthy (uptime: 23h)\n2026-03-06 22:00:03 [docker] server-bot: healthy (uptime: 3d 15h)\n2026-03-06 22:00:03 [docker] INFO: 17/17 containers healthy. Memory: 38.4GB / 64GB\n\n2026-03-06 22:00:05 [adguard] INFO: Daily DNS statistics:\n2026-03-06 22:00:05 [adguard] INFO: Total queries today: 134,521\n2026-03-06 22:00:05 [adguard] INFO: Blocked: 36,847 (27.4%)\n2026-03-06 22:00:05 [adguard] INFO: Average response time: 13ms\n2026-03-06 22:00:06 [adguard] INFO: Top blocked domains:\n2026-03-06 22:00:06 [adguard] INFO: 1. telemetry.microsoft.com (7,842 queries)\n2026-03-06 22:00:06 [adguard] INFO: 2. ads.google.com (3,921 queries)\n2026-03-06 22:00:06 [adguard] INFO: 3. graph.facebook.com (3,456 queries)\n2026-03-06 22:00:06 [adguard] INFO: 4. app-measurement.com (2,847 queries)\n2026-03-06 22:00:06 [adguard] INFO: 5. analytics.google.com (2,134 queries)\n2026-03-06 22:00:07 [adguard] INFO: Unique clients: 8\n2026-03-06 22:00:07 [adguard] INFO: Client breakdown:\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.46 (mac-alex): 42,847 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.101 (iphone-alex): 31,234 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.102 (ipad-kids): 24,567 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.105 (macbook-alex): 18,934 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.110 (smart-tv): 8,234 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.111 (echo-kitchen): 5,123 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.112 (echo-living): 3,456 queries\n2026-03-06 22:00:08 [adguard] WARNING: Client 192.168.188.103 (laptop-guest) bypassed AdGuard for 24h\n2026-03-06 22:00:08 [adguard] WARNING: 1,847 direct queries to external DNS detected\n2026-03-06 22:00:08 [adguard] INFO: Upstream DNS performance:\n2026-03-06 22:00:09 [adguard] INFO: 1.1.1.1 (Cloudflare): avg 11ms, p99 45ms\n2026-03-06 22:00:09 [adguard] INFO: 8.8.8.8 (Google): avg 16ms, p99 67ms\n\n2026-03-06 22:15:00 [synapse] INFO: POST /_matrix/client/v3/rooms/!fam123:example-home.net/send/m.room.message - 200 OK (8ms)\n2026-03-06 22:15:01 [synapse] INFO: PUT /_matrix/client/v3/rooms/!fam123:example-home.net/read_markers - 200 OK (3ms)\n2026-03-06 22:30:00 [synapse] INFO: Background job: purge_old_device_messages completed (12ms)\n2026-03-06 23:00:00 [synapse] INFO: Background job: purge_expired_account_data completed (45ms)\n\n=== 2026-03-07 00:00 - MIDNIGHT ===\n\n2026-03-07 00:00:00 [adguard] INFO: DNS filter list update check\n2026-03-07 00:00:02 [adguard] INFO: AdGuard DNS filter: 48,234 rules (no update)\n2026-03-07 00:00:02 [adguard] INFO: OISD Full: 312,847 rules (updated, +234 rules)\n2026-03-07 00:00:03 [adguard] INFO: Steven Black hosts: 89,234 rules (no update)\n2026-03-07 00:00:03 [adguard] INFO: Total active rules: 450,315\n\n2026-03-07 00:30:00 [forgejo] INFO: Repository statistics update\n2026-03-07 00:30:01 [forgejo] INFO: Repositories: 8 (5 active, 2 mirrors, 1 archived)\n2026-03-07 00:30:01 [forgejo] INFO: Total git objects: 12,847\n2026-03-07 00:30:01 [forgejo] INFO: Total LFS objects: 0\n2026-03-07 00:30:02 [forgejo] INFO: Database size: 23MB\n\n=== 2026-03-07 02:00 - BACKUP JOB ===\n\n2026-03-07 01:55:00 [cron] Starting vault-sync backup job\n2026-03-07 01:55:01 [vault-sync] INFO: Checking vault drive status...\n2026-03-07 01:55:01 [vault-sync] INFO: Volume 'backup-vault' not mounted, attempting unlock\n2026-03-07 01:55:02 [vault-sync] INFO: Retrieving passphrase from login keychain\n2026-03-07 01:55:02 [vault-sync] INFO: Running: diskutil apfs unlockVolume backup-vault -stdinpassphrase\n2026-03-07 01:55:08 [vault-sync] INFO: Volume backup-vault mounted at /Volumes/backup-vault\n2026-03-07 01:55:08 [vault-sync] INFO: Previous snapshot found: 2026-03-06 (823.4 GB)\n2026-03-07 01:55:08 [vault-sync] INFO: Starting rsync: /Users/alex/server/data/ -> /Volumes/backup-vault/snapshots/2026-03-07/\n2026-03-07 01:55:08 [rsync] building file list... done\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4501.jpg (4.2MB)\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4502.jpg (3.8MB)\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4503.jpg (5.1MB)\n2026-03-07 01:55:10 [rsync] photos/upload/library/2026/03/06/IMG_4504.jpg (4.7MB)\n2026-03-07 01:55:10 [rsync] photos/upload/library/2026/03/06/IMG_4505.jpg (3.9MB)\n2026-03-07 01:55:11 [rsync] photos/upload/library/2026/03/06/IMG_4506.jpg (4.4MB)\n2026-03-07 01:55:11 [rsync] photos/upload/library/2026/03/06/IMG_4507.heic (2.1MB)\n2026-03-07 01:55:12 [rsync] photos/upload/library/2026/03/06/IMG_4508.heic (2.3MB)\n2026-03-07 01:55:12 [rsync] photos/upload/library/2026/03/06/IMG_4509.heic (1.9MB)\n2026-03-07 01:55:13 [rsync] photos/upload/library/2026/03/06/IMG_4510.heic (2.5MB)\n2026-03-07 01:55:13 [rsync] photos/upload/library/2026/03/06/IMG_4511.mov (234MB)\n2026-03-07 01:55:18 [rsync] photos/upload/library/2026/03/06/IMG_4512.mov (189MB)\n2026-03-07 01:55:24 [rsync] photos/upload/library/2026/03/06/IMG_4513.mov (312MB)\n2026-03-07 01:55:30 [rsync] photos/upload/library/2026/03/06/IMG_4514.jpg (4.8MB)\n2026-03-07 01:55:30 [rsync] photos/upload/library/2026/03/06/IMG_4515.jpg (3.6MB)\n2026-03-07 01:55:31 [rsync] photos/upload/library/2026/03/06/IMG_4516.jpg (5.2MB)\n2026-03-07 01:55:31 [rsync] photos/upload/library/2026/03/06/IMG_4517.jpg (4.1MB)\n2026-03-07 01:55:32 [rsync] photos/upload/library/2026/03/06/IMG_4518.jpg (3.7MB)\n2026-03-07 01:55:32 [rsync] photos/upload/library/2026/03/06/IMG_4519.jpg (4.9MB)\n2026-03-07 01:55:33 [rsync] photos/upload/library/2026/03/06/IMG_4520.jpg (3.4MB)\n2026-03-07 01:55:33 [rsync] photos/upload/library/2026/03/06/IMG_4521.jpg (4.6MB)\n2026-03-07 01:55:34 [rsync] photos/upload/thumbs/2026/03/06/ (42 files, 8.4MB total)\n2026-03-07 01:55:36 [rsync] photos/upload/encoded-video/2026/03/06/ (3 files, 67MB total)\n2026-03-07 01:55:40 [rsync] photos/db/base/16384/ (delta sync, 12MB)\n2026-03-07 01:55:41 [rsync] documents/data/index/whoosh/ (12 files, 45MB)\n2026-03-07 01:55:41 [rsync] documents/media/documents/originals/2026/03/ (3 files, 2.1MB)\n2026-03-07 01:55:41 [rsync] documents/media/documents/thumbnails/2026/03/ (3 files, 890KB)\n2026-03-07 01:55:42 [rsync] documents/data/db.sqlite3 (234MB)\n2026-03-07 01:55:43 [rsync] messages/synapse-data/media_store/local_content/ (8 files, 12MB)\n2026-03-07 01:55:43 [rsync] messages/synapse-data/media_store/local_thumbnails/ (8 files, 1.2MB)\n2026-03-07 01:55:44 [rsync] messages/postgres/base/16384/ (14 files, delta)\n2026-03-07 01:55:44 [rsync] messages/postgres/pg_wal/000000010000000000000047 (16MB)\n2026-03-07 01:55:44 [rsync] messages/postgres/pg_wal/000000010000000000000048 (16MB)\n2026-03-07 01:55:45 [rsync] code-repo/data/gitea-repositories/alex/ (4 repos, delta)\n2026-03-07 01:55:45 [rsync] code-repo/data/gitea.db (23MB)\n2026-03-07 01:55:46 [rsync] logs/ (2 files, 1.2MB)\n2026-03-07 01:55:46 [rsync] sent 12,438,291,456 bytes received 48,721 bytes 24,876,580,354.00 bytes/sec\n2026-03-07 01:55:46 [rsync] total size is 892,341,567,488 speedup is 71.74\n2026-03-07 01:55:46 [vault-sync] INFO: rsync completed: 1,847 files, 12.4 GB transferred\n2026-03-07 01:55:47 [vault-sync] INFO: Applying uchg flags to snapshot...\n2026-03-07 01:55:48 [vault-sync] INFO: chflags -R uchg /Volumes/backup-vault/snapshots/2026-03-07/\n2026-03-07 01:56:12 [vault-sync] INFO: uchg flags applied to 23,847 items (24.2s)\n2026-03-07 01:56:12 [vault-sync] INFO: Attempting vault eject...\n2026-03-07 01:56:13 [vault-sync] ERROR: diskutil eject failed: 'Dissent error 49153'\n2026-03-07 01:56:13 [vault-sync] WARNING: Vault eject failed (non-fatal). Drive remains mounted but protected by uchg.\n2026-03-07 01:56:14 [vault-sync] INFO: Sending notification...\n2026-03-07 01:56:14 [vault-sync] INFO: macOS notification sent: \"Backup completed with warnings\"\n2026-03-07 01:56:14 [vault-sync] INFO: Backup completed with warnings. Duration: 1m 14s\n2026-03-07 02:00:00 [cron] Next vault-sync scheduled: 2026-03-08 02:00:00\n\n=== 2026-03-07 03:00 - TIME MACHINE ===\n\n2026-03-07 03:00:01 [timemachine] INFO: Starting automatic backup\n2026-03-07 03:00:02 [timemachine] INFO: Destination: time-machine (APFS, /Volumes/time-machine)\n2026-03-07 03:00:03 [timemachine] INFO: Preparing backup...\n2026-03-07 03:00:15 [timemachine] INFO: Calculating changes since 2026-03-06 03:00:00\n2026-03-07 03:00:45 [timemachine] INFO: 4,521 items changed (12.8 GB)\n2026-03-07 03:01:00 [timemachine] INFO: Copying files...\n2026-03-07 03:08:42 [timemachine] INFO: Creating snapshot...\n2026-03-07 03:08:55 [timemachine] INFO: Verifying backup integrity...\n2026-03-07 03:09:12 [timemachine] INFO: Backup completed successfully\n2026-03-07 03:09:12 [timemachine] INFO: Duration: 9m 11s\n2026-03-07 03:09:12 [timemachine] INFO: Total backups on disk: 51 (oldest: 2026-01-15)\n2026-03-07 03:09:13 [timemachine] INFO: Disk usage: 4.1TB / 5.5TB (75%)\n2026-03-07 03:09:13 [timemachine] WARNING: Time Machine disk above 70% - oldest backups will be pruned automatically\n\n=== 2026-03-07 06:00 - MORNING ===\n\n2026-03-07 06:00:00 [docker] INFO: Container health check summary:\n2026-03-07 06:00:00 [docker] All 17 containers healthy. Memory: 36.2GB / 64GB\n\n2026-03-07 06:00:01 [caddy] INFO: TLS certificate renewal check\n2026-03-07 06:00:02 [caddy] INFO: Certificate for *.home.example-home.net valid until 2026-06-05 (90 days)\n2026-03-07 06:00:02 [caddy] INFO: No renewal needed\n\n2026-03-07 06:30:00 [adguard] INFO: Hourly DNS: 1,234 queries, 312 blocked (25.3%)\n2026-03-07 07:00:00 [adguard] INFO: Hourly DNS: 4,567 queries, 1,234 blocked (27.0%)\n2026-03-07 07:00:01 [adguard] INFO: Top client this hour: 192.168.188.101 (iphone-alex) - woke up\n\n=== 2026-03-07 07:30 - USER ACTIVITY ===\n\n2026-03-07 07:30:12 [synapse] INFO: POST /_matrix/client/v3/login - @admin:example-home.net - 200 OK (18ms)\n2026-03-07 07:30:13 [synapse] INFO: GET /_matrix/client/v3/sync - @admin:example-home.net - 200 OK (234ms)\n2026-03-07 07:30:15 [synapse] INFO: GET /_matrix/client/v3/sync - @kit-bot:example-home.net - 200 OK (89ms)\n2026-03-07 07:30:16 [synapse] INFO: GET /_matrix/client/v3/sync - @server-bot:example-home.net - 200 OK (45ms)\n2026-03-07 07:30:45 [synapse] INFO: PUT /_matrix/client/v3/rooms/!srv123:example-home.net/send/m.room.message - 200 OK (8ms)\n2026-03-07 07:30:46 [kit] INFO: Received message in #server from @admin:example-home.net: \"good morning, how's the server?\"\n2026-03-07 07:30:46 [kit] INFO: Processing with qwen3-coder:30b via Ollama\n2026-03-07 07:30:47 [ollama] INFO: Model qwen3-coder:30b not loaded, loading... (17.3GB)\n2026-03-07 07:31:02 [ollama] INFO: Model loaded in 15.4s (GPU: 100%)\n2026-03-07 07:31:02 [kit] INFO: Sending prompt (847 tokens, including system + tools)\n2026-03-07 07:31:05 [kit] INFO: TTFT: 3.2s\n2026-03-07 07:31:05 [kit] INFO: Running tool: fk status\n2026-03-07 07:31:06 [kit] INFO: Tool result: 1,234 chars\n2026-03-07 07:31:06 [kit] INFO: Sending follow-up (2,081 tokens with tool result)\n2026-03-07 07:31:12 [kit] INFO: TTFT: 5.8s\n2026-03-07 07:31:28 [kit] INFO: Response complete: 278 tokens in 16.2s (17.1 tok/s generation)\n2026-03-07 07:31:28 [synapse] INFO: PUT /_matrix/client/v3/rooms/!srv123:example-home.net/send/m.room.message - 200 OK (6ms)\n\n=== 2026-03-07 07:45 - PAPERLESS CONSUMPTION ===\n\n2026-03-07 07:45:00 [paperless] INFO: Starting scheduled document consumption\n2026-03-07 07:45:01 [paperless] INFO: Checking consume directory: /usr/src/paperless/consume\n2026-03-07 07:45:01 [paperless] INFO: Found 3 new files\n2026-03-07 07:45:02 [paperless] INFO: Processing: school-report-emma-2026.pdf (845KB, 3 pages)\n2026-03-07 07:45:07 [paperless] INFO: OCR completed (lang=deu, confidence=0.97)\n2026-03-07 07:45:08 [paperless] INFO: Text extraction: 2,847 chars\n2026-03-07 07:45:08 [paperless] INFO: Running classifier...\n2026-03-07 07:45:09 [paperless] INFO: Auto-classified: Type=School, Correspondent=Grundschule am Waldrand\n2026-03-07 07:45:09 [paperless] INFO: Auto-tagged: [education, emma, zwischenzeugnis, 2026]\n2026-03-07 07:45:10 [paperless] INFO: Stored as document #847\n2026-03-07 07:45:11 [paperless] INFO: Processing: swimming-certificate-max.pdf (234KB, 1 page)\n2026-03-07 07:45:14 [paperless] INFO: OCR completed (lang=deu, confidence=0.94)\n2026-03-07 07:45:15 [paperless] INFO: Auto-classified: Type=Certificate, Correspondent=DLRG\n2026-03-07 07:45:15 [paperless] INFO: Auto-tagged: [sports, max, swimming, bronze, 2026]\n2026-03-07 07:45:16 [paperless] INFO: Stored as document #848\n2026-03-07 07:45:17 [paperless] INFO: Processing: electricity-bill-march-2026.pdf (567KB, 2 pages)\n2026-03-07 07:45:21 [paperless] INFO: OCR completed (lang=deu, confidence=0.99)\n2026-03-07 07:45:22 [paperless] INFO: Auto-classified: Type=Invoice, Correspondent=Stadtwerke Musterstadt\n2026-03-07 07:45:22 [paperless] INFO: Auto-tagged: [utilities, electricity, invoice, 2026]\n2026-03-07 07:45:22 [paperless] INFO: Detected amount: 1,735.80 EUR\n2026-03-07 07:45:23 [paperless] INFO: Stored as document #849\n2026-03-07 07:45:23 [paperless] INFO: Consumption complete. 3 documents processed, 0 errors.\n\n2026-03-07 07:45:30 [archivist-bot] INFO: Received notification: 3 new documents in Paperless\n2026-03-07 07:45:31 [archivist-bot] INFO: Posting summary to #documents room\n2026-03-07 07:45:31 [synapse] INFO: PUT /_matrix/client/v3/rooms/!doc123:example-home.net/send/m.room.message - 200 OK (5ms)\n\n=== 2026-03-07 08:00 - IMMICH ML PROCESSING ===\n\n2026-03-07 08:00:01 [immich-server] INFO: Server health check: OK\n2026-03-07 08:00:01 [immich-server] INFO: Connected to database: OK (latency: 2ms)\n2026-03-07 08:00:01 [immich-server] INFO: Connected to Redis: OK\n2026-03-07 08:00:02 [immich-server] INFO: Asset statistics: 15,234 photos, 892 videos, 634GB total\n2026-03-07 08:00:05 [immich-ml] INFO: Loading CLIP model: ViT-B-32__openai\n2026-03-07 08:00:12 [immich-ml] INFO: CLIP model loaded (7.2s, 890MB GPU memory)\n2026-03-07 08:00:13 [immich-ml] INFO: Loading facial recognition model: buffalo_l\n2026-03-07 08:00:18 [immich-ml] INFO: Facial recognition model loaded (5.1s, 1.2GB GPU memory)\n2026-03-07 08:00:18 [immich-ml] INFO: Starting job queue processing\n2026-03-07 08:00:19 [immich-ml] INFO: Found 1,203 unprocessed assets in queue (from yesterday's upload)\n2026-03-07 08:00:20 [immich-ml] INFO: Processing batch 1/1203 - facial recognition\n2026-03-07 08:00:22 [immich-ml] INFO: Found 2 faces in IMG_4501.jpg (confidence: 0.97, 0.91)\n2026-03-07 08:00:22 [immich-ml] INFO: Matched: Person #1 (Emma), Person #3 (Max)\n2026-03-07 08:00:24 [immich-ml] INFO: Processing batch 2/1203 - CLIP embedding\n2026-03-07 08:00:26 [immich-ml] INFO: Generated CLIP embedding for IMG_4501.jpg (512-dim, 1.8s)\n2026-03-07 08:00:28 [immich-ml] INFO: Processing batch 3/1203 - facial recognition\n2026-03-07 08:00:30 [immich-ml] INFO: Found 4 faces in IMG_4502.jpg (confidence: 0.98, 0.95, 0.88, 0.71)\n2026-03-07 08:00:30 [immich-ml] INFO: Matched: Person #1 (Emma), Person #3 (Max), Person #5 (Alex)\n2026-03-07 08:00:30 [immich-ml] INFO: New face detected (confidence: 0.71) - added to unmatched queue\n2026-03-07 08:00:32 [immich-ml] INFO: Processing batch 4/1203 - CLIP embedding\n2026-03-07 08:00:34 [immich-ml] INFO: Generated CLIP embedding for IMG_4502.jpg (512-dim, 1.6s)\n2026-03-07 08:05:00 [immich-ml] INFO: Progress: 67/1203 (5.6%), ETA: ~2h 15min\n2026-03-07 08:10:00 [immich-ml] INFO: Progress: 134/1203 (11.1%), memory: 9.8GB/12GB\n2026-03-07 08:12:33 [immich-ml] INFO: Processing batch 847/1203 - facial recognition\n2026-03-07 08:12:34 [immich-ml] INFO: Found 3 faces in IMG_4521.jpg (confidence: 0.94, 0.87, 0.72)\n2026-03-07 08:12:35 [immich-ml] INFO: Clustering face embeddings... 12,847 vectors\n2026-03-07 08:12:38 [immich-ml] INFO: Clustering complete: 23 persons identified, 47 unmatched\n2026-03-07 08:12:39 [immich-ml] INFO: Processing batch 848/1203 - facial recognition\n2026-03-07 08:12:40 [immich-ml] INFO: Processing batch 849/1203 - CLIP embedding\n2026-03-07 08:12:42 [immich-ml] INFO: Generated CLIP embedding for IMG_4522.jpg (512-dim)\n2026-03-07 08:12:44 [immich-ml] WARNING: Low memory condition detected (11.8GB/12GB = 98.3%)\n2026-03-07 08:12:44 [immich-ml] WARNING: Triggering garbage collection...\n2026-03-07 08:12:45 [immich-ml] INFO: Memory reclaimed: 1.2GB freed (now 10.6GB/12GB)\n2026-03-07 08:12:46 [immich-ml] INFO: Processing batch 850/1203 - facial recognition\n2026-03-07 08:12:50 [immich-ml] INFO: Queue status: 353 remaining, ETA: ~47 minutes\n2026-03-07 08:30:00 [immich-ml] INFO: Progress: 956/1203 (79.5%), memory: 11.2GB/12GB\n2026-03-07 08:45:00 [immich-ml] INFO: Progress: 1089/1203 (90.5%)\n2026-03-07 08:55:00 [immich-ml] INFO: Progress: 1198/1203 (99.6%)\n2026-03-07 08:56:12 [immich-ml] INFO: Queue processing complete: 1,203 assets processed\n2026-03-07 08:56:12 [immich-ml] INFO: Results: 3,847 faces found, 23 persons, 1,203 CLIP embeddings\n2026-03-07 08:56:13 [immich-ml] INFO: Total processing time: 56m 13s\n2026-03-07 08:56:13 [immich-ml] INFO: Entering idle mode\n\n=== 2026-03-07 10:00 - MIDMORNING ===\n\n2026-03-07 10:00:00 [adguard] INFO: Hourly DNS: 12,847 queries, 3,421 blocked (26.6%)\n2026-03-07 10:00:01 [adguard] WARNING: Client 192.168.188.103 still bypassing AdGuard DNS\n\n2026-03-07 10:15:00 [homepage] INFO: Widget refresh cycle\n2026-03-07 10:15:01 [homepage] INFO: AdGuard widget: OK (23ms)\n2026-03-07 10:15:01 [homepage] INFO: Immich widget: OK (124ms) - 15,234 photos\n2026-03-07 10:15:02 [homepage] WARNING: Paperless widget: timeout (5000ms)\n2026-03-07 10:15:02 [homepage] INFO: Forgejo widget: OK (87ms)\n2026-03-07 10:15:03 [homepage] INFO: Synapse widget: OK (201ms)\n2026-03-07 10:15:03 [homepage] INFO: Retrying Paperless widget...\n2026-03-07 10:15:05 [homepage] INFO: Paperless widget: OK (1,847ms) - 849 documents\n2026-03-07 10:15:05 [homepage] WARNING: Paperless response slow (>1s) - possible index rebuild\n\n2026-03-07 11:00:00 [forgejo] INFO: Scheduled mirror sync\n2026-03-07 11:00:01 [forgejo] INFO: Syncing alex/nanobot from https://github.com/HKUDS/nanobot.git\n2026-03-07 11:00:04 [forgejo] INFO: alex/nanobot: up to date (last commit: 2026-03-01)\n2026-03-07 11:00:04 [forgejo] INFO: Mirror sync complete. Next sync: 2026-03-07 19:00:00\n\n=== 2026-03-07 12:00 - MIDDAY STATUS ===\n\n2026-03-07 12:00:00 [docker] INFO: Container health check summary:\n2026-03-07 12:00:00 [docker] caddy: healthy (uptime: 4d 3h)\n2026-03-07 12:00:00 [docker] adguard: healthy (uptime: 4d 3h)\n2026-03-07 12:00:00 [docker] immich-server: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] immich-ml: healthy (uptime: 4d 3h) [idle]\n2026-03-07 12:00:01 [docker] immich-postgres: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] immich-redis: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] synapse: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] synapse-postgres: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] element-web: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] paperless: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] homepage: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] dockge: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] forgejo: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] butler: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] alfred: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] kit: healthy (uptime: 1d 7h)\n2026-03-07 12:00:03 [docker] server-bot: healthy (uptime: 4d 3h)\n2026-03-07 12:00:03 [docker] INFO: 17/17 containers healthy. Memory: 39.1GB / 64GB\n\n2026-03-07 14:00:00 [timemachine] INFO: Status check: last backup 2026-03-07 03:09 (successful)\n2026-03-07 14:00:01 [timemachine] INFO: Disk: 4.1TB / 5.5TB (75%), 51 snapshots\n\n2026-03-07 15:00:00 [adguard] INFO: Hourly DNS: 8,234 queries, 2,134 blocked (25.9%)\n\n=== 2026-03-07 16:00 - AFTERNOON ACTIVITY ===\n\n2026-03-07 16:12:00 [immich-server] INFO: Upload started from 192.168.188.101 (iphone-alex)\n2026-03-07 16:12:01 [immich-server] INFO: Receiving: 12 new photos (48MB total)\n2026-03-07 16:12:15 [immich-server] INFO: Upload complete: 12 assets stored\n2026-03-07 16:12:16 [immich-ml] INFO: Waking from idle, 12 new assets queued\n2026-03-07 16:12:20 [immich-ml] INFO: Processing 12 assets (face detection + CLIP)\n2026-03-07 16:13:45 [immich-ml] INFO: Batch complete: 12 assets, 28 faces, 12 CLIP embeddings (85s)\n2026-03-07 16:13:46 [immich-ml] INFO: Entering idle mode\n\n2026-03-07 16:30:00 [synapse] INFO: POST /_matrix/client/v3/rooms/!fam123:example-home.net/send/m.room.message - 200 OK (7ms)\n2026-03-07 16:30:01 [synapse] INFO: POST /_matrix/media/v3/upload - 200 OK (234ms, 2.3MB image)\n2026-03-07 16:30:05 [synapse] INFO: GET /_matrix/client/v3/sync - 3 clients synced\n\n2026-03-07 17:00:00 [adguard] INFO: Hourly DNS: 11,234 queries, 3,012 blocked (26.8%)\n\n=== 2026-03-07 18:00 - EVENING ===\n\n2026-03-07 18:00:00 [docker] INFO: Container health check: 17/17 healthy. Memory: 38.7GB / 64GB\n\n2026-03-07 19:00:00 [forgejo] INFO: Scheduled mirror sync\n2026-03-07 19:00:01 [forgejo] INFO: Syncing alex/nanobot: up to date\n2026-03-07 19:00:02 [forgejo] INFO: Mirror sync complete\n\n2026-03-07 20:00:00 [synapse] INFO: Database maintenance: VACUUM ANALYZE\n2026-03-07 20:00:14 [synapse] INFO: VACUUM completed in 14.2s\n2026-03-07 20:00:15 [synapse] INFO: Database size: 2.1GB (reclaimed 45MB)\n2026-03-07 20:00:15 [synapse] INFO: Largest tables: state_groups_state (845MB), event_json (412MB), events (298MB)\n\n2026-03-07 21:00:00 [adguard] INFO: Hourly DNS: 6,847 queries, 1,823 blocked (26.6%)\n\n2026-03-07 21:30:00 [ollama] INFO: Model qwen3-coder:30b unloaded (idle timeout: 5m)\n2026-03-07 21:30:00 [ollama] INFO: GPU memory freed: 17.3GB\n\n2026-03-07 22:00:00 [adguard] INFO: Daily DNS statistics:\n2026-03-07 22:00:00 [adguard] INFO: Total queries: 148,234\n2026-03-07 22:00:00 [adguard] INFO: Blocked: 39,847 (26.9%)\n2026-03-07 22:00:01 [adguard] INFO: Average response time: 14ms\n2026-03-07 22:00:01 [adguard] INFO: Unique clients: 8\n2026-03-07 22:00:01 [adguard] WARNING: Client 192.168.188.103 bypassed AdGuard all day (2,134 direct queries)\n\n2026-03-07 22:00:05 [docker] INFO: Evening health check: 17/17 healthy. Memory: 21.4GB / 64GB (Ollama models unloaded)\n```" + } + ] +} \ No newline at end of file diff --git a/results/qwen3.6-27b-dense-mlx-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.md b/results/qwen3.6-27b-dense-mlx-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.md new file mode 100644 index 0000000..20fb30d --- /dev/null +++ b/results/qwen3.6-27b-dense-mlx-6bit/prefill-test/m4-max-128gb-40gpu_lmstudio.md @@ -0,0 +1,18 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen3.6-27b +**Backend:** lmstudio +**Scenario:** prefill-test (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 655 | 3.94s | 3.73s | 21.7 | **10.6** | 7.67s | 81 | +| 2 | 1,453 | 7.98s | 7.01s | 20.4 | **9.5** | 14.99s | 143 | +| 3 | 3,015 | 16.57s | 5.52s | 20.1 | **5.0** | 22.10s | 111 | +| 4 | 8,496 | 67.00s | 7.53s | 19.3 | **1.9** | 74.52s | 145 | + +**Total prefill:** 95.5s +**Total generation:** 23.8s +**Total time:** 119.3s +**Avg generation tok/s:** 20.4 +**Avg effective tok/s:** 4.0 diff --git a/results/qwen3.6-35b-a3b/creative-writing/m4-max-128gb-40gpu_lmstudio-mlx.json b/results/qwen3.6-35b-a3b/creative-writing/m4-max-128gb-40gpu_lmstudio-mlx.json new file mode 100644 index 0000000..7b6a373 --- /dev/null +++ b/results/qwen3.6-35b-a3b/creative-writing/m4-max-128gb-40gpu_lmstudio-mlx.json @@ -0,0 +1,70 @@ +{ + "meta": { + "scenario": "creative-writing", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio-mlx", + "backend": "lmstudio-mlx", + "model_info": { + "name": "qwen3.6-35b-a3b", + "format": "mlx" + }, + "runs": 1, + "max_tokens": 2000, + "cold": false, + "warm_up_time": 0.183, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T14:51:54" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 57, + "new_tokens_est": 29, + "ttft": 0.422, + "gen_time": 5.122, + "gen_tps": 89.8, + "total": 5.544, + "output_tokens": 460, + "_response": "In the throat of the earth where the concrete breathes cold,\nBeneath the floorboards that hide the stories told,\nA hive of black boxes stands in silent rows,\nWith eyes of blinking green and amber glow.\n\nNo sun has touched this floor for thirty years,\nJust the low, electric hum of distant fears.\nThe fans spin up their white-noise lullaby,\nKeeping the ghosts of data from dying.\n\nHere lies the summer of ninety-four,\nWhen the camera shook and we laughed by the shore.\nA JPEG frozen in pixels and light,\nCaptured fast before the end of night.\n\nAnd there, a folder named \u201cChristmas 2009,\u201d\nHolds the silence of a tear-stained sky.\nThe video file, corrupted at start,\nStill plays the moment before it went dark.\n\nThese silicon hearts beat with binary blood,\nHolding the scattered pieces of mud\nAnd memory, glued together by code,\nOn a server rack on this heavy road.\n\nA hard drive spins at seven thousand RPM,\nWhispering secrets of who we were then.\nA gigabyte grave for a grandmother\u2019s smile,\nPreserved in the cold of this digital style.\n\nIf the power cuts and the grid goes down,\nWill the images fade in a digital drown?\nOr will they persist in the magnetic grain,\nWaiting for someone to press play again?\n\nThe heat rises up through the sub-basement floor,\nWarmth that we cannot feel anymore.\nBut inside the chip, the light stays bright,\nDefying the decay of day and night.\n\nWe walk on above, drinking tea and rain,\nUnaware of the ghosts that remain.\nAlive in the dark, in the humming maze,\nLost in the web of our private days.\n\nSo listen close if you stand on the rug,\nPast the kitchen stool and the pantry hug.\nCan you hear it? The low, steady drone?\nThe keeper of moments, alone in stone.\n\nFor every laugh and every sigh,\nIs locked away in a silicon sky.\nSafe from the rust, safe from the rot,\nIn this dark and deep and electric spot.", + "_user": "Write a poem about a mass of servers humming in a dark basement, keeping a family's memories alive. At least 30 lines." + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 60, + "new_tokens_est": 32, + "ttft": 0.294, + "gen_time": 8.421, + "gen_tps": 91.7, + "total": 8.714, + "output_tokens": 772, + "_response": "In the hollow of an ancient oak, where the roots curled like sleeping dragons, lived Barnaby. While his neighbor, Silas the Hare, spent his daylight hours charging diamond-tier graphics cards and tuning liquid-cooled cooling loops, Barnaby spent his nights weaving fiber-optic strands from spider silk and carving silicon wafers from smooth river stones.\n\nSilas\u2019s setup was a symphony of neon lights and aggressive humming, capable of rendering worlds in milliseconds. Barnaby\u2019s creation was a box of polished walnut, filled with gears that clicked softly, like the heartbeat of a hibernating bear. It had no screen, only a single, tiny punch-card slot and a dial that turned with the resistance of deep earth.\n\nOne evening, Silas laughed as he watched Barnaby insert a single card into his machine. \"I can simulate a supernova in that box before you\u2019ve finished winding the spring,\" Silas teased, his eyes reflecting the blue glow of his monitors. \"Why bother? You\u2019ll be old dust before your first calculation finishes.\"\n\nBarnaby did not look up. \"I am not calculating for speed, Silas,\" he said, his voice as slow and steady as the sap rising in spring. \"I am calculating for truth.\"\n\nSilas shrugs and returned to his game, his fingers flying across a mechanical keyboard. He played until the sky turned purple, then gray, then black. His eyes burned. His back ached. His rig overheated, forcing him to shut it down for an hour while fans whirred desperately. He slept fitfully, dreaming of lag and frame drops.\n\nBarnaby did not sleep. When the moon was high, he would wind a tiny crank. One turn for every minute of pause. Two turns for every question asked by the wind. His machine did not produce answers instantly; it produced them only when the gears had settled, when the weight of the question balanced perfectly against the counterweight of his patience.\n\nYears passed. Silas grew arrogant, then tired, then worn down by the relentless pace of new releases and higher demands. His rig became obsolete, replaced by newer, faster lights that demanded more of him. He found himself chasing ghosts in the machine, always one step behind the next update, always resting, never present.\n\nMeanwhile, Barnaby\u2019s machine, though slower than a single blink of Silas\u2019s eye, had never stopped. It solved the riddle of the migrating birds\u2019 paths by watching them for ten years without distraction. It mapped the growth rings of the oak tree down to the finest grain, using data that had accumulated slowly, layer by heavy layer.\n\nOne day, a storm struck the forest, knocking out the power grid for miles. Silas\u2019s high-tech sanctuary went dark and useless. He sat in his gloom, stranded without his digital crutches, panic rising in his chest as he realized he no longer knew how to think without the screen.\n\nBarnaby stepped out of his oak. His small walnut box was still there, untouched by the lightning. He inserted a card. The gears clicked. Once. Twice. A week later, a small paper strip emerged from the slot with a single number written on it.\n\nIt was the safe path through the storm-damaged forest, calculated not by raw processing power, but by a lifetime of observation and perfect, uninterrupted focus.\n\nSilas looked at the paper, then at his dark, silent computer. He realized that while he had been moving fast, he had gone nowhere. Barnaby, who never rested, had arrived everywhere.\n\nSilas put down the mouse. He picked up a pen. And for the first time in years, he began to write his own story, slowly, one word at a time.", + "_user": "Write a short fable about a tortoise who built a tiny computer that was slower than the hare's gaming rig but never needed to rest." + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 58, + "new_tokens_est": 31, + "ttft": 0.303, + "gen_time": 5.211, + "gen_tps": 93.3, + "total": 5.514, + "output_tokens": 486, + "_response": "The dust motes dance in shafts of amber light,\nWhere shadows stretch across the rotting floor,\nAnd time has turned the attic to a night\nThat sleeps beneath the weight of centuries more.\nI pull aside the velvet, cracked and gray,\nTo find a box of silver, sealed in wax,\nThat holds the final breath of yesterday,\nBefore the cloud dissolved the physical facts.\n\nInside, a rectangle of slightest gloss,\nPreserved in vacuum-sealed, inert air,\nA moment caught before the final loss,\nWhen ink and chemical were still aware.\nIt shows a hand, translucent in the grain,\nHolding a tool that hummed with silent heat,\nThe printer\u2019s last, mechanical refrain,\nBefore the data stream dissipated complete.\n\nHer face is sharp against the fading white,\nEyes bright with hope for something tangible,\nFor weight, and texture, and the deep delight\nOf holding memory when it was changeable.\nShe smiles at us across a hundred years,\nUnaware that paper would become a myth,\nA relic found in forgotten corners here,\nWhen memory became a liquid wraith.\n\nThe edges curl, though protected well,\nBy plastic skins that never quite deceived,\nFor even here, the decay began to swell,\nAs entropy within the heavens roved.\nBut look how vibrant is the crimson dress,\nHow distinct the shadow on the wall,\nA physical artifact, a universe,\nBefore we lost the power to hold it all.\n\nNo code can replicate this chemical birth,\nThis silver halide\u2019s slow and patient kiss,\nThe way the light surrendered to its worth,\nTrapped in a grid of microscopic bliss.\nIt is the last true thing we ever made,\nBefore the mind was left alone in space,\nA ghost of light, a paper-made decayed,\nThat time could not erase in a single glance.\n\nI touch the surface, rough with age and dust,\nAnd feel the pulse of someone else\u2019s art,\nThe final echo, turned to quiet trust,\nBefore the digital sky broke apart.\nHere lies the proof that we were once so bold,\nTo make a ghost we could hold in our hand,\nBefore the story turned to liquid gold,\nAnd everything we knew fell from the land.", + "_user": "Write a poem about the last photograph ever printed on paper, found in an attic a hundred years from now. At least 25 lines." + } + ] +} \ No newline at end of file diff --git a/results/qwen3.6-35b-a3b/creative-writing/m4-max-128gb-40gpu_lmstudio-mlx.md b/results/qwen3.6-35b-a3b/creative-writing/m4-max-128gb-40gpu_lmstudio-mlx.md new file mode 100644 index 0000000..517ed78 --- /dev/null +++ b/results/qwen3.6-35b-a3b/creative-writing/m4-max-128gb-40gpu_lmstudio-mlx.md @@ -0,0 +1,17 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen3.6-35b-a3b +**Backend:** lmstudio-mlx +**Scenario:** creative-writing (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 57 | 0.42s | 5.12s | 89.8 | **83.0** | 5.54s | 460 | +| 2 | 60 | 0.29s | 8.42s | 91.7 | **88.6** | 8.71s | 772 | +| 3 | 58 | 0.30s | 5.21s | 93.3 | **88.1** | 5.51s | 486 | + +**Total prefill:** 1.0s +**Total generation:** 18.8s +**Total time:** 19.8s +**Avg generation tok/s:** 91.6 +**Avg effective tok/s:** 86.9 diff --git a/results/qwen3.6-35b-a3b/doc-summary/m4-max-128gb-40gpu_lmstudio-mlx.json b/results/qwen3.6-35b-a3b/doc-summary/m4-max-128gb-40gpu_lmstudio-mlx.json new file mode 100644 index 0000000..17579d6 --- /dev/null +++ b/results/qwen3.6-35b-a3b/doc-summary/m4-max-128gb-40gpu_lmstudio-mlx.json @@ -0,0 +1,95 @@ +{ + "meta": { + "scenario": "doc-summary", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio-mlx", + "backend": "lmstudio-mlx", + "model_info": { + "name": "qwen3.6-35b-a3b", + "format": "mlx" + }, + "runs": 1, + "max_tokens": 150, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T14:52:05" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 425, + "new_tokens_est": 324, + "ttft": 0.606, + "gen_time": 1.239, + "gen_tps": 90.4, + "total": 1.845, + "output_tokens": 112, + "_response": "1. **Category**: Invoice\n2. **Tags**: Utility Bill, Electricity, Annual Statement, Balance Due, Portland Electric\n3. **Summary**: The Miller Family is billed $1,046.49 for annual electricity usage (Jan 1 - Dec 31, 2025), with a remaining balance of $26.49 to be charged on 03/15/2026. New monthly payments will increase to $88.00 starting 03/01/2026.", + "_user": "Please process this document:\n\n---\nPORTLAND ELECTRIC UTILITY\nCustomer Service | PO Box 4400 | Portland, OR 97208\n\nThe Miller Family\n742 Maple Street\nPortland, OR 97201\n\nAnnual Electricity Statement 2025\nAccount Number: PE-2025-44812\nBilling Period: 01/01/2025 - 12/31/2025\nMeter Number: EMH-0048712\n\nUsage:\n Meter reading 01/01/2025: 34,812 kWh\n Meter reading 12/31/2025: 38,947 kWh\n Annual consumption: 4,135 kWh\n\nCharges:\n Energy charge 4,135 kWh x $0.1147/kWh $474.28\n Base charge 12 months x $12.50 $150.00\n Transmission & distribution $287.40\n Public purpose charge $85.19\n Renewable energy surcharge $0.00\n Franchise fee $49.62\n ---------------------------------------------------\n Total charges $1,046.49\n Payments received (12 x $85.00) $1,020.00\n ---------------------------------------------------\n Balance due $26.49\n\nYour new monthly payment starting 03/01/2026: $88.00\n\nThe balance will be charged to your account on 03/15/2026.\nBank account ending in: ****4130\n\nQuestions? Call 1-800-555-4321 (toll free)\nor email: service@portlandelectric.example.com\n---" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 612, + "new_tokens_est": 512, + "ttft": 0.537, + "gen_time": 0.947, + "gen_tps": 90.8, + "total": 1.484, + "output_tokens": 86, + "_response": "1. **Category**: School Report\n2. **Tags**: Emma Miller, Forest Grove Elementary, Academic Performance, Principal Sign-off, 2026\n3. **Summary**: Mid-year report card for Emma Miller (Grade 3B) dated February 14, 2026, detailing strong performance in English and Math with three excused absences. Document signed by Teacher Dr. Schneider and Principal Mr. Brown.", + "_user": "Next document:\n\n---\nFOREST GROVE ELEMENTARY SCHOOL\nPrincipal's Office | 15 Forest Road | Portland, OR 97201\n\nMid-Year Report Card \u2014 School Year 2025/26\n\nStudent: Emma Miller\nGrade: 3B\nTeacher: Dr. Schneider\nDate: 02/14/2026\n\nEnglish Language Arts:\nEmma reads fluently and with good expression. She understands texts quickly and can summarize their content accurately. Her essays are creative and well-structured. Spelling is solid, with occasional errors on double consonants. She participates regularly in class discussions and contributes her own ideas.\n\nMathematics:\nEmma has a strong grasp of numbers up to 1,000. She completes addition and subtraction problems quickly and accurately. She shows good understanding of written multiplication, though division sometimes takes her a bit longer. She solves word problems methodically and can explain her reasoning. She identifies and names geometric shapes reliably.\n\nScience:\nEmma shows strong interest in natural science topics. For the \"Our Forest\" project she prepared an excellent presentation on mushrooms. She asks thoughtful questions and works carefully during experiments.\n\nArt:\nEmma creates with imagination and persistence. Her color compositions are mature for her age. She enjoys trying new techniques and helps classmates with their projects.\n\nPhysical Education:\nEmma is physically coordinated and shows good effort. In team sports she is fair and supports weaker teammates. In swimming class she earned her Bronze swimming badge.\n\nSocial Skills:\nEmma is friendly, helpful, and respectful toward classmates and teachers. She resolves conflicts calmly and gladly takes on classroom responsibilities.\n\nWork Habits:\nEmma works independently and reliably. Her notebooks are neatly kept. She completes homework conscientiously. She concentrates well and manages her time effectively.\n\nDays absent: 3 (excused)\n\nPortland, 02/14/2026\n\n_________________________ _________________________\nDr. Schneider Mr. Brown\nClassroom Teacher Principal\n---" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 535, + "new_tokens_est": 434, + "ttft": 0.584, + "gen_time": 0.971, + "gen_tps": 93.7, + "total": 1.555, + "output_tokens": 91, + "_response": "1. **Category**: Medical\n2. **Tags**: Pediatric, Well-Child, Developmental Assessment, Immunization, Speech Therapy\n3. **Summary**: Dr. Karla Hoffman examined Max Miller on 03/03/2026 for a five-year well-child checkup. The report notes normal physical and social-emotional development, administers a DTaP/IPV booster, and recommends speech therapy for articulation issues.", + "_user": "And this one:\n\n---\nDR. KARLA HOFFMAN, MD\nFamily Medicine\n3 Linden Plaza | Portland, OR 97205\nTel: 503-555-7890 | Fax: 503-555-7891\n\nWELL-CHILD VISIT REPORT\n\nPatient: Max Miller, DOB 07/15/2019\nDate of examination: 03/03/2026\n\nReason for visit:\n5-year well-child checkup\n\nFindings:\n\nPhysical Development:\n Height: 46.5 in (75th percentile)\n Weight: 47.0 lbs (65th percentile)\n BMI: 15.3 (normal range)\n General condition good, age-appropriate nutrition\n\nVision:\n Vision screening passed both eyes (Lea Symbols)\n No strabismus, stereopsis present\n\nHearing:\n Audiometry screening unremarkable both ears\n\nMotor Skills:\n Gross motor: Hops on one foot confidently, catches ball, rides bicycle without training wheels\n Fine motor: Draws person with 6+ details, cuts out shapes, ties simple knots\n Age-appropriate development\n\nSpeech & Language:\n Speaks in complete, grammatically correct sentences\n Counts to 20, knows colors and shapes\n Tells coherent stories\n Mild difficulty with /sh/ and /ch/ sounds \u2014 speech therapy evaluation recommended\n\nSocial-Emotional Development:\n Age-appropriate. Plays cooperatively, can wait turns, understands simple rules.\n Parents report occasional tantrums during transitions (leaving playground, etc.) \u2014 within normal range for age.\n\nImmunizations:\n DTaP/IPV booster administered (Kinrix)\n Next due: flu vaccine in fall 2026\n\nRecommendations:\n 1. Schedule speech therapy appointment for /sh/ and /ch/ sounds\n 2. Annual dental checkup (last visit >12 months ago)\n 3. Next well-child visit: age 7-8 (pre-kindergarten)\n\nSchool readiness from medical perspective: likely ready.\nSchool district screening still pending.\n\nPortland, 03/03/2026\n\n_________________________\nDr. Karla Hoffman, MD\n---" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 524, + "new_tokens_est": 423, + "ttft": 0.576, + "gen_time": 1.033, + "gen_tps": 92.9, + "total": 1.609, + "output_tokens": 96, + "_response": "1. **Category**: Insurance\n2. **Tags**: Policy Adjustment, Premium Increase, Homeowner's Insurance, Coverage Change, Notice\n3. **Summary**: Pacific Northwest Insurance Group notifies Thomas Miller of a 3% premium increase effective 04/01/2026 due to index adjustments. New annual premium is $1,866.36 with coverage increased to $293,550; policyholder has one month to object.", + "_user": "Next:\n\n---\nPACIFIC NORTHWEST INSURANCE GROUP\n500 Congress Center Blvd | Portland, OR 97204\n\nNotice of Policy Adjustment\n\nPolicyholder: Thomas Miller\nPolicy Number: HO-2019-887432\nPolicy: Homeowner's Insurance Plus\n\nDear Mr. Miller,\n\nDue to the annual adjustment of your insurance policy to the current homeowner's insurance index, we are notifying you of the following changes, effective 04/01/2026:\n\nPrevious coverage amount: $285,000.00\nNew coverage amount: $293,550.00 (increase 3.0%)\n\nPrevious annual premium: $1,812.00\nNew annual premium: $1,866.36 (increase 3.0%)\nMonthly premium: $155.53\n\nYour coverage summary:\n - Dwelling and personal property against fire, theft, water damage, windstorm/hail\n - Bicycle theft up to $2,000 (including away from home)\n - Power surge damage from lightning\n - Hotel costs if uninhabitable up to $100/day, max 30 days\n - Deductible: $500 per claim\n - Guaranteed replacement cost with accurate square footage\n\nCurrent square footage on file: 1,022 sq ft\n\nImportant: If your home's square footage has changed (e.g., addition, finished basement), please notify us within 30 days to ensure your coverage remains adequate.\n\nYou have the right to object to this adjustment within one month of receiving this notice. In that case, your policy will terminate at the next renewal date.\n\nQuestions? Contact us:\nPhone: 503-922-1000 (Mon-Fri 8am-6pm)\nEmail: service@pnw-insurance.example.com\nOnline: www.my-pnw-insurance.example.com\n\nSincerely,\n\nS. Lechner\nProperty Insurance Department\nPacific Northwest Insurance Group\n\nEnclosures:\n- Updated premium schedule\n- Revised policy terms (2026 edition)\n---" + }, + { + "turn": 5, + "run": 1, + "ctx_tokens_est": 1518, + "new_tokens_est": 1417, + "ttft": 1.103, + "gen_time": 1.133, + "gen_tps": 90.9, + "total": 2.236, + "output_tokens": 103, + "_response": "1. **Category**: Legal\n2. **Tags**: Lease Agreement, Residential Tenancy, Landlord Tenant, Property Management, Rental Contract\n3. **Summary**: Lease signed on 04/15/2021 between Cascade Property Management LLC and Thomas and Sarah Miller for 742 Maple Street. Monthly rent is $1,970.00 with a $1,970.00 security deposit; term begins 05/01/2021.", + "_user": "Process this multi-page document:\n\n---\nRESIDENTIAL LEASE AGREEMENT\n\nBetween\n Cascade Property Management LLC\n represented by Stefan Huber, Managing Partner\n 500 Congress Center Blvd, Suite 400, Portland, OR 97204\n Tax ID: 93-1234567\n \u2014 hereinafter \"Landlord\" \u2014\n\nand\n Thomas Miller and Sarah Miller\n currently residing at: 12 Birch Lane, Portland, OR 97225\n \u2014 hereinafter \"Tenant\" \u2014\n\nThe following lease agreement is entered into:\n\nSECTION 1: PREMISES\n\nThe Landlord leases to the Tenant the following dwelling:\n Address: 742 Maple Street, Unit 2A, Portland, OR 97201\n Living area: approximately 1,022 sq ft\n Rooms: 4 (3 bedrooms, kitchen, bathroom, hallway, storage closet)\n Year built: 1962, last renovation: 2019\n Energy rating: 87 kBtu/sq ft/yr, Class C\n Heating: Central gas furnace\n\nIncluded with the unit:\n - Storage unit #7 in basement (approx. 85 sq ft)\n - 1 parking space in underground garage (#TG-14)\n - Shared use: laundry room, drying room, bicycle storage, garden\n\nNot included:\n - Attic (restricted access)\n - Community sauna in basement (separate agreement required)\n\nSECTION 2: LEASE TERM\n\nThe lease begins on 05/01/2021 and runs for an indefinite period.\nEither party may terminate with 30 days written notice before the end of the month.\nAfter 12 months of tenancy, the Landlord's notice period extends to 60 days.\nAfter 24 months, the Landlord's notice period extends to 90 days.\nOregon state law (ORS 90.427) governs all termination procedures.\n\nSECTION 3: RENT AND UTILITIES\n\n3.1 Base Rent:\n Dwelling: $1,850.00/month\n Parking: $120.00/month\n Total: $1,970.00/month\n\n3.2 Utilities included in rent:\n Water/sewer, garbage collection, recycling\n\n3.3 Utilities paid by Tenant:\n Electricity, gas (heating), internet, renter's insurance\n\n3.4 Estimated monthly utility costs (for reference only):\n Gas (heating/hot water): $145.00/month (winter avg)\n Electricity: $85.00/month\n Internet: $65.00/month\n\n3.5 Total estimated monthly cost: $2,265.00/month\n\n3.6 Rent is due on the 1st of each month. A grace period of 4 days\n is provided. Late fee of $50.00 applies after the 5th.\n Payment by check or electronic transfer to:\n Cascade Property Management LLC\n Account ending in: ****3456\n Reference: Rent 742Maple/2A - Miller\n\nSECTION 4: SECURITY DEPOSIT\n\n4.1 The Tenant shall pay a security deposit equal to one month's rent:\n $1,970.00\n\n4.2 The deposit shall be held in a trust account per Oregon law (ORS 90.300).\n\n4.3 The deposit shall be returned within 31 days of lease termination,\n less any lawful deductions for:\n - Unpaid rent or utilities\n - Damage beyond normal wear and tear\n - Cleaning costs if unit is not left in reasonable condition\n\n4.4 An itemized statement of any deductions shall accompany\n the deposit return.\n\nSECTION 5: CONDITION OF PREMISES\n\n5.1 The Tenant has inspected the unit and accepts it in its\n current condition, subject to the following noted defects:\n\n5.2 Move-in condition report (attached as Exhibit C):\n - Bedroom 2: Scratch on hardwood floor near window (approx. 12x8 in)\n - Bathroom: Caulking around bathtub discolored (Landlord will replace\n within 4 weeks of move-in)\n - Kitchen: Dishwasher connection leaking (will be repaired before move-in)\n\n5.3 A detailed move-in checklist with photographs is attached as Exhibit C.\n\nSECTION 6: MAINTENANCE AND REPAIRS\n\n6.1 The Landlord is responsible for:\n - Structural repairs and maintenance\n - Plumbing, electrical, and HVAC systems\n - Appliance repair/replacement (those provided by Landlord)\n - Common area maintenance\n - Pest control\n\n6.2 The Tenant is responsible for:\n - Keeping the unit clean and sanitary\n - Minor maintenance (light bulbs, HVAC filters, smoke detector batteries)\n - Reporting maintenance issues promptly in writing\n - Damage caused by Tenant, household members, or guests\n\n6.3 Emergency maintenance (burst pipe, no heat in winter, electrical hazard)\n should be reported immediately to: 503-555-9111 (24-hour line)\n\nSECTION 7: HOUSE RULES\n\nThe attached house rules (Exhibit B) are part of this agreement.\nKey provisions:\n - Quiet hours: 10:00 PM - 7:00 AM daily\n - No charcoal or gas grills on balconies. Electric grills permitted.\n - Smoking: Permitted inside unit only, not in common areas or balcony\n - Pets: Small caged animals (fish, hamsters) allowed. Dogs and cats\n require prior written approval from Landlord. Pet deposit of $500 applies.\n - Musical instruments: Maximum 2 hours daily, not during quiet hours\n - Parking: One assigned space only. No vehicle repairs in garage.\n - Storage: No flammable materials in storage unit or common areas.\n\nSECTION 8: GENERAL PROVISIONS\n\n8.1 Amendments to this agreement must be in writing and signed by both parties.\n8.2 If any provision is found unenforceable, the remaining provisions\n shall remain in effect.\n8.3 This agreement is governed by Oregon Residential Landlord and Tenant Act.\n8.4 Two copies of this agreement are prepared, one for each party.\n\nExhibits:\n A. Floor plan of the unit\n B. House rules\n C. Move-in condition report with photographs\n D. Lead-based paint disclosure (pre-1978 building)\n E. Mold information disclosure\n F. Security deposit receipt\n\nPortland, OR, 04/15/2021\n\n_________________________ _________________________\nStefan Huber Thomas Miller\nCascade Property Management Tenant\nLLC, Managing Partner\n\n _________________________\n Sarah Miller\n Tenant\n---" + } + ] +} \ No newline at end of file diff --git a/results/qwen3.6-35b-a3b/doc-summary/m4-max-128gb-40gpu_lmstudio-mlx.md b/results/qwen3.6-35b-a3b/doc-summary/m4-max-128gb-40gpu_lmstudio-mlx.md new file mode 100644 index 0000000..20fc4af --- /dev/null +++ b/results/qwen3.6-35b-a3b/doc-summary/m4-max-128gb-40gpu_lmstudio-mlx.md @@ -0,0 +1,19 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen3.6-35b-a3b +**Backend:** lmstudio-mlx +**Scenario:** doc-summary (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 425 | 0.61s | 1.24s | 90.4 | **60.7** | 1.84s | 112 | +| 2 | 612 | 0.54s | 0.95s | 90.8 | **58.0** | 1.48s | 86 | +| 3 | 535 | 0.58s | 0.97s | 93.7 | **58.5** | 1.55s | 91 | +| 4 | 524 | 0.58s | 1.03s | 92.9 | **59.7** | 1.61s | 96 | +| 5 | 1,518 | 1.10s | 1.13s | 90.9 | **46.1** | 2.24s | 103 | + +**Total prefill:** 3.4s +**Total generation:** 5.3s +**Total time:** 8.7s +**Avg generation tok/s:** 91.7 +**Avg effective tok/s:** 55.9 diff --git a/results/qwen3.6-35b-a3b/ops-agent/m4-max-128gb-40gpu_lmstudio-mlx.json b/results/qwen3.6-35b-a3b/ops-agent/m4-max-128gb-40gpu_lmstudio-mlx.json new file mode 100644 index 0000000..8be9abf --- /dev/null +++ b/results/qwen3.6-35b-a3b/ops-agent/m4-max-128gb-40gpu_lmstudio-mlx.json @@ -0,0 +1,142 @@ +{ + "meta": { + "scenario": "ops-agent", + "mode": "conversation", + "label": "m4-max-128gb-40gpu lmstudio-mlx", + "backend": "lmstudio-mlx", + "model_info": { + "name": "qwen3.6-35b-a3b", + "format": "mlx" + }, + "runs": 1, + "max_tokens": 500, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T14:52:39" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 575, + "new_tokens_est": 421, + "ttft": 0.79, + "gen_time": 2.201, + "gen_tps": 87.7, + "total": 2.991, + "output_tokens": 193, + "tool": "server_status", + "_response": "Everything is technically \"running,\" but there is one clear culprit causing the slowdown: **`immich-ml`**.\n\nHere\u2019s what I see:\n* **High CPU Usage:** `immich-ml` is using **45.2%** of your CPU.\n* **High Memory Usage:** It\u2019s consuming **8.2GB** of RAM.\n\nGiven that your Mac Studio has 64GB total, this isn't critically low on memory (you still have ~16.7GB free), but that CPU usage is significant and likely why the server feels sluggish. This service handles image/video processing for Immich (like face recognition or object detection). It often spikes when new media is scanned.\n\n**Recommendation:**\nIf you aren't actively uploading photos or videos right now, this high usage is abnormal. I can restart the Immich stack to clear any stuck processes. Would you like me to do that?", + "_user": "Something feels off with the server. Can you check what's running?" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 1007, + "new_tokens_est": 235, + "ttft": 0.636, + "gen_time": 3.608, + "gen_tps": 85.6, + "total": 4.243, + "output_tokens": 309, + "tool": "service_logs", + "_response": "The logs explain exactly what\u2019s happening. `immich-ml` is in the middle of a **massive media indexing job**.\n\nHere\u2019s the breakdown:\n* **Current Task:** It is processing batches of images for **facial recognition** and **CLIP embeddings** (which allows you to search photos by description, e.g., \"dog in park\").\n* **Progress:** It\u2019s on batch 850 out of 1,203. There are **351 images left** to process.\n* **ETA:** It estimates about **45 minutes** to finish.\n* **Memory Note:** The logs show a \"Low memory condition\" warning, but it successfully reclaimed 1.2GB via garbage collection. This confirms that the high RAM usage (8.2GB) is due to holding large image data in memory for processing, not a leak.\n\n**Action Plan:**\nSince there are only ~350 images left and an ETA of 45 minutes, this is likely a **one-time burst** after you added new photos. It should resolve itself shortly.\n\nWould you like to:\n1. **Wait:** Let it finish (safest, no data integrity risk).\n2. **Restart:** Force restart the service now (this will interrupt processing and may require re-scanning those 351 images, but will free up resources immediately).\n\nMost users prefer to wait for the initial scan to finish. What would you like to do?", + "_user": "Immich ML is eating a lot of CPU. What's it doing?" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 1402, + "new_tokens_est": 89, + "ttft": 0.555, + "gen_time": 2.322, + "gen_tps": 86.6, + "total": 2.877, + "output_tokens": 201, + "tool": "docker_exec", + "_response": "Yes, it is going to be OK. Here\u2019s why:\n\n1. **Memory Headroom:** The container has a hard limit of **12GB**, and it\u2019s currently using **8.2GB** (68%). You have about 3.8GB of buffer before it hits that limit, which is safe for this type of workload.\n2. **Garbage Collection:** The logs showed it successfully reclaimed memory earlier, meaning the application is managing its resources dynamically rather than leaking them.\n3. **Temporary Spike:** This high usage is typical for the initial scan of new media. Once those ~351 images are processed, CPU and memory usage will drop back to near zero.\n\n**Recommendation:**\nLet it finish its ~45-minute run. If you need to use the Mac Studio for something heavy right now (like video editing), feel free to let me know, and I can restart the service to pause it\u2014but otherwise, no action is needed.", + "_user": "Ah right, we uploaded vacation photos yesterday. Is it going to be OK memory-wise?" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 1827, + "new_tokens_est": 214, + "ttft": 0.58, + "gen_time": 4.185, + "gen_tps": 85.6, + "total": 4.765, + "output_tokens": 358, + "tool": "backup_status", + "_response": "The last backup ran this morning at **2:00 AM** and completed successfully, but with a warning.\n\nHere\u2019s the breakdown regarding your vacation photos:\n\n**\u2705 Good News:**\n* **Completed Successfully:** The job finished without fatal errors.\n* **Data Transferred:** It synced **12.4GB** of data across 1,847 files. Given that you uploaded vacation photos yesterday, it is highly likely these new files were included in this sync.\n\n**\u26a0\ufe0f The Warning:**\n* **\"Vault eject failed (non-fatal)\":** This suggests that while the data was written to your backup target, the system had trouble safely ejecting or unmounting the destination volume (likely an external drive or network share).\n* **Impact:** Since it\u2019s marked \"non-fatal\" and the status is still \"completed_with_warnings,\" the data was likely written to disk before the eject failed. However, it\u2019s worth checking that your backup drive is physically connected and mounted properly to ensure future backups don\u2019t get interrupted.\n\n**Recommendation:**\n1. **Verify Drive Connection:** Check that your backup destination drive is connected and accessible on the Mac Studio.\n2. **Spot Check:** If you have access to the backup location, confirm that a few recent vacation photos are present there.\n3. **Next Backup:** Monitor the next scheduled backup (tomorrow at 2:00 AM) to see if the \"vault eject\" warning persists. If it does, we may need to adjust how the backup script handles the drive mount/unmount process.\n\nIn short: **Your photos are likely safe in the last backup,** but you should ensure your backup drive is reliably connected for tomorrow\u2019s run.", + "_user": "Good. Check if last night's backup ran. I want to make sure the vacation photos are safe." + }, + { + "turn": 5, + "run": 1, + "ctx_tokens_est": 2471, + "new_tokens_est": 239, + "ttft": 0.701, + "gen_time": 4.28, + "gen_tps": 84.1, + "total": 4.98, + "output_tokens": 360, + "tool": "disk_usage", + "_response": "Disk space is in good shape, but **Time Machine** is getting full. Here\u2019s the breakdown:\n\n### 1. System Drive (`/`)\n* **Status:** Healthy (33% used).\n* You have 2.4TB free, so no worries here.\n\n### 2. Backup Vault (`/Volumes/backup-vault`)\n* **Status:** Healthy (69% used).\n* You have 1.7TB free, which is plenty for another year of backups. The \"vault eject\" warning from earlier was likely a transient connectivity or permission glitch, not a space issue.\n\n### 3. Time Machine (`/Volumes/time-machine`)\n* **Status:** \u26a0\ufe0f **Getting Full (75% used).**\n* Only 1.4TB free left. Time Machine usually handles old backups automatically, but if it\u2019s struggling to prune them or the drive is nearly full, future system backups might fail.\n\n### 4. App Data (`~/server/data`)\n* **Total:** ~892GB\n* **Photos (Immich):** 634GB \u2014 This matches your recent upload of vacation photos.\n* **Documents/Code:** Minimal usage.\n\n### Recommendation:\n**Check Time Machine.** Since it\u2019s at 75%, keep an eye on it. If you don\u2019t need local backups for every single Mac Studio change, you might want to:\n1. Check if Time Machine is automatically deleting old backups (it should be).\n2. If it\u2019s stuck, you may need to manually delete older backups or expand the drive if possible.\n\nFor now, your **server services and app data are safe**. The only thing to watch is Time Machine filling up.", + "_user": "The vault didn't eject again. How's disk space looking on all drives?" + }, + { + "turn": 6, + "run": 1, + "ctx_tokens_est": 3066, + "new_tokens_est": 249, + "ttft": 0.775, + "gen_time": 2.013, + "gen_tps": 85.4, + "total": 2.788, + "output_tokens": 172, + "tool": "service_logs", + "_response": "Yes, Paperless has successfully processed all three documents you scanned this morning. Here\u2019s what it did:\n\n1. **School Report (Emma):**\n * OCR Confidence: **97%**\n * Classified as: `School Report` with tags `education`, `emma`.\n\n2. **Swimming Certificate (Max):**\n * OCR Confidence: **94%**\n * Classified as: `Certificate` with tags `sports`, `max`.\n\n3. **Electricity Bill:**\n * OCR Confidence: **99%**\n * Classified as: `Invoice` with tags `utilities`, `electricity`.\n\nAll three were processed without errors. You can now search for them using the tags (e.g., \"emma\" or \"electricity\") in the Paperless interface.", + "_user": "Time Machine is at 75%. Also did Paperless process the school documents I scanned this morning?" + }, + { + "turn": 7, + "run": 1, + "ctx_tokens_est": 3327, + "new_tokens_est": 98, + "ttft": 0.474, + "gen_time": 4.452, + "gen_tps": 85.1, + "total": 4.926, + "output_tokens": 379, + "tool": "docker_exec", + "_response": "The Matrix (Synapse) database is currently **2.1 GB**. While that might sound large, it\u2019s actually quite normal for a home server managing multiple active rooms and user conversations.\n\nHere is what\u2019s taking up the space:\n* **`state_groups_state` (845 MB):** This tracks the current state of all rooms (who is in them, room topics, etc.). High usage here usually means you have many active rooms or a lot of members.\n* **`event_json` (412 MB):** This stores the actual content of messages and events. If you have busy chat rooms with lots of media or long discussions, this grows quickly.\n* **`events` & `event_edges` (485 MB combined):** These are the indexes that help Synapse find specific messages efficiently.\n\n**Is it chatty?**\nThe database size itself doesn\u2019t indicate if the server is \"chatty\" in terms of CPU load. However, Synapse can be resource-intensive if:\n1. There are many active users sending messages simultaneously.\n2. It\u2019s trying to sync a large number of rooms with new events after being offline or restarting.\n\n**Recommendation:**\n* **2.1 GB is safe.** It\u2019s not causing any disk space issues (your root drive has 2.4TB free).\n* **If you\u2019re seeing high CPU on `synapse`:** This is likely due to active syncing rather than database size.\n* **Maintenance:** Synapse has a built-in background job that purges old events if configured. Since your database is under 5GB, it\u2019s likely still in the \"growing phase\" and doesn\u2019t need aggressive cleanup yet.\n\nEverything looks healthy for Matrix. No immediate action needed unless you see performance degradation in the chat app itself.", + "_user": "Nice, it even picked up the electricity bill. How big is the Matrix database? It's been chatty lately." + }, + { + "turn": 8, + "run": 1, + "ctx_tokens_est": 3917, + "new_tokens_est": 188, + "ttft": 0.695, + "gen_time": 3.604, + "gen_tps": 84.1, + "total": 4.299, + "output_tokens": 303, + "tool": "docker_exec", + "_response": "Here is the breakdown of your Matrix rooms by activity. The space usage correlates directly with the number of events stored for each room.\n\n**Top Space Consumers:**\n1. **#server (4 members, 12,847 events):** This is your biggest room. Since it\u2019s only 4 people, it likely has a lot of technical logs, debug messages, or long discussions.\n2. **#family (5 members, 8,934 events):** The second largest. This is normal for a family chat with photos and daily updates.\n3. **#test-room (1 member, 4,521 events):** This is suspicious. A single-user room with nearly 5,000 events suggests automated testing or a bot that is spamming messages into it.\n\n**Other Rooms:**\n* `#butler` (3,421 events) and `#marvin-old` (2,103 events) are moderate.\n* `#alfred-bot`, `#documents` are small.\n\n**Recommendation:**\nSince you mentioned the server felt \"chatty,\" **`#test-room`** is a prime suspect. If it\u2019s not needed, you can leave the room to save space and reduce sync overhead. Similarly, if `#server` is just filled with verbose logs, you might want to check your logging configuration for the services posting there.\n\nWould you like me to help you archive or leave any of these rooms?", + "_user": "2.1GB for Matrix seems like a lot. Can we see which rooms take the most space?" + } + ] +} \ No newline at end of file diff --git a/results/qwen3.6-35b-a3b/ops-agent/m4-max-128gb-40gpu_lmstudio-mlx.md b/results/qwen3.6-35b-a3b/ops-agent/m4-max-128gb-40gpu_lmstudio-mlx.md new file mode 100644 index 0000000..016bed5 --- /dev/null +++ b/results/qwen3.6-35b-a3b/ops-agent/m4-max-128gb-40gpu_lmstudio-mlx.md @@ -0,0 +1,22 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen3.6-35b-a3b +**Backend:** lmstudio-mlx +**Scenario:** ops-agent (conversation) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 575 | 0.79s | 2.20s | 87.7 | **64.5** | 2.99s | 193 | +| 2 | 1,007 | 0.64s | 3.61s | 85.6 | **72.8** | 4.24s | 309 | +| 3 | 1,402 | 0.56s | 2.32s | 86.6 | **69.9** | 2.88s | 201 | +| 4 | 1,827 | 0.58s | 4.18s | 85.6 | **75.1** | 4.76s | 358 | +| 5 | 2,471 | 0.70s | 4.28s | 84.1 | **72.3** | 4.98s | 360 | +| 6 | 3,066 | 0.78s | 2.01s | 85.4 | **61.7** | 2.79s | 172 | +| 7 | 3,327 | 0.47s | 4.45s | 85.1 | **76.9** | 4.93s | 379 | +| 8 | 3,917 | 0.69s | 3.60s | 84.1 | **70.5** | 4.30s | 303 | + +**Total prefill:** 5.2s +**Total generation:** 26.7s +**Total time:** 31.9s +**Avg generation tok/s:** 85.5 +**Avg effective tok/s:** 71.4 diff --git a/results/qwen3.6-35b-a3b/prefill-test/m4-max-128gb-40gpu_lmstudio-mlx.json b/results/qwen3.6-35b-a3b/prefill-test/m4-max-128gb-40gpu_lmstudio-mlx.json new file mode 100644 index 0000000..d1b726f --- /dev/null +++ b/results/qwen3.6-35b-a3b/prefill-test/m4-max-128gb-40gpu_lmstudio-mlx.json @@ -0,0 +1,82 @@ +{ + "meta": { + "scenario": "prefill-test", + "mode": "single-shot", + "label": "m4-max-128gb-40gpu lmstudio-mlx", + "backend": "lmstudio-mlx", + "model_info": { + "name": "qwen3.6-35b-a3b", + "format": "mlx" + }, + "runs": 1, + "max_tokens": 150, + "cold": false, + "system": { + "os": "Darwin", + "os_version": "26.3", + "arch": "arm64", + "chip": "Apple M4 Max", + "memory_gb": 128, + "cpu_cores": 16, + "cpu_cores_performance": 12, + "cpu_cores_efficiency": 4, + "gpu_cores": 40, + "gpu_wired_limit_mb": 0 + }, + "timestamp": "2026-05-17T14:53:02" + }, + "results": [ + { + "turn": 1, + "run": 1, + "ctx_tokens_est": 655, + "new_tokens_est": 540, + "ttft": 0.757, + "gen_time": 1.204, + "gen_tps": 88.1, + "total": 1.961, + "output_tokens": 106, + "_response": "The Caddy error indicates another process is holding port 443; run `sudo lsof -i :443` to identify the culprit (often a leftover macOS service or another proxy) and stop it. Synapse is failing due to a race condition with its PostgreSQL container, not Caddy; restart the `synapse-postgres` container first using `docker restart synapse-postgres`, then restart Synapse with `docker restart synapse`. Once port 443 is free, start Caddy again.", + "_user": "After rebooting my Mac Studio, several Docker containers won't start properly. Here's what I see:\n\n```\n$ docker ps -a\nCONTAINER ID IMAGE STATUS NAMES\na1b2c3d4e5f6 caddy:2-custom Exited (1) 5 min ago caddy\nb2c3d4e5f6a1 adguard/adguardhome:latest Up 10 minutes adguard\nc3d4e5f6a1b2 ghcr.io/immich-app/immich-server:release Up 8 minutes immich-server\nd4e5f6a1b2c3 ghcr.io/immich-app/immich-machine-learning Up 8 minutes immich-ml\ne5f6a1b2c3d4 tensorchord/pgvecto-rs:pg14-v0.2.0 Up 10 minutes immich-postgres\nf6a1b2c3d4e5 redis:7-alpine Up 10 minutes immich-redis\na1b2c3d4e5f7 matrixdotorg/synapse:latest Restarting (1) 3 min ago synapse\nb2c3d4e5f6a2 postgres:16-alpine Up 10 minutes synapse-postgres\nc3d4e5f6a1b3 ghcr.io/paperless-ngx/paperless-ngx:latest Up 9 minutes paperless\nd4e5f6a1b2c4 ghcr.io/gethomepage/homepage:latest Up 10 minutes homepage\ne5f6a1b2c3d5 louislam/dockge:1 Up 10 minutes dockge\nf6a1b2c3d4e6 codeberg.org/forgejo/forgejo:10 Up 10 minutes forgejo\n```\n\nCaddy exited and Synapse keeps restarting. The Caddy logs show:\n\n```\n2026-03-07 08:00:01 Error: loading initial config: http app module: start: listening on :443: bind: address already in use\n```\n\nSynapse logs show:\n\n```\n2026-03-07 08:01:12 synapse.storage ERROR - Failed to connect to database: connection to server at \"synapse-postgres\" port 5432 failed: FATAL: the database system is starting up\n2026-03-07 08:02:15 synapse.storage ERROR - Failed to connect to database: connection to server at \"synapse-postgres\" port 5432 failed: FATAL: the database system is starting up\n```\n\nEverything else is up but I can't reach any service through HTTPS because Caddy is down. What's blocking port 443 and how do I fix this? Is the Synapse issue related?" + }, + { + "turn": 2, + "run": 1, + "ctx_tokens_est": 1453, + "new_tokens_est": 1338, + "ttft": 1.25, + "gen_time": 1.67, + "gen_tps": 85.0, + "total": 2.92, + "output_tokens": 142, + "_response": "The ML container\u2019s 12GB memory limit is too tight for your dataset, causing swapping or OOM kills that slow processing; increase it to 16GB and add `--shm-size=2g` to the server service for better inter-process communication. For the 502 errors on large uploads, increase Caddy\u2019s `read_buffer` and `request_body` limits in your Caddyfile to match Immich\u2019s default 100MB body size, or set `CADDY_BODY_SIZE` if using the official Caddy image. Your Postgres size is normal for 15k photos with face recognition, but consider archiving old `smart_search` vectors if performance degrades further.", + "_user": "Review this complete Docker Compose stack for our photo service and tell me if anything looks wrong, could cause issues, or should be improved:\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - IMMICH_MEDIA_LOCATION=/usr/src/app/upload\n - TZ=Europe/Berlin\n depends_on:\n immich-postgres:\n condition: service_healthy\n immich-redis:\n condition: service_started\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"curl -f http://localhost:2283/api/server/ping || exit 1\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 60s\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n environment:\n - MACHINE_LEARNING_CACHE_FOLDER=/cache\n - TRANSFORMERS_CACHE=/cache\n - TZ=Europe/Berlin\n deploy:\n resources:\n limits:\n memory: 12G\n reservations:\n memory: 4G\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"python3 -c 'import urllib.request; urllib.request.urlopen(\\\"http://localhost:3003/ping\\\")' || exit 1\"]\n interval: 60s\n timeout: 15s\n retries: 3\n start_period: 120s\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n - TZ=Europe/Berlin\n command:\n - postgres\n - -c\n - shared_preload_libraries=vectors.so\n - -c\n - search_path=\"$$user\",public,vectors\n - -c\n - logging_collector=on\n - -c\n - max_wal_size=2GB\n - -c\n - shared_buffers=512MB\n - -c\n - wal_compression=on\n networks:\n - home\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U postgres -d immich\"]\n interval: 10s\n timeout: 5s\n retries: 5\n start_period: 30s\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru\n networks:\n - home\n healthcheck:\n test: [\"CMD\", \"redis-cli\", \"ping\"]\n interval: 10s\n timeout: 5s\n retries: 3\n\nvolumes:\n immich-ml-cache:\n driver: local\n\nnetworks:\n home:\n external: true\n```\n\nAnd here is the current Caddy route for this service:\n\n```\n@photos host photos.home.example-home.net\nhandle @photos {\n reverse_proxy immich-server:2283\n}\n```\n\nThe service has been running for 3 months with ~15,000 photos. Recently I noticed:\n1. ML processing takes much longer than it used to (was finishing overnight, now takes 2+ days for a batch of 500 photos)\n2. The Postgres database has grown to 8.4 GB\n3. Memory usage spikes to 11.8 GB during ML processing (limit is 12G)\n4. Occasional 502 errors from Caddy when uploading large videos (>500MB)\n\nHere are the recent resource stats:\n\n```\n$ docker stats --no-stream\nCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O\na1b2c3d4e5f6 immich-server 2.1% 512MB / 64GB 0.8% 2.1GB / 156MB 45MB / 12MB\nb2c3d4e5f6a1 immich-ml 45.2% 11.8GB / 12GB 98.3% 890MB / 234MB 1.2GB / 89MB\nc3d4e5f6a1b2 immich-postgres 1.8% 1.1GB / 64GB 1.7% 234MB / 567MB 3.4GB / 1.8GB\nd4e5f6a1b2c3 immich-redis 0.1% 42MB / 256MB 16.4% 123MB / 98MB 1MB / 0B\n```\n\nAnd the Postgres table sizes:\n\n```\nSELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size\nFROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC LIMIT 15;\n\n schemaname | tablename | size\n-----------+------------------------------+---------\n public | smart_search | 3.2 GB\n public | asset_faces | 1.8 GB\n public | assets | 1.1 GB\n public | exif | 892 MB\n public | asset_job_status | 456 MB\n public | person | 234 MB\n public | albums_assets_assets | 189 MB\n public | activity | 123 MB\n public | move_history | 98 MB\n public | geodata_places | 87 MB\n public | system_metadata | 45 MB\n public | albums | 23 MB\n public | users | 1.2 MB\n public | api_keys | 48 kB\n public | system_config | 16 kB\n```" + }, + { + "turn": 3, + "run": 1, + "ctx_tokens_est": 3015, + "new_tokens_est": 2900, + "ttft": 2.538, + "gen_time": 1.435, + "gen_tps": 86.4, + "total": 3.973, + "output_tokens": 124, + "_response": "No changes are required for the Docker Compose files or Caddyfile, as the M4 Ultra maintains full compatibility with your current ARM64 architecture and container setup.\n\nYou can expect significantly faster AI inference from Ollama due to the M4 Ultra\u2019s 120GB unified memory, allowing larger models like `qwen3.5:35b-a3b` to run entirely in VRAM without swapping, and faster Immich ML processing.\n\nSimply migrate your data volumes (`/Users/alex/server/data`) to the new Mac Studio and restart OrbStack; no configuration adjustments are needed.", + "_user": "I need help planning a migration. Here's my current complete server configuration. Review it and suggest what needs to change if I move from Mac Studio M1 Max to Mac Studio M4 Ultra:\n\n## Current Caddyfile\n\n```\n{\n acme_dns hetzner {\n api_token {env.HETZNER_API_TOKEN}\n }\n}\n\n*.home.example-home.net {\n tls {\n dns hetzner {env.HETZNER_API_TOKEN}\n propagation_delay 30s\n propagation_timeout 5m\n }\n\n @status host status.home.example-home.net\n handle @status {\n reverse_proxy homepage:3000\n }\n\n @dns host dns.home.example-home.net\n handle @dns {\n reverse_proxy adguard:80\n }\n\n @photos host photos.home.example-home.net\n handle @photos {\n reverse_proxy immich-server:2283 {\n header_up X-Real-IP {remote_host}\n transport http {\n read_timeout 600s\n }\n }\n }\n\n @chat host chat.home.example-home.net\n handle @chat {\n reverse_proxy open-webui:8080\n }\n\n @messages host messages.home.example-home.net\n handle @messages {\n handle /.well-known/matrix/client {\n header Content-Type application/json\n respond `{\"m.homeserver\":{\"base_url\":\"https://messages.home.example-home.net\"}}`\n }\n handle /.well-known/matrix/server {\n header Content-Type application/json\n respond `{\"m.server\":\"messages.home.example-home.net:443\"}`\n }\n handle /_matrix/* {\n reverse_proxy synapse:8008\n }\n handle {\n reverse_proxy element-web:80\n }\n }\n\n @docs host docs.home.example-home.net\n handle @docs {\n reverse_proxy paperless:8000\n }\n\n @manage host manage.home.example-home.net\n handle @manage {\n reverse_proxy dockge:5001\n }\n\n @code host code.home.example-home.net\n handle @code {\n reverse_proxy forgejo:3000\n }\n\n handle {\n respond \"Not found\" 404\n }\n}\n```\n\n## Docker Compose: Infrastructure\n\n```yaml\nversion: \"3.8\"\n\nservices:\n caddy:\n image: caddy:2-custom\n build:\n context: .\n dockerfile: Dockerfile\n container_name: caddy\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile\n - caddy-data:/data\n - caddy-config:/config\n networks:\n - home\n environment:\n - HETZNER_API_TOKEN=${HETZNER_API_TOKEN}\n\n adguard:\n image: adguard/adguardhome:latest\n container_name: adguard\n restart: unless-stopped\n ports:\n - \"53:53/tcp\"\n - \"53:53/udp\"\n - \"8080:80\"\n volumes:\n - adguard-work:/opt/adguardhome/work\n - adguard-conf:/opt/adguardhome/conf\n networks:\n - home\n\n homepage:\n image: ghcr.io/gethomepage/homepage:latest\n container_name: homepage\n restart: unless-stopped\n ports:\n - \"3001:3000\"\n volumes:\n - ./homepage-config:/app/config\n networks:\n - home\n\n dockge:\n image: louislam/dockge:1\n container_name: dockge\n restart: unless-stopped\n ports:\n - \"5001:5001\"\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - dockge-data:/app/data\n - /Users/alex/server/family-server/stacks:/opt/stacks\n environment:\n - DOCKGE_STACKS_DIR=/opt/stacks\n networks:\n - home\n\nvolumes:\n caddy-data:\n caddy-config:\n adguard-work:\n adguard-conf:\n dockge-data:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Photos (Immich)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - TZ=Europe/Berlin\n depends_on:\n - immich-postgres\n - immich-redis\n networks:\n - home\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n deploy:\n resources:\n limits:\n memory: 12G\n networks:\n - home\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n networks:\n - home\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n networks:\n - home\n\nvolumes:\n immich-ml-cache:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Messages (Matrix)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n synapse:\n image: matrixdotorg/synapse:latest\n container_name: synapse\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/synapse-data:/data\n environment:\n - SYNAPSE_CONFIG_DIR=/data\n depends_on:\n - synapse-postgres\n networks:\n - home\n\n synapse-postgres:\n image: postgres:16-alpine\n container_name: synapse-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/postgres:/var/lib/postgresql/data\n environment:\n - POSTGRES_USER=synapse\n - POSTGRES_PASSWORD=${SYNAPSE_DB_PASSWORD}\n - POSTGRES_DB=synapse\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n networks:\n - home\n\n element-web:\n image: vectorim/element-web:latest\n container_name: element-web\n restart: unless-stopped\n volumes:\n - ./element-config.json:/app/config.json:ro\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Documents (Paperless-ngx)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n paperless:\n image: ghcr.io/paperless-ngx/paperless-ngx:latest\n container_name: paperless\n restart: unless-stopped\n ports:\n - \"8000:8000\"\n volumes:\n - /Users/alex/server/data/documents/data:/usr/src/paperless/data\n - /Users/alex/server/data/documents/media:/usr/src/paperless/media\n - /Users/alex/server/data/documents/consume:/usr/src/paperless/consume\n environment:\n - PAPERLESS_DBENGINE=sqlite\n - PAPERLESS_OCR_LANGUAGE=deu+eng\n - PAPERLESS_URL=https://docs.home.example-home.net\n - PAPERLESS_TIME_ZONE=Europe/Berlin\n - PAPERLESS_OCR_MODE=skip\n - PAPERLESS_TASK_WORKERS=2\n - PAPERLESS_CONSUMER_POLLING=30\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Git (Forgejo)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n forgejo:\n image: codeberg.org/forgejo/forgejo:10\n container_name: forgejo\n restart: unless-stopped\n ports:\n - \"3000:3000\"\n - \"222:22\"\n volumes:\n - /Users/alex/server/data/code-repo:/data\n environment:\n - USER_UID=1000\n - USER_GID=1000\n - FORGEJO__server__ROOT_URL=https://code.home.example-home.net\n - FORGEJO__server__SSH_PORT=222\n - FORGEJO__database__DB_TYPE=sqlite3\n - FORGEJO__service__DISABLE_REGISTRATION=true\n - FORGEJO__repository__DEFAULT_PRIVATE=true\n - FORGEJO__mirror__DEFAULT_INTERVAL=8h\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: AI Bots\n\n```yaml\nversion: \"3.8\"\n\nservices:\n butler:\n image: openclaw-matrix:latest\n build:\n context: ../openclaw\n container_name: butler\n restart: unless-stopped\n volumes:\n - ./config:/root/.openclaw\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@assistant:example-home.net\n - MATRIX_PASSWORD=${BUTLER_MATRIX_PASSWORD}\n networks:\n - home\n\n alfred:\n image: openclaw-matrix:latest\n container_name: alfred\n restart: unless-stopped\n volumes:\n - ./alfred-config:/root/.openclaw\n environment:\n - OPENROUTER_API_KEY=${OPENROUTER_API_KEY}\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@alfred:example-home.net\n - MATRIX_PASSWORD=${ALFRED_MATRIX_PASSWORD}\n networks:\n - home\n - personal-agent\n\n kit:\n image: kit-assistant:latest\n build:\n context: ../assistant\n container_name: kit\n restart: unless-stopped\n volumes:\n - ./kit-workspace:/workspace\n - /var/run/docker.sock:/var/run/docker.sock:ro\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - OLLAMA_MODEL=qwen3-coder:30b\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@kit-bot:example-home.net\n - MATRIX_PASSWORD=${KIT_MATRIX_PASSWORD}\n - FK_HOMEPAGE_URL=http://homepage:3000\n - FK_PAPERLESS_URL=http://paperless:8000\n - FK_OLLAMA_URL=http://host.docker.internal:11434\n networks:\n - home\n\nnetworks:\n home:\n external: true\n personal-agent:\n external: true\n```\n\n## Current Resource Usage\n\n```\n$ docker stats --no-stream\nCONTAINER CPU % MEM USAGE / LIMIT NET I/O BLOCK I/O\ncaddy 0.1% 42MB / 64GB 12GB / 8.4GB 45MB / 12MB\nadguard 0.3% 128MB / 64GB 890MB / 234MB 123MB / 67MB\nimmich-server 2.1% 512MB / 64GB 2.1GB / 156MB 45MB / 12MB\nimmich-ml 0.2% 2.1GB / 12GB 890MB / 234MB 1.2GB / 89MB\nimmich-pg 1.8% 1.1GB / 64GB 234MB / 567MB 3.4GB / 1.8GB\nimmich-redis 0.1% 42MB / 64GB 123MB / 98MB 1MB / 0B\nsynapse 0.4% 380MB / 64GB 456MB / 234MB 890MB / 345MB\nsynapse-pg 0.2% 256MB / 64GB 234MB / 123MB 1.2GB / 678MB\nelement-web 0.0% 12MB / 64GB 45MB / 89MB 1MB / 0B\npaperless 0.2% 620MB / 64GB 123MB / 67MB 2.3GB / 1.1GB\nhomepage 0.0% 38MB / 64GB 23MB / 12MB 5MB / 1MB\ndockge 0.1% 52MB / 64GB 12MB / 8MB 3MB / 1MB\nforgejo 0.1% 95MB / 64GB 45MB / 23MB 234MB / 67MB\nbutler 0.1% 180MB / 64GB 23MB / 12MB 12MB / 3MB\nalfred 0.1% 180MB / 64GB 34MB / 18MB 15MB / 4MB\nkit 0.3% 210MB / 64GB 67MB / 34MB 23MB / 8MB\n```\n\n## Disk Usage\n\n```\n$ df -h\nFilesystem Size Used Avail Use% Mounted on\n/dev/disk1s1 3.6T 1.2T 2.4T 33% /\n/dev/disk5s1 5.5T 3.8T 1.7T 69% /Volumes/backup-vault\n/dev/disk4s1 5.5T 4.1T 1.4T 75% /Volumes/time-machine\n\n$ du -sh ~/server/data/*\n634G /Users/alex/server/data/photos\n12G /Users/alex/server/data/documents\n2.1G /Users/alex/server/data/messages\n890M /Users/alex/server/data/code-repo\n```\n\n## Ollama Configuration\n\n```\n$ ollama list\nNAME SIZE MODIFIED\nllama3.1:8b 4.7 GB 2 days ago\nqwen2.5:32b 19 GB 5 days ago\nqwen3-coder:30b 17 GB 1 day ago\nqwen3.5:35b-a3b 21 GB 3 hours ago\n\n$ cat ~/Library/LaunchAgents/com.ollama.plist | grep -A1 OLLAMA\nOLLAMA_HOST\n0.0.0.0\nOLLAMA_KEEP_ALIVE\n5m\n```\n\nWhat needs to change for the M4 Ultra migration? What can I keep as-is? Any performance improvements I should expect?" + }, + { + "turn": 4, + "run": 1, + "ctx_tokens_est": 8496, + "new_tokens_est": 8381, + "ttft": 10.825, + "gen_time": 1.319, + "gen_tps": 82.6, + "total": 12.144, + "output_tokens": 109, + "_response": "Security: The `dockge` service exposes the Docker socket and has no reverse proxy protection, creating a critical remote code execution risk; restrict it to localhost or add auth.\nPerformance: Immich ML hits 98% GPU memory, causing GC pauses; reduce concurrent job limits in `immich-server` or lower the ML container memory limit to force earlier idle state.\nOptimization: Paperless uses SQLite which may bottleneck under heavy load; consider migrating to PostgreSQL for better concurrency and backup integrity, especially given the existing Postgres infrastructure.", + "_user": "Here is our complete server configuration and 24-hour log bundle. Audit everything for issues, security concerns, and optimization opportunities:\n\n## Caddyfile\n\n```\n{\n acme_dns hetzner {\n api_token {env.HETZNER_API_TOKEN}\n }\n}\n\n*.home.example-home.net {\n tls {\n dns hetzner {env.HETZNER_API_TOKEN}\n propagation_delay 30s\n propagation_timeout 5m\n }\n\n @status host status.home.example-home.net\n handle @status {\n reverse_proxy homepage:3000\n }\n\n @dns host dns.home.example-home.net\n handle @dns {\n reverse_proxy adguard:80\n }\n\n @photos host photos.home.example-home.net\n handle @photos {\n reverse_proxy immich-server:2283 {\n header_up X-Real-IP {remote_host}\n transport http {\n read_timeout 600s\n }\n }\n }\n\n @chat host chat.home.example-home.net\n handle @chat {\n reverse_proxy open-webui:8080\n }\n\n @messages host messages.home.example-home.net\n handle @messages {\n handle /.well-known/matrix/client {\n header Content-Type application/json\n respond `{\"m.homeserver\":{\"base_url\":\"https://messages.home.example-home.net\"}}`\n }\n handle /.well-known/matrix/server {\n header Content-Type application/json\n respond `{\"m.server\":\"messages.home.example-home.net:443\"}`\n }\n handle /_matrix/* {\n reverse_proxy synapse:8008\n }\n handle {\n reverse_proxy element-web:80\n }\n }\n\n @docs host docs.home.example-home.net\n handle @docs {\n reverse_proxy paperless:8000\n }\n\n @manage host manage.home.example-home.net\n handle @manage {\n reverse_proxy dockge:5001\n }\n\n @code host code.home.example-home.net\n handle @code {\n reverse_proxy forgejo:3000\n }\n\n handle {\n respond \"Not found\" 404\n }\n}\n```\n\n## Docker Compose: Infrastructure\n\n```yaml\nversion: \"3.8\"\n\nservices:\n caddy:\n image: caddy:2-custom\n build:\n context: .\n dockerfile: Dockerfile\n container_name: caddy\n restart: unless-stopped\n ports:\n - \"80:80\"\n - \"443:443\"\n volumes:\n - ./Caddyfile:/etc/caddy/Caddyfile\n - caddy-data:/data\n - caddy-config:/config\n networks:\n - home\n environment:\n - HETZNER_API_TOKEN=${HETZNER_API_TOKEN}\n\n adguard:\n image: adguard/adguardhome:latest\n container_name: adguard\n restart: unless-stopped\n ports:\n - \"53:53/tcp\"\n - \"53:53/udp\"\n - \"8080:80\"\n volumes:\n - adguard-work:/opt/adguardhome/work\n - adguard-conf:/opt/adguardhome/conf\n networks:\n - home\n\n homepage:\n image: ghcr.io/gethomepage/homepage:latest\n container_name: homepage\n restart: unless-stopped\n ports:\n - \"3001:3000\"\n volumes:\n - ./homepage-config:/app/config\n networks:\n - home\n env_file:\n - .env\n\n dockge:\n image: louislam/dockge:1\n container_name: dockge\n restart: unless-stopped\n ports:\n - \"5001:5001\"\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - dockge-data:/app/data\n - /Users/alex/server/family-server/stacks:/opt/stacks\n environment:\n - DOCKGE_STACKS_DIR=/opt/stacks\n networks:\n - home\n\nvolumes:\n caddy-data:\n caddy-config:\n adguard-work:\n adguard-conf:\n dockge-data:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Photos (Immich)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n immich-server:\n image: ghcr.io/immich-app/immich-server:release\n container_name: immich-server\n restart: unless-stopped\n ports:\n - \"2283:2283\"\n volumes:\n - /Users/alex/server/data/photos/upload:/usr/src/app/upload\n - /Users/alex/server/data/photos/external:/usr/src/app/external:ro\n environment:\n - DB_HOSTNAME=immich-postgres\n - DB_USERNAME=postgres\n - DB_PASSWORD=${IMMICH_DB_PASSWORD}\n - DB_DATABASE_NAME=immich\n - REDIS_HOSTNAME=immich-redis\n - TZ=Europe/Berlin\n depends_on:\n - immich-postgres\n - immich-redis\n networks:\n - home\n\n immich-ml:\n image: ghcr.io/immich-app/immich-machine-learning:release\n container_name: immich-ml\n restart: unless-stopped\n volumes:\n - immich-ml-cache:/cache\n deploy:\n resources:\n limits:\n memory: 12G\n networks:\n - home\n\n immich-postgres:\n image: tensorchord/pgvecto-rs:pg14-v0.2.0\n container_name: immich-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/photos/db:/var/lib/postgresql/data\n environment:\n - POSTGRES_PASSWORD=${IMMICH_DB_PASSWORD}\n - POSTGRES_USER=postgres\n - POSTGRES_DB=immich\n networks:\n - home\n\n immich-redis:\n image: redis:7-alpine\n container_name: immich-redis\n restart: unless-stopped\n networks:\n - home\n\nvolumes:\n immich-ml-cache:\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Messages (Matrix)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n synapse:\n image: matrixdotorg/synapse:latest\n container_name: synapse\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/synapse-data:/data\n environment:\n - SYNAPSE_CONFIG_DIR=/data\n depends_on:\n - synapse-postgres\n networks:\n - home\n\n synapse-postgres:\n image: postgres:16-alpine\n container_name: synapse-postgres\n restart: unless-stopped\n volumes:\n - /Users/alex/server/data/messages/postgres:/var/lib/postgresql/data\n environment:\n - POSTGRES_USER=synapse\n - POSTGRES_PASSWORD=${SYNAPSE_DB_PASSWORD}\n - POSTGRES_DB=synapse\n - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C\n networks:\n - home\n\n element-web:\n image: vectorim/element-web:latest\n container_name: element-web\n restart: unless-stopped\n volumes:\n - ./element-config.json:/app/config.json:ro\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Documents (Paperless-ngx)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n paperless:\n image: ghcr.io/paperless-ngx/paperless-ngx:latest\n container_name: paperless\n restart: unless-stopped\n ports:\n - \"8000:8000\"\n volumes:\n - /Users/alex/server/data/documents/data:/usr/src/paperless/data\n - /Users/alex/server/data/documents/media:/usr/src/paperless/media\n - /Users/alex/server/data/documents/consume:/usr/src/paperless/consume\n environment:\n - PAPERLESS_DBENGINE=sqlite\n - PAPERLESS_OCR_LANGUAGE=deu+eng\n - PAPERLESS_URL=https://docs.home.example-home.net\n - PAPERLESS_TIME_ZONE=Europe/Berlin\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: Git (Forgejo)\n\n```yaml\nversion: \"3.8\"\n\nservices:\n forgejo:\n image: codeberg.org/forgejo/forgejo:10\n container_name: forgejo\n restart: unless-stopped\n ports:\n - \"3000:3000\"\n - \"222:22\"\n volumes:\n - /Users/alex/server/data/code-repo:/data\n environment:\n - USER_UID=1000\n - USER_GID=1000\n - FORGEJO__server__ROOT_URL=https://code.home.example-home.net\n - FORGEJO__server__SSH_PORT=222\n - FORGEJO__database__DB_TYPE=sqlite3\n networks:\n - home\n\nnetworks:\n home:\n external: true\n```\n\n## Docker Compose: AI Bots\n\n```yaml\nversion: \"3.8\"\n\nservices:\n butler:\n image: openclaw-matrix:latest\n build:\n context: ../openclaw\n container_name: butler\n restart: unless-stopped\n volumes:\n - ./config:/root/.openclaw\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@assistant:example-home.net\n - MATRIX_PASSWORD=${BUTLER_MATRIX_PASSWORD}\n networks:\n - home\n\n alfred:\n image: openclaw-matrix:latest\n container_name: alfred\n restart: unless-stopped\n volumes:\n - ./alfred-config:/root/.openclaw\n environment:\n - OPENROUTER_API_KEY=${OPENROUTER_API_KEY}\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@alfred:example-home.net\n - MATRIX_PASSWORD=${ALFRED_MATRIX_PASSWORD}\n networks:\n - home\n - personal-agent\n\n kit:\n image: kit-assistant:latest\n build:\n context: ../assistant\n container_name: kit\n restart: unless-stopped\n volumes:\n - ./kit-workspace:/workspace\n - /var/run/docker.sock:/var/run/docker.sock:ro\n environment:\n - OLLAMA_BASE_URL=http://host.docker.internal:11434\n - OLLAMA_MODEL=qwen3-coder:30b\n - MATRIX_HOMESERVER=https://messages.home.example-home.net\n - MATRIX_USER=@kit-bot:example-home.net\n - MATRIX_PASSWORD=${KIT_MATRIX_PASSWORD}\n - FK_HOMEPAGE_URL=http://homepage:3000\n - FK_PAPERLESS_URL=http://paperless:8000\n - FK_OLLAMA_URL=http://host.docker.internal:11434\n networks:\n - home\n\nnetworks:\n home:\n external: true\n personal-agent:\n external: true\n```\n\n## Backup Configuration (vault-sync.sh excerpt)\n\n```bash\n#!/bin/bash\nset -euo pipefail\n\nVAULT_NAME=\"backup-vault\"\nDATA_DIR=\"$HOME/server/data\"\nSNAPSHOT_DIR=\"/Volumes/$VAULT_NAME/snapshots/$(date +%Y-%m-%d)\"\nLOG_FILE=\"$DATA_DIR/logs/vault-sync.log\"\n\n# Unlock vault drive from keychain\nPASS=$(security find-generic-password -s \"$VAULT_NAME\" -w 2>/dev/null)\necho \"$PASS\" | diskutil apfs unlockVolume \"$VAULT_NAME\" -stdinpassphrase\n\n# Rsync with delete (mirror)\nrsync -av --delete \\\n --exclude '.DS_Store' \\\n --exclude '*.tmp' \\\n --exclude 'immich-ml-cache/' \\\n \"$DATA_DIR/\" \"$SNAPSHOT_DIR/\"\n\n# Apply WORM protection\nchflags -R uchg \"$SNAPSHOT_DIR/\"\n\n# Try to eject (non-fatal if it fails)\ndiskutil eject \"$VAULT_NAME\" 2>/dev/null || true\n```\n\n## Ollama Configuration\n\n```\n$ ollama list\nNAME SIZE MODIFIED\nllama3.1:8b 4.7 GB 2 days ago\nqwen2.5:32b 19 GB 5 days ago\nqwen3-coder:30b 17 GB 1 day ago\nqwen3.5:35b-a3b 21 GB 3 hours ago\n\n$ ollama ps\nNAME SIZE PROCESSOR UNTIL\nqwen3.5:35b-a3b 21 GB 100% GPU 4 minutes from now\n```\n\n## Server Logs: Last 24 Hours\n\n```\n=== 2026-03-06 22:00 - EVENING STATUS ===\n\n2026-03-06 22:00:00 [docker] INFO: Container health check summary:\n2026-03-06 22:00:00 [docker] caddy: healthy (uptime: 3d 15h)\n2026-03-06 22:00:00 [docker] adguard: healthy (uptime: 3d 15h)\n2026-03-06 22:00:00 [docker] immich-server: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] immich-ml: healthy (uptime: 3d 15h) [idle]\n2026-03-06 22:00:01 [docker] immich-postgres: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] immich-redis: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] synapse: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] synapse-postgres: healthy (uptime: 3d 15h)\n2026-03-06 22:00:01 [docker] element-web: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] paperless: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] homepage: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] dockge: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] forgejo: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] butler: healthy (uptime: 3d 15h)\n2026-03-06 22:00:02 [docker] alfred: healthy (uptime: 3d 15h)\n2026-03-06 22:00:03 [docker] kit: healthy (uptime: 23h)\n2026-03-06 22:00:03 [docker] server-bot: healthy (uptime: 3d 15h)\n2026-03-06 22:00:03 [docker] INFO: 17/17 containers healthy. Memory: 38.4GB / 64GB\n\n2026-03-06 22:00:05 [adguard] INFO: Daily DNS statistics:\n2026-03-06 22:00:05 [adguard] INFO: Total queries today: 134,521\n2026-03-06 22:00:05 [adguard] INFO: Blocked: 36,847 (27.4%)\n2026-03-06 22:00:05 [adguard] INFO: Average response time: 13ms\n2026-03-06 22:00:06 [adguard] INFO: Top blocked domains:\n2026-03-06 22:00:06 [adguard] INFO: 1. telemetry.microsoft.com (7,842 queries)\n2026-03-06 22:00:06 [adguard] INFO: 2. ads.google.com (3,921 queries)\n2026-03-06 22:00:06 [adguard] INFO: 3. graph.facebook.com (3,456 queries)\n2026-03-06 22:00:06 [adguard] INFO: 4. app-measurement.com (2,847 queries)\n2026-03-06 22:00:06 [adguard] INFO: 5. analytics.google.com (2,134 queries)\n2026-03-06 22:00:07 [adguard] INFO: Unique clients: 8\n2026-03-06 22:00:07 [adguard] INFO: Client breakdown:\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.46 (mac-alex): 42,847 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.101 (iphone-alex): 31,234 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.102 (ipad-kids): 24,567 queries\n2026-03-06 22:00:07 [adguard] INFO: 192.168.188.105 (macbook-alex): 18,934 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.110 (smart-tv): 8,234 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.111 (echo-kitchen): 5,123 queries\n2026-03-06 22:00:08 [adguard] INFO: 192.168.188.112 (echo-living): 3,456 queries\n2026-03-06 22:00:08 [adguard] WARNING: Client 192.168.188.103 (laptop-guest) bypassed AdGuard for 24h\n2026-03-06 22:00:08 [adguard] WARNING: 1,847 direct queries to external DNS detected\n2026-03-06 22:00:08 [adguard] INFO: Upstream DNS performance:\n2026-03-06 22:00:09 [adguard] INFO: 1.1.1.1 (Cloudflare): avg 11ms, p99 45ms\n2026-03-06 22:00:09 [adguard] INFO: 8.8.8.8 (Google): avg 16ms, p99 67ms\n\n2026-03-06 22:15:00 [synapse] INFO: POST /_matrix/client/v3/rooms/!fam123:example-home.net/send/m.room.message - 200 OK (8ms)\n2026-03-06 22:15:01 [synapse] INFO: PUT /_matrix/client/v3/rooms/!fam123:example-home.net/read_markers - 200 OK (3ms)\n2026-03-06 22:30:00 [synapse] INFO: Background job: purge_old_device_messages completed (12ms)\n2026-03-06 23:00:00 [synapse] INFO: Background job: purge_expired_account_data completed (45ms)\n\n=== 2026-03-07 00:00 - MIDNIGHT ===\n\n2026-03-07 00:00:00 [adguard] INFO: DNS filter list update check\n2026-03-07 00:00:02 [adguard] INFO: AdGuard DNS filter: 48,234 rules (no update)\n2026-03-07 00:00:02 [adguard] INFO: OISD Full: 312,847 rules (updated, +234 rules)\n2026-03-07 00:00:03 [adguard] INFO: Steven Black hosts: 89,234 rules (no update)\n2026-03-07 00:00:03 [adguard] INFO: Total active rules: 450,315\n\n2026-03-07 00:30:00 [forgejo] INFO: Repository statistics update\n2026-03-07 00:30:01 [forgejo] INFO: Repositories: 8 (5 active, 2 mirrors, 1 archived)\n2026-03-07 00:30:01 [forgejo] INFO: Total git objects: 12,847\n2026-03-07 00:30:01 [forgejo] INFO: Total LFS objects: 0\n2026-03-07 00:30:02 [forgejo] INFO: Database size: 23MB\n\n=== 2026-03-07 02:00 - BACKUP JOB ===\n\n2026-03-07 01:55:00 [cron] Starting vault-sync backup job\n2026-03-07 01:55:01 [vault-sync] INFO: Checking vault drive status...\n2026-03-07 01:55:01 [vault-sync] INFO: Volume 'backup-vault' not mounted, attempting unlock\n2026-03-07 01:55:02 [vault-sync] INFO: Retrieving passphrase from login keychain\n2026-03-07 01:55:02 [vault-sync] INFO: Running: diskutil apfs unlockVolume backup-vault -stdinpassphrase\n2026-03-07 01:55:08 [vault-sync] INFO: Volume backup-vault mounted at /Volumes/backup-vault\n2026-03-07 01:55:08 [vault-sync] INFO: Previous snapshot found: 2026-03-06 (823.4 GB)\n2026-03-07 01:55:08 [vault-sync] INFO: Starting rsync: /Users/alex/server/data/ -> /Volumes/backup-vault/snapshots/2026-03-07/\n2026-03-07 01:55:08 [rsync] building file list... done\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4501.jpg (4.2MB)\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4502.jpg (3.8MB)\n2026-03-07 01:55:09 [rsync] photos/upload/library/2026/03/06/IMG_4503.jpg (5.1MB)\n2026-03-07 01:55:10 [rsync] photos/upload/library/2026/03/06/IMG_4504.jpg (4.7MB)\n2026-03-07 01:55:10 [rsync] photos/upload/library/2026/03/06/IMG_4505.jpg (3.9MB)\n2026-03-07 01:55:11 [rsync] photos/upload/library/2026/03/06/IMG_4506.jpg (4.4MB)\n2026-03-07 01:55:11 [rsync] photos/upload/library/2026/03/06/IMG_4507.heic (2.1MB)\n2026-03-07 01:55:12 [rsync] photos/upload/library/2026/03/06/IMG_4508.heic (2.3MB)\n2026-03-07 01:55:12 [rsync] photos/upload/library/2026/03/06/IMG_4509.heic (1.9MB)\n2026-03-07 01:55:13 [rsync] photos/upload/library/2026/03/06/IMG_4510.heic (2.5MB)\n2026-03-07 01:55:13 [rsync] photos/upload/library/2026/03/06/IMG_4511.mov (234MB)\n2026-03-07 01:55:18 [rsync] photos/upload/library/2026/03/06/IMG_4512.mov (189MB)\n2026-03-07 01:55:24 [rsync] photos/upload/library/2026/03/06/IMG_4513.mov (312MB)\n2026-03-07 01:55:30 [rsync] photos/upload/library/2026/03/06/IMG_4514.jpg (4.8MB)\n2026-03-07 01:55:30 [rsync] photos/upload/library/2026/03/06/IMG_4515.jpg (3.6MB)\n2026-03-07 01:55:31 [rsync] photos/upload/library/2026/03/06/IMG_4516.jpg (5.2MB)\n2026-03-07 01:55:31 [rsync] photos/upload/library/2026/03/06/IMG_4517.jpg (4.1MB)\n2026-03-07 01:55:32 [rsync] photos/upload/library/2026/03/06/IMG_4518.jpg (3.7MB)\n2026-03-07 01:55:32 [rsync] photos/upload/library/2026/03/06/IMG_4519.jpg (4.9MB)\n2026-03-07 01:55:33 [rsync] photos/upload/library/2026/03/06/IMG_4520.jpg (3.4MB)\n2026-03-07 01:55:33 [rsync] photos/upload/library/2026/03/06/IMG_4521.jpg (4.6MB)\n2026-03-07 01:55:34 [rsync] photos/upload/thumbs/2026/03/06/ (42 files, 8.4MB total)\n2026-03-07 01:55:36 [rsync] photos/upload/encoded-video/2026/03/06/ (3 files, 67MB total)\n2026-03-07 01:55:40 [rsync] photos/db/base/16384/ (delta sync, 12MB)\n2026-03-07 01:55:41 [rsync] documents/data/index/whoosh/ (12 files, 45MB)\n2026-03-07 01:55:41 [rsync] documents/media/documents/originals/2026/03/ (3 files, 2.1MB)\n2026-03-07 01:55:41 [rsync] documents/media/documents/thumbnails/2026/03/ (3 files, 890KB)\n2026-03-07 01:55:42 [rsync] documents/data/db.sqlite3 (234MB)\n2026-03-07 01:55:43 [rsync] messages/synapse-data/media_store/local_content/ (8 files, 12MB)\n2026-03-07 01:55:43 [rsync] messages/synapse-data/media_store/local_thumbnails/ (8 files, 1.2MB)\n2026-03-07 01:55:44 [rsync] messages/postgres/base/16384/ (14 files, delta)\n2026-03-07 01:55:44 [rsync] messages/postgres/pg_wal/000000010000000000000047 (16MB)\n2026-03-07 01:55:44 [rsync] messages/postgres/pg_wal/000000010000000000000048 (16MB)\n2026-03-07 01:55:45 [rsync] code-repo/data/gitea-repositories/alex/ (4 repos, delta)\n2026-03-07 01:55:45 [rsync] code-repo/data/gitea.db (23MB)\n2026-03-07 01:55:46 [rsync] logs/ (2 files, 1.2MB)\n2026-03-07 01:55:46 [rsync] sent 12,438,291,456 bytes received 48,721 bytes 24,876,580,354.00 bytes/sec\n2026-03-07 01:55:46 [rsync] total size is 892,341,567,488 speedup is 71.74\n2026-03-07 01:55:46 [vault-sync] INFO: rsync completed: 1,847 files, 12.4 GB transferred\n2026-03-07 01:55:47 [vault-sync] INFO: Applying uchg flags to snapshot...\n2026-03-07 01:55:48 [vault-sync] INFO: chflags -R uchg /Volumes/backup-vault/snapshots/2026-03-07/\n2026-03-07 01:56:12 [vault-sync] INFO: uchg flags applied to 23,847 items (24.2s)\n2026-03-07 01:56:12 [vault-sync] INFO: Attempting vault eject...\n2026-03-07 01:56:13 [vault-sync] ERROR: diskutil eject failed: 'Dissent error 49153'\n2026-03-07 01:56:13 [vault-sync] WARNING: Vault eject failed (non-fatal). Drive remains mounted but protected by uchg.\n2026-03-07 01:56:14 [vault-sync] INFO: Sending notification...\n2026-03-07 01:56:14 [vault-sync] INFO: macOS notification sent: \"Backup completed with warnings\"\n2026-03-07 01:56:14 [vault-sync] INFO: Backup completed with warnings. Duration: 1m 14s\n2026-03-07 02:00:00 [cron] Next vault-sync scheduled: 2026-03-08 02:00:00\n\n=== 2026-03-07 03:00 - TIME MACHINE ===\n\n2026-03-07 03:00:01 [timemachine] INFO: Starting automatic backup\n2026-03-07 03:00:02 [timemachine] INFO: Destination: time-machine (APFS, /Volumes/time-machine)\n2026-03-07 03:00:03 [timemachine] INFO: Preparing backup...\n2026-03-07 03:00:15 [timemachine] INFO: Calculating changes since 2026-03-06 03:00:00\n2026-03-07 03:00:45 [timemachine] INFO: 4,521 items changed (12.8 GB)\n2026-03-07 03:01:00 [timemachine] INFO: Copying files...\n2026-03-07 03:08:42 [timemachine] INFO: Creating snapshot...\n2026-03-07 03:08:55 [timemachine] INFO: Verifying backup integrity...\n2026-03-07 03:09:12 [timemachine] INFO: Backup completed successfully\n2026-03-07 03:09:12 [timemachine] INFO: Duration: 9m 11s\n2026-03-07 03:09:12 [timemachine] INFO: Total backups on disk: 51 (oldest: 2026-01-15)\n2026-03-07 03:09:13 [timemachine] INFO: Disk usage: 4.1TB / 5.5TB (75%)\n2026-03-07 03:09:13 [timemachine] WARNING: Time Machine disk above 70% - oldest backups will be pruned automatically\n\n=== 2026-03-07 06:00 - MORNING ===\n\n2026-03-07 06:00:00 [docker] INFO: Container health check summary:\n2026-03-07 06:00:00 [docker] All 17 containers healthy. Memory: 36.2GB / 64GB\n\n2026-03-07 06:00:01 [caddy] INFO: TLS certificate renewal check\n2026-03-07 06:00:02 [caddy] INFO: Certificate for *.home.example-home.net valid until 2026-06-05 (90 days)\n2026-03-07 06:00:02 [caddy] INFO: No renewal needed\n\n2026-03-07 06:30:00 [adguard] INFO: Hourly DNS: 1,234 queries, 312 blocked (25.3%)\n2026-03-07 07:00:00 [adguard] INFO: Hourly DNS: 4,567 queries, 1,234 blocked (27.0%)\n2026-03-07 07:00:01 [adguard] INFO: Top client this hour: 192.168.188.101 (iphone-alex) - woke up\n\n=== 2026-03-07 07:30 - USER ACTIVITY ===\n\n2026-03-07 07:30:12 [synapse] INFO: POST /_matrix/client/v3/login - @admin:example-home.net - 200 OK (18ms)\n2026-03-07 07:30:13 [synapse] INFO: GET /_matrix/client/v3/sync - @admin:example-home.net - 200 OK (234ms)\n2026-03-07 07:30:15 [synapse] INFO: GET /_matrix/client/v3/sync - @kit-bot:example-home.net - 200 OK (89ms)\n2026-03-07 07:30:16 [synapse] INFO: GET /_matrix/client/v3/sync - @server-bot:example-home.net - 200 OK (45ms)\n2026-03-07 07:30:45 [synapse] INFO: PUT /_matrix/client/v3/rooms/!srv123:example-home.net/send/m.room.message - 200 OK (8ms)\n2026-03-07 07:30:46 [kit] INFO: Received message in #server from @admin:example-home.net: \"good morning, how's the server?\"\n2026-03-07 07:30:46 [kit] INFO: Processing with qwen3-coder:30b via Ollama\n2026-03-07 07:30:47 [ollama] INFO: Model qwen3-coder:30b not loaded, loading... (17.3GB)\n2026-03-07 07:31:02 [ollama] INFO: Model loaded in 15.4s (GPU: 100%)\n2026-03-07 07:31:02 [kit] INFO: Sending prompt (847 tokens, including system + tools)\n2026-03-07 07:31:05 [kit] INFO: TTFT: 3.2s\n2026-03-07 07:31:05 [kit] INFO: Running tool: fk status\n2026-03-07 07:31:06 [kit] INFO: Tool result: 1,234 chars\n2026-03-07 07:31:06 [kit] INFO: Sending follow-up (2,081 tokens with tool result)\n2026-03-07 07:31:12 [kit] INFO: TTFT: 5.8s\n2026-03-07 07:31:28 [kit] INFO: Response complete: 278 tokens in 16.2s (17.1 tok/s generation)\n2026-03-07 07:31:28 [synapse] INFO: PUT /_matrix/client/v3/rooms/!srv123:example-home.net/send/m.room.message - 200 OK (6ms)\n\n=== 2026-03-07 07:45 - PAPERLESS CONSUMPTION ===\n\n2026-03-07 07:45:00 [paperless] INFO: Starting scheduled document consumption\n2026-03-07 07:45:01 [paperless] INFO: Checking consume directory: /usr/src/paperless/consume\n2026-03-07 07:45:01 [paperless] INFO: Found 3 new files\n2026-03-07 07:45:02 [paperless] INFO: Processing: school-report-emma-2026.pdf (845KB, 3 pages)\n2026-03-07 07:45:07 [paperless] INFO: OCR completed (lang=deu, confidence=0.97)\n2026-03-07 07:45:08 [paperless] INFO: Text extraction: 2,847 chars\n2026-03-07 07:45:08 [paperless] INFO: Running classifier...\n2026-03-07 07:45:09 [paperless] INFO: Auto-classified: Type=School, Correspondent=Grundschule am Waldrand\n2026-03-07 07:45:09 [paperless] INFO: Auto-tagged: [education, emma, zwischenzeugnis, 2026]\n2026-03-07 07:45:10 [paperless] INFO: Stored as document #847\n2026-03-07 07:45:11 [paperless] INFO: Processing: swimming-certificate-max.pdf (234KB, 1 page)\n2026-03-07 07:45:14 [paperless] INFO: OCR completed (lang=deu, confidence=0.94)\n2026-03-07 07:45:15 [paperless] INFO: Auto-classified: Type=Certificate, Correspondent=DLRG\n2026-03-07 07:45:15 [paperless] INFO: Auto-tagged: [sports, max, swimming, bronze, 2026]\n2026-03-07 07:45:16 [paperless] INFO: Stored as document #848\n2026-03-07 07:45:17 [paperless] INFO: Processing: electricity-bill-march-2026.pdf (567KB, 2 pages)\n2026-03-07 07:45:21 [paperless] INFO: OCR completed (lang=deu, confidence=0.99)\n2026-03-07 07:45:22 [paperless] INFO: Auto-classified: Type=Invoice, Correspondent=Stadtwerke Musterstadt\n2026-03-07 07:45:22 [paperless] INFO: Auto-tagged: [utilities, electricity, invoice, 2026]\n2026-03-07 07:45:22 [paperless] INFO: Detected amount: 1,735.80 EUR\n2026-03-07 07:45:23 [paperless] INFO: Stored as document #849\n2026-03-07 07:45:23 [paperless] INFO: Consumption complete. 3 documents processed, 0 errors.\n\n2026-03-07 07:45:30 [archivist-bot] INFO: Received notification: 3 new documents in Paperless\n2026-03-07 07:45:31 [archivist-bot] INFO: Posting summary to #documents room\n2026-03-07 07:45:31 [synapse] INFO: PUT /_matrix/client/v3/rooms/!doc123:example-home.net/send/m.room.message - 200 OK (5ms)\n\n=== 2026-03-07 08:00 - IMMICH ML PROCESSING ===\n\n2026-03-07 08:00:01 [immich-server] INFO: Server health check: OK\n2026-03-07 08:00:01 [immich-server] INFO: Connected to database: OK (latency: 2ms)\n2026-03-07 08:00:01 [immich-server] INFO: Connected to Redis: OK\n2026-03-07 08:00:02 [immich-server] INFO: Asset statistics: 15,234 photos, 892 videos, 634GB total\n2026-03-07 08:00:05 [immich-ml] INFO: Loading CLIP model: ViT-B-32__openai\n2026-03-07 08:00:12 [immich-ml] INFO: CLIP model loaded (7.2s, 890MB GPU memory)\n2026-03-07 08:00:13 [immich-ml] INFO: Loading facial recognition model: buffalo_l\n2026-03-07 08:00:18 [immich-ml] INFO: Facial recognition model loaded (5.1s, 1.2GB GPU memory)\n2026-03-07 08:00:18 [immich-ml] INFO: Starting job queue processing\n2026-03-07 08:00:19 [immich-ml] INFO: Found 1,203 unprocessed assets in queue (from yesterday's upload)\n2026-03-07 08:00:20 [immich-ml] INFO: Processing batch 1/1203 - facial recognition\n2026-03-07 08:00:22 [immich-ml] INFO: Found 2 faces in IMG_4501.jpg (confidence: 0.97, 0.91)\n2026-03-07 08:00:22 [immich-ml] INFO: Matched: Person #1 (Emma), Person #3 (Max)\n2026-03-07 08:00:24 [immich-ml] INFO: Processing batch 2/1203 - CLIP embedding\n2026-03-07 08:00:26 [immich-ml] INFO: Generated CLIP embedding for IMG_4501.jpg (512-dim, 1.8s)\n2026-03-07 08:00:28 [immich-ml] INFO: Processing batch 3/1203 - facial recognition\n2026-03-07 08:00:30 [immich-ml] INFO: Found 4 faces in IMG_4502.jpg (confidence: 0.98, 0.95, 0.88, 0.71)\n2026-03-07 08:00:30 [immich-ml] INFO: Matched: Person #1 (Emma), Person #3 (Max), Person #5 (Alex)\n2026-03-07 08:00:30 [immich-ml] INFO: New face detected (confidence: 0.71) - added to unmatched queue\n2026-03-07 08:00:32 [immich-ml] INFO: Processing batch 4/1203 - CLIP embedding\n2026-03-07 08:00:34 [immich-ml] INFO: Generated CLIP embedding for IMG_4502.jpg (512-dim, 1.6s)\n2026-03-07 08:05:00 [immich-ml] INFO: Progress: 67/1203 (5.6%), ETA: ~2h 15min\n2026-03-07 08:10:00 [immich-ml] INFO: Progress: 134/1203 (11.1%), memory: 9.8GB/12GB\n2026-03-07 08:12:33 [immich-ml] INFO: Processing batch 847/1203 - facial recognition\n2026-03-07 08:12:34 [immich-ml] INFO: Found 3 faces in IMG_4521.jpg (confidence: 0.94, 0.87, 0.72)\n2026-03-07 08:12:35 [immich-ml] INFO: Clustering face embeddings... 12,847 vectors\n2026-03-07 08:12:38 [immich-ml] INFO: Clustering complete: 23 persons identified, 47 unmatched\n2026-03-07 08:12:39 [immich-ml] INFO: Processing batch 848/1203 - facial recognition\n2026-03-07 08:12:40 [immich-ml] INFO: Processing batch 849/1203 - CLIP embedding\n2026-03-07 08:12:42 [immich-ml] INFO: Generated CLIP embedding for IMG_4522.jpg (512-dim)\n2026-03-07 08:12:44 [immich-ml] WARNING: Low memory condition detected (11.8GB/12GB = 98.3%)\n2026-03-07 08:12:44 [immich-ml] WARNING: Triggering garbage collection...\n2026-03-07 08:12:45 [immich-ml] INFO: Memory reclaimed: 1.2GB freed (now 10.6GB/12GB)\n2026-03-07 08:12:46 [immich-ml] INFO: Processing batch 850/1203 - facial recognition\n2026-03-07 08:12:50 [immich-ml] INFO: Queue status: 353 remaining, ETA: ~47 minutes\n2026-03-07 08:30:00 [immich-ml] INFO: Progress: 956/1203 (79.5%), memory: 11.2GB/12GB\n2026-03-07 08:45:00 [immich-ml] INFO: Progress: 1089/1203 (90.5%)\n2026-03-07 08:55:00 [immich-ml] INFO: Progress: 1198/1203 (99.6%)\n2026-03-07 08:56:12 [immich-ml] INFO: Queue processing complete: 1,203 assets processed\n2026-03-07 08:56:12 [immich-ml] INFO: Results: 3,847 faces found, 23 persons, 1,203 CLIP embeddings\n2026-03-07 08:56:13 [immich-ml] INFO: Total processing time: 56m 13s\n2026-03-07 08:56:13 [immich-ml] INFO: Entering idle mode\n\n=== 2026-03-07 10:00 - MIDMORNING ===\n\n2026-03-07 10:00:00 [adguard] INFO: Hourly DNS: 12,847 queries, 3,421 blocked (26.6%)\n2026-03-07 10:00:01 [adguard] WARNING: Client 192.168.188.103 still bypassing AdGuard DNS\n\n2026-03-07 10:15:00 [homepage] INFO: Widget refresh cycle\n2026-03-07 10:15:01 [homepage] INFO: AdGuard widget: OK (23ms)\n2026-03-07 10:15:01 [homepage] INFO: Immich widget: OK (124ms) - 15,234 photos\n2026-03-07 10:15:02 [homepage] WARNING: Paperless widget: timeout (5000ms)\n2026-03-07 10:15:02 [homepage] INFO: Forgejo widget: OK (87ms)\n2026-03-07 10:15:03 [homepage] INFO: Synapse widget: OK (201ms)\n2026-03-07 10:15:03 [homepage] INFO: Retrying Paperless widget...\n2026-03-07 10:15:05 [homepage] INFO: Paperless widget: OK (1,847ms) - 849 documents\n2026-03-07 10:15:05 [homepage] WARNING: Paperless response slow (>1s) - possible index rebuild\n\n2026-03-07 11:00:00 [forgejo] INFO: Scheduled mirror sync\n2026-03-07 11:00:01 [forgejo] INFO: Syncing alex/nanobot from https://github.com/HKUDS/nanobot.git\n2026-03-07 11:00:04 [forgejo] INFO: alex/nanobot: up to date (last commit: 2026-03-01)\n2026-03-07 11:00:04 [forgejo] INFO: Mirror sync complete. Next sync: 2026-03-07 19:00:00\n\n=== 2026-03-07 12:00 - MIDDAY STATUS ===\n\n2026-03-07 12:00:00 [docker] INFO: Container health check summary:\n2026-03-07 12:00:00 [docker] caddy: healthy (uptime: 4d 3h)\n2026-03-07 12:00:00 [docker] adguard: healthy (uptime: 4d 3h)\n2026-03-07 12:00:00 [docker] immich-server: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] immich-ml: healthy (uptime: 4d 3h) [idle]\n2026-03-07 12:00:01 [docker] immich-postgres: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] immich-redis: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] synapse: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] synapse-postgres: healthy (uptime: 4d 3h)\n2026-03-07 12:00:01 [docker] element-web: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] paperless: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] homepage: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] dockge: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] forgejo: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] butler: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] alfred: healthy (uptime: 4d 3h)\n2026-03-07 12:00:02 [docker] kit: healthy (uptime: 1d 7h)\n2026-03-07 12:00:03 [docker] server-bot: healthy (uptime: 4d 3h)\n2026-03-07 12:00:03 [docker] INFO: 17/17 containers healthy. Memory: 39.1GB / 64GB\n\n2026-03-07 14:00:00 [timemachine] INFO: Status check: last backup 2026-03-07 03:09 (successful)\n2026-03-07 14:00:01 [timemachine] INFO: Disk: 4.1TB / 5.5TB (75%), 51 snapshots\n\n2026-03-07 15:00:00 [adguard] INFO: Hourly DNS: 8,234 queries, 2,134 blocked (25.9%)\n\n=== 2026-03-07 16:00 - AFTERNOON ACTIVITY ===\n\n2026-03-07 16:12:00 [immich-server] INFO: Upload started from 192.168.188.101 (iphone-alex)\n2026-03-07 16:12:01 [immich-server] INFO: Receiving: 12 new photos (48MB total)\n2026-03-07 16:12:15 [immich-server] INFO: Upload complete: 12 assets stored\n2026-03-07 16:12:16 [immich-ml] INFO: Waking from idle, 12 new assets queued\n2026-03-07 16:12:20 [immich-ml] INFO: Processing 12 assets (face detection + CLIP)\n2026-03-07 16:13:45 [immich-ml] INFO: Batch complete: 12 assets, 28 faces, 12 CLIP embeddings (85s)\n2026-03-07 16:13:46 [immich-ml] INFO: Entering idle mode\n\n2026-03-07 16:30:00 [synapse] INFO: POST /_matrix/client/v3/rooms/!fam123:example-home.net/send/m.room.message - 200 OK (7ms)\n2026-03-07 16:30:01 [synapse] INFO: POST /_matrix/media/v3/upload - 200 OK (234ms, 2.3MB image)\n2026-03-07 16:30:05 [synapse] INFO: GET /_matrix/client/v3/sync - 3 clients synced\n\n2026-03-07 17:00:00 [adguard] INFO: Hourly DNS: 11,234 queries, 3,012 blocked (26.8%)\n\n=== 2026-03-07 18:00 - EVENING ===\n\n2026-03-07 18:00:00 [docker] INFO: Container health check: 17/17 healthy. Memory: 38.7GB / 64GB\n\n2026-03-07 19:00:00 [forgejo] INFO: Scheduled mirror sync\n2026-03-07 19:00:01 [forgejo] INFO: Syncing alex/nanobot: up to date\n2026-03-07 19:00:02 [forgejo] INFO: Mirror sync complete\n\n2026-03-07 20:00:00 [synapse] INFO: Database maintenance: VACUUM ANALYZE\n2026-03-07 20:00:14 [synapse] INFO: VACUUM completed in 14.2s\n2026-03-07 20:00:15 [synapse] INFO: Database size: 2.1GB (reclaimed 45MB)\n2026-03-07 20:00:15 [synapse] INFO: Largest tables: state_groups_state (845MB), event_json (412MB), events (298MB)\n\n2026-03-07 21:00:00 [adguard] INFO: Hourly DNS: 6,847 queries, 1,823 blocked (26.6%)\n\n2026-03-07 21:30:00 [ollama] INFO: Model qwen3-coder:30b unloaded (idle timeout: 5m)\n2026-03-07 21:30:00 [ollama] INFO: GPU memory freed: 17.3GB\n\n2026-03-07 22:00:00 [adguard] INFO: Daily DNS statistics:\n2026-03-07 22:00:00 [adguard] INFO: Total queries: 148,234\n2026-03-07 22:00:00 [adguard] INFO: Blocked: 39,847 (26.9%)\n2026-03-07 22:00:01 [adguard] INFO: Average response time: 14ms\n2026-03-07 22:00:01 [adguard] INFO: Unique clients: 8\n2026-03-07 22:00:01 [adguard] WARNING: Client 192.168.188.103 bypassed AdGuard all day (2,134 direct queries)\n\n2026-03-07 22:00:05 [docker] INFO: Evening health check: 17/17 healthy. Memory: 21.4GB / 64GB (Ollama models unloaded)\n```" + } + ] +} \ No newline at end of file diff --git a/results/qwen3.6-35b-a3b/prefill-test/m4-max-128gb-40gpu_lmstudio-mlx.md b/results/qwen3.6-35b-a3b/prefill-test/m4-max-128gb-40gpu_lmstudio-mlx.md new file mode 100644 index 0000000..91fc17a --- /dev/null +++ b/results/qwen3.6-35b-a3b/prefill-test/m4-max-128gb-40gpu_lmstudio-mlx.md @@ -0,0 +1,18 @@ +# Apple M4 Max / 128GB / 40 GPU cores + +**Model:** qwen3.6-35b-a3b +**Backend:** lmstudio-mlx +**Scenario:** prefill-test (single-shot) + +| Turn | Context | Prefill | Gen | Gen tok/s | Effective tok/s | Total | Output | +|-----:|--------:|--------:|----:|----------:|----------------:|------:|-------:| +| 1 | 655 | 0.76s | 1.20s | 88.1 | **54.1** | 1.96s | 106 | +| 2 | 1,453 | 1.25s | 1.67s | 85.0 | **48.6** | 2.92s | 142 | +| 3 | 3,015 | 2.54s | 1.44s | 86.4 | **31.2** | 3.97s | 124 | +| 4 | 8,496 | 10.82s | 1.32s | 82.6 | **9.0** | 12.14s | 109 | + +**Total prefill:** 15.4s +**Total generation:** 5.6s +**Total time:** 21.0s +**Avg generation tok/s:** 85.5 +**Avg effective tok/s:** 22.9