vault backup: 2026-03-07 09:54:02

This commit is contained in:
Vincent Verbruggen
2026-03-07 09:54:02 +01:00
parent cdf7b8c34d
commit 520c592bbd
9 changed files with 863 additions and 0 deletions

1
.gitignore vendored
View File

@@ -4,3 +4,4 @@
.claude .claude
.mcp.json .mcp.json
/Personal/Areas/MCP-Servers /Personal/Areas/MCP-Servers
.DS_Store

View File

@@ -0,0 +1,61 @@
<!-- W: 2500 + 500 each side -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3500 3600" width="800" height="820"
font-family="monospace" font-size="48">
<!-- Background -->
<rect width="3500" height="3600" fill="#f8f8f8" />
<!-- Title -->
<!-- Room in mm. Visual: A at top, F/E (origin) at bottom-left.
SVG coords = (arch_x, 2600 - arch_y) so Y-up maps to SVG Y-down.
Polygon (SVG): A(0,0) B(2500,0) C(2500,1000) D(1500,1000) E(1500,2600) F(0,2600)
Arch coords: A(0,2600) B(2500,2600) C(2500,1600) D(1500,1600) E(1500,0) F(0,0)
-->
<!-- Make y be upwards increasing and add 500 padding -->
<g transform="translate(500, 3000) scale(1,-1)">
<!-- Fix text orientation -->
<g transform="translate(1250, 2850) scale(1,-1)">
<text text-anchor="middle" font-size="80" font-weight="bold"
fill="#333">Bathroom
Blueprint</text>
</g>
<!-- Room outline -->
<polygon
points="0,0 0,2600 2500,2600 2500,1500 1500,1500 1500,0"
fill=" white" stroke=" #333" stroke-width=" 16" stroke-linejoin=" miter" />
<!-- Default line padding 60 -->
<line x1="0" y1="calc(0 - 60)" x2="1500" y2="calc(0 - 60)" stroke="#555" stroke-width="4" />
<line x1="0" y1="calc(0 - 60 - 25)" x2="0" y2="calc(0 - 60 - 25 + 50)" stroke="#555"
stroke-width="4" />
<line x1="1500" y1="calc(0 - 60 - 25)" x2="1500" y2="calc(0 - 60 - 25 + 50)" stroke="#555"
stroke-width="4" />
<!-- Move in our coordinate then flip for text readable -->
<!-- text half way and on y - 120 -->
<g transform="translate(750, -120) scale(1,-1)">
<text text-anchor="middle" dominant-baseline="central" font-size="48" fill="#555">
1500</text>
</g>
<line x1="0" y1="calc(2600 + 60)" x2="2500" y2="calc(2600 + 60)" stroke="#555" stroke-width="4" />
<line x1="0" y1="calc(2600 + 60 - 25)" x2="0" y2="calc(2600 + 60 - 25 + 50)" stroke="#555"
stroke-width="4" />
<line x1="2500" y1="calc(2600 + 60 - 25)" x2="2500" y2="calc(2600 + 60 - 25 + 50)" stroke="#555"
stroke-width="4" />
<!-- Move in our coordinate then flip for text readable -->
<!-- text half way and on y + 120 -->
<g transform="translate(1250, 2720) scale(1,-1)">
<text text-anchor="middle" dominant-baseline="central" font-size="48" fill="#555">
2500</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,160 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3700 3800" width="800" height="820" font-family="monospace" font-size="48">
<!-- Background -->
<rect width="3700" height="3800" fill="#f8f8f8"/>
<!-- Title -->
<text x="1850" y="80" text-anchor="middle" font-size="80" font-weight="bold" fill="#333">Bathroom Blueprint (DRAFT)</text>
<text x="1850" y="140" text-anchor="middle" font-size="42" fill="#888">Coordinates in mm — F/E corner = (0,0) — Y increases upward</text>
<!-- Room in mm. Visual: A at top, F/E (origin) at bottom-left.
SVG coords = (arch_x, 2600 - arch_y) so Y-up maps to SVG Y-down.
Polygon (SVG): A(0,0) B(2500,0) C(2500,1000) D(1500,1000) E(1500,2600) F(0,2600)
Arch coords: A(0,2600) B(2500,2600) C(2500,1600) D(1500,1600) E(1500,0) F(0,0)
-->
<g transform="translate(400, 350)">
<!-- Room outline -->
<polygon points="0,0 2500,0 2500,1000 1500,1000 1500,2600 0,2600"
fill="white" stroke="#333" stroke-width="16" stroke-linejoin="miter"/>
<!-- === EDGE LABELS === -->
<!-- Wall A: top (arch y=2600) -->
<rect x="1210" y="-200" width="80" height="65" rx="10" fill="#e8e8e8" stroke="#999" stroke-width="3"/>
<text x="1250" y="-150" text-anchor="middle" font-size="48" font-weight="bold" fill="#333">A</text>
<!-- Wall B: right upper (arch x=2500) -->
<rect x="2560" y="460" width="80" height="65" rx="10" fill="#e8e8e8" stroke="#999" stroke-width="3"/>
<text x="2600" y="510" text-anchor="middle" font-size="48" font-weight="bold" fill="#333">B</text>
<!-- Wall C: step horizontal (arch y=1600) -->
<rect x="1960" y="1040" width="80" height="65" rx="10" fill="#e8e8e8" stroke="#999" stroke-width="3"/>
<text x="2000" y="1090" text-anchor="middle" font-size="48" font-weight="bold" fill="#333">C</text>
<!-- Wall D: right lower (arch x=1500) -->
<rect x="1560" y="1760" width="80" height="65" rx="10" fill="#e8e8e8" stroke="#999" stroke-width="3"/>
<text x="1600" y="1810" text-anchor="middle" font-size="48" font-weight="bold" fill="#333">D</text>
<!-- Wall E: bottom / door (arch y=0) -->
<rect x="710" y="2640" width="80" height="65" rx="10" fill="#e8e8e8" stroke="#999" stroke-width="3"/>
<text x="750" y="2690" text-anchor="middle" font-size="48" font-weight="bold" fill="#333">E</text>
<!-- Wall F: left (arch x=0) -->
<rect x="-200" y="1260" width="80" height="65" rx="10" fill="#e8e8e8" stroke="#999" stroke-width="3"/>
<text x="-160" y="1310" text-anchor="middle" font-size="48" font-weight="bold" fill="#333">F</text>
<!-- === DIMENSIONS === -->
<!-- Wall A: 2500mm (top) -->
<line x1="0" y1="-60" x2="2500" y2="-60" stroke="#555" stroke-width="4"/>
<line x1="0" y1="-85" x2="0" y2="-35" stroke="#555" stroke-width="4"/>
<line x1="2500" y1="-85" x2="2500" y2="-35" stroke="#555" stroke-width="4"/>
<text x="600" y="-90" text-anchor="middle" font-size="48" fill="#555">2500</text>
<!-- Wall F: 2600mm (left) -->
<line x1="-60" y1="0" x2="-60" y2="2600" stroke="#555" stroke-width="4"/>
<line x1="-85" y1="0" x2="-35" y2="0" stroke="#555" stroke-width="4"/>
<line x1="-85" y1="2600" x2="-35" y2="2600" stroke="#555" stroke-width="4"/>
<text x="-100" y="700" text-anchor="middle" font-size="48" fill="#555" transform="rotate(-90, -100, 700)">2600</text>
<!-- Wall E: 1500mm (bottom) -->
<line x1="0" y1="2720" x2="1500" y2="2720" stroke="#555" stroke-width="4"/>
<line x1="0" y1="2695" x2="0" y2="2745" stroke="#555" stroke-width="4"/>
<line x1="1500" y1="2695" x2="1500" y2="2745" stroke="#555" stroke-width="4"/>
<text x="350" y="2800" text-anchor="middle" font-size="48" fill="#555">1500</text>
<!-- Wall B: 1000mm (right upper) -->
<line x1="2660" y1="0" x2="2660" y2="1000" stroke="#555" stroke-width="4"/>
<line x1="2635" y1="0" x2="2685" y2="0" stroke="#555" stroke-width="4"/>
<line x1="2635" y1="1000" x2="2685" y2="1000" stroke="#555" stroke-width="4"/>
<text x="2750" y="520" text-anchor="middle" font-size="48" fill="#555" transform="rotate(90, 2750, 520)">1000</text>
<!-- Wall C: 1000mm (step) -->
<line x1="1500" y1="1120" x2="2500" y2="1120" stroke="#555" stroke-width="4"/>
<line x1="1500" y1="1095" x2="1500" y2="1145" stroke="#555" stroke-width="4"/>
<line x1="2500" y1="1095" x2="2500" y2="1145" stroke="#555" stroke-width="4"/>
<text x="2000" y="1190" text-anchor="middle" font-size="48" fill="#555">1000</text>
<!-- Wall D: 1600mm (right lower) -->
<line x1="1660" y1="1000" x2="1660" y2="2600" stroke="#555" stroke-width="4"/>
<line x1="1635" y1="1000" x2="1685" y2="1000" stroke="#555" stroke-width="4"/>
<line x1="1635" y1="2600" x2="1685" y2="2600" stroke="#555" stroke-width="4"/>
<text x="1750" y="1500" text-anchor="middle" font-size="48" fill="#555" transform="rotate(90, 1750, 1500)">1600</text>
<!-- === BATH (top-left corner, 1850x850, long side along wall F) === -->
<!-- SVG: (25, 25) to (875, 1875) -->
<g>
<rect x="25" y="25" width="850" height="1850" rx="60" fill="none" stroke="#333" stroke-width="10"/>
<rect x="75" y="75" width="750" height="1750" rx="50" fill="#d4e8f7" fill-opacity="0.3" stroke="#999" stroke-width="5"/>
<!-- Faucet (middle of bath, wall F side) -->
<circle cx="40" cy="950" r="30" fill="none" stroke="#4a90d9" stroke-width="7"/>
<circle cx="40" cy="950" r="10" fill="#4a90d9"/>
<!-- Drain -->
<circle cx="425" cy="1700" r="25" fill="none" stroke="#999" stroke-width="5"/>
<text x="425" y="930" text-anchor="middle" font-size="45" fill="#666">Bath</text>
<text x="425" y="990" text-anchor="middle" font-size="38" fill="#666">1850x850</text>
</g>
<!-- === SHOWER (top-right nook, ~1000x1000) === -->
<rect x="1500" y="0" width="1000" height="1000" fill="#d4e8f7" fill-opacity="0.4"
stroke="#333" stroke-width="10" stroke-dasharray="30,15"/>
<!-- Shower head (middle of wall B) -->
<circle cx="2475" cy="500" r="60" fill="none" stroke="#4a90d9" stroke-width="7"/>
<circle cx="2475" cy="500" r="20" fill="#4a90d9"/>
<!-- Drain -->
<circle cx="2000" cy="500" r="35" fill="none" stroke="#999" stroke-width="5"/>
<line x1="1980" y1="500" x2="2020" y2="500" stroke="#999" stroke-width="5"/>
<line x1="2000" y1="480" x2="2000" y2="520" stroke="#999" stroke-width="5"/>
<text x="2000" y="600" text-anchor="middle" font-size="45" fill="#4a90d9">Shower</text>
<text x="2000" y="660" text-anchor="middle" font-size="38" fill="#4a90d9">(~1000x1000)</text>
<!-- === SINK / VANITY (wall F, between bath and bottom/door edge) === -->
<!-- SVG: (25, 2025) to (525, 2475) -->
<g>
<rect x="25" y="2025" width="500" height="450" rx="15" fill="none" stroke="#333" stroke-width="10"/>
<ellipse cx="275" cy="2210" rx="90" ry="130" fill="none" stroke="#333" stroke-width="7"/>
<!-- Faucet -->
<circle cx="100" cy="2210" r="18" fill="none" stroke="#4a90d9" stroke-width="7"/>
<circle cx="100" cy="2210" r="6" fill="#4a90d9"/>
<text x="275" y="2550" text-anchor="middle" font-size="45" fill="#666">Sink</text>
</g>
<!-- === RADIATOR (wall D, 600mm, 600mm from door) === -->
<!-- SVG: x=1425, y=1400 to y=2000, width=75 -->
<rect x="1425" y="1400" width="75" height="600" fill="#e85d3a" fill-opacity="0.4" stroke="#e85d3a" stroke-width="7"/>
<!-- Dimension: 600mm gap between radiator and door on wall D -->
<line x1="1580" y1="2000" x2="1580" y2="2600" stroke="#555" stroke-width="4"/>
<line x1="1555" y1="2000" x2="1605" y2="2000" stroke="#555" stroke-width="4"/>
<line x1="1555" y1="2600" x2="1605" y2="2600" stroke="#555" stroke-width="4"/>
<text x="1620" y="2310" text-anchor="middle" font-size="42" fill="#555" transform="rotate(90, 1620, 2310)">600</text>
<!-- === DOOR (wall E, right side, dotted line) === -->
<!-- 550mm wall from F corner, then door opening -->
<line x1="550" y1="2600" x2="1500" y2="2600" stroke="#333" stroke-width="14" stroke-dasharray="40,25"/>
<!-- Dimension: 550mm wall left of door -->
<line x1="0" y1="2850" x2="550" y2="2850" stroke="#555" stroke-width="4"/>
<line x1="0" y1="2825" x2="0" y2="2875" stroke="#555" stroke-width="4"/>
<line x1="550" y1="2825" x2="550" y2="2875" stroke="#555" stroke-width="4"/>
<text x="275" y="2940" text-anchor="middle" font-size="42" fill="#555">550</text>
<!-- Scale bar (bottom right) -->
<g transform="translate(1700, 2850)">
<line x1="0" y1="0" x2="1000" y2="0" stroke="#333" stroke-width="8"/>
<line x1="0" y1="-25" x2="0" y2="25" stroke="#333" stroke-width="8"/>
<line x1="500" y1="-15" x2="500" y2="15" stroke="#333" stroke-width="5"/>
<line x1="1000" y1="-25" x2="1000" y2="25" stroke="#333" stroke-width="8"/>
<text x="0" y="65" text-anchor="middle" font-size="38" fill="#333">0</text>
<text x="500" y="65" text-anchor="middle" font-size="38" fill="#333">500</text>
<text x="1000" y="65" text-anchor="middle" font-size="38" fill="#333">1000mm</text>
</g>
</g>
<!-- Legend -->
<g transform="translate(3250, 400)">
<text x="0" y="0" font-size="50" font-weight="bold" fill="#333">Legend</text>
<line x1="0" y1="60" x2="80" y2="60" stroke="#333" stroke-width="14"/>
<text x="100" y="75" font-size="40" fill="#555">Wall</text>
<line x1="0" y1="120" x2="80" y2="120" stroke="#333" stroke-width="8" stroke-dasharray="20,10"/>
<text x="100" y="135" font-size="40" fill="#555">Shower</text>
<circle cx="40" cy="180" r="18" fill="#4a90d9"/>
<text x="100" y="195" font-size="40" fill="#555">Water</text>
<rect x="0" y="225" width="80" height="40" fill="#e85d3a" fill-opacity="0.4" stroke="#e85d3a" stroke-width="4"/>
<text x="100" y="255" font-size="40" fill="#555">Radiator</text>
<line x1="0" y1="300" x2="80" y2="300" stroke="#333" stroke-width="14" stroke-dasharray="20,12"/>
<text x="100" y="315" font-size="40" fill="#555">Door</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -0,0 +1,109 @@
# Bathroom Renovation
> **Started:** 2026-03-07
> **Status:** Planning
---
## Current State
Describe what the bathroom looks like now: dimensions, fixtures, materials, condition.
- **Dimensions:** _TODO (L x W in cm/m)_
- **Ceiling height:** _TODO_
- **Current flooring:** _TODO_
- **Current wall finish:** _TODO_
- **Fixtures:**
- Toilet: _TODO (type, condition)_
- Sink/vanity: _TODO_
- Shower / bathtub: _TODO_
- Mirror/cabinet: _TODO_
- **Plumbing location:** _TODO (which wall carries the supply/drain lines)_
- **Ventilation:** _TODO (extractor fan?)_
- **Electrical:** _TODO (outlets, lighting, heated floor)_
---
## Goals / Requirements
What should the new bathroom achieve?
- [ ] _TODO — e.g., walk-in shower instead of bathtub_
- [ ] _TODO — e.g., double sink_
- [ ] _TODO — e.g., heated floor_
- [ ] _TODO — e.g., specific style/aesthetic_
---
## Blueprint
![[Bathroom Blueprint.svg]]
---
## Materials & Finishes
| Element | Choice | Supplier / Link | Price |
|---------|--------|-----------------|-------|
| Floor tiles | | | |
| Wall tiles | | | |
| Shower screen | | | |
| Toilet | | | |
| Sink / vanity | | | |
| Faucets | | | |
| Mirror / cabinet | | | |
| Lighting | | | |
| Paint / other | | | |
---
## Budget
| Category | Estimated | Actual |
|----------|-----------|--------|
| Materials | | |
| Labour | | |
| Plumbing | | |
| Electrical | | |
| Unexpected / contingency (15%) | | |
| **Total** | | |
---
## Contractor / DIY Plan
- **DIY:** _list tasks you handle yourself_
- **Professional:** _list tasks that need a contractor_
- **Contacts:**
- Plumber: _name, phone_
- Electrician: _name, phone_
- Tiler: _name, phone_
---
## Timeline
| Phase | Target Date | Done |
|-------|-------------|------|
| Planning & design | | |
| Demolition | | |
| Plumbing rough-in | | |
| Electrical rough-in | | |
| Waterproofing | | |
| Tiling | | |
| Fixture installation | | |
| Finishing touches | | |
---
## Notes
-
---
## Reference / Inspiration
Links, photos, or ideas collected.
-

View File

@@ -0,0 +1,194 @@
# Das Festival 2026
**Date:** Saturday, May 23, 2026, 12:00 - 23:00
**Location:** Tuinen van West, Amsterdam
**Organizer:** [Komm Schon Alter](https://www.kommschonalter.de/events/komm-schon-alter---das-festival-2026)
---
## Line-up
### Andhim
German duo (Simon Haehnel & Tobias Muller) known for their self-coined "super house" sound -- melodic yet deep, blending house and techno. Over 60 releases since 2010 and 100+ shows per year.
- [SoundCloud](https://soundcloud.com/andhim)
- [Mixcloud](https://www.mixcloud.com/discover/andhim/)
- [Resident Advisor](https://ra.co/dj/andhim)
**Recommended listens:**
- [Exclusive Mix for Time Warp](https://soundcloud.com/timewarp_official/andhim-exclusive-mix-for-time-warp)
- [True Underground ONE-65](https://soundcloud.com/trueundergroundone/andhim-tu65)
---
### De Sluwe Vos
Dutch DJ, producer, and label owner who combines house, techno, and hiphop with high-energy beats, driving basslines, and intricate percussion. Often incorporates old-school rave elements.
- [SoundCloud](https://soundcloud.com/desluwevos)
- [Resident Advisor](https://ra.co/dj/desluwevos)
- [Bandcamp](https://desluwevos.bandcamp.com/album/now-i-understand)
**Recommended listens:**
- [DJ Sets Playlist (SoundCloud)](https://soundcloud.com/desluwevos/sets/dj-sets)
- [The Boom Room 550](https://soundcloud.com/theboomroomofficial/550-the-boom-room-de-sluwe-vos)
- [The Boom Room 470](https://soundcloud.com/theboomroomofficial/470-the-boom-room-de-sluwe-vos)
- [Live @ Shelter 07.10.22](https://soundcloud.com/desluwevos/de-sluwe-vos-shelter-071022)
---
### Eelke Kleijn (live)
Dutch DJ and producer from Rotterdam. Blends progressive house, techno, and melodic electronic music with ambient and breakbeat elements. Runs the "DAYS like NIGHTS" radio show. Performing a live set at Das Festival.
- [SoundCloud](https://soundcloud.com/eelke-kleijn)
- [Mixcloud (DAYS like NIGHTS)](https://www.mixcloud.com/eelkekleijn/)
- [Resident Advisor](https://ra.co/dj/eelkekleijn)
**Recommended listens:**
- [Live at Mont Saint-Michel for Cercle](https://soundcloud.com/cerclelive/eelke-keijn-mont-saint-michel)
- [Live from Balance Croatia 2025](https://soundcloud.com/balance-series/eelke-kleijn-live-from-balance-croatia-2025)
- [The Boom Room 512 (3hrs)](https://soundcloud.com/theboomroomofficial/512-the-boom-room-eelke-kleijn)
---
### Einmusik
Berlin-based producer (Samuel Kindermann) specializing in melodic techno and deep house. Atmospheric, soulful sound with progressive influences. Runs his own label Einmusika.
- [SoundCloud](https://soundcloud.com/einmusik)
- [Mixcloud](https://www.mixcloud.com/EINMUSIK/)
- [DJ Mixes & Livesets Playlist](https://soundcloud.com/einmusik/sets/einmusik-mixes)
**Recommended listens:**
- [Mixes Playlist (SoundCloud)](https://soundcloud.com/einmusik/sets/einmusik-mixes)
- [Live DJ Set - Fusion Festival 2018](https://www.mixcloud.com/alfredo-raya/einmusik-live-dj-set-fusion-festival-2018-germany-27-06-2018/)
---
### Huminal
Dutch duo (Paul Deetman & Jelle Jansen) from Amsterdam. Progressive house, techno, and electronica with rich soundscapes, organic elements, and cinematic sound design. Blends analogue textures with crisp rhythmic forms.
- [SoundCloud](https://soundcloud.com/huminalmusic)
- [Spotify](https://open.spotify.com/artist/0ifJHiwqO4YcVAd3vy8CEQ)
- [Resident Advisor](https://ra.co/dj/huminal)
**Recommended listens:**
- [Flow Sessions 115 - Huminal (3.5hrs)](https://soundcloud.com/flowsessions/flow-sessions-115-huminal)
---
### Mees Salome
Dutch producer and DJ known for melodic electronic music blending emotive melodies with powerful grooves. Released on Filth on Acid, This Never Happened, and Armada. Founder of the Distant platform.
- [SoundCloud](https://soundcloud.com/mees-salome)
- [Website](https://meessalome.com/)
- [Resident Advisor](https://ra.co/dj/meessalome)
**Recommended listens:**
- [The Boom Room 439 (Resident Mix)](https://soundcloud.com/theboomroomofficial/439-the-boom-room-mees-salome)
- [The Boom Room 223 (Mixcloud)](https://www.mixcloud.com/theboomroom/223-the-boom-room-mees-salom%C3%A9/)
---
### Miss Melera
Amsterdam-based DJ and producer (Kim de Lange). Deep and progressive techno twisted into melodic, fresh compositions. Hosts a monthly podcast called "Colourizon."
- [SoundCloud](https://soundcloud.com/missmelera)
- [Website](https://www.missmelera.com/)
- [Resident Advisor](https://ra.co/dj/missmelera)
**Recommended listens:**
- [The Boom Room 138 (Mixcloud)](https://www.mixcloud.com/theboomroom/138-the-boom-room-miss-melera/)
- [1001Tracklists Overview](https://www.1001tracklists.com/dj/missmelera/index.html)
---
### Nicky Elisabeth
Dutch-Belgian DJ and producer. Romantic, eclectic deep house and progressive/melodic house with an energy-lifting aesthetic.
- [SoundCloud](https://soundcloud.com/nicky-elisabeth)
- [Resident Advisor](https://ra.co/dj/nickyelisabeth)
**Recommended listens:**
- [DHA FM Mix #463 (Deep House Amsterdam)](https://soundcloud.com/deep-house-amsterdam/nicky-elisabeth-dha-fm-mix-463)
- [DGTL Digital 2020 Set](https://soundcloud.com/dgtl-festival/nickyelisabeth-digital-dgtl-2020-1)
---
### NTO (live)
French producer (Anthony Favier) specializing in melodic and minimal techno. Atmospheric soundscapes with deep, purposeful beats. Often incorporates guitar and keyboards. Performing a live set at Das Festival.
- [SoundCloud](https://soundcloud.com/anthony-favier-970568294)
- [WatchTheDJ (live sets)](https://watchthedj.com/djs/nto)
- [Instagram](https://www.instagram.com/ntomusic/)
**Recommended listens:**
- [Lac de Soi - Cercle Stories (live in Swiss Alps)](https://soundcloud.com/cerclelive/ntolacdesoicerclestories)
---
### Olivier Weiter
Dutch DJ/producer deeply rooted in Amsterdam's underground scene. Known for marathon sets blending obscure house and techno. Founded the WEITER label and hosts monthly "WEITER Radio."
- [SoundCloud](https://soundcloud.com/olivier-weiter)
- [Resident Advisor](https://ra.co/dj/olivierweiter)
**Recommended listens:**
- [Yearmix 2023](https://soundcloud.com/olivier-weiter/olivier-weiter-yearmix-2023)
- [Yearmix 2022](https://soundcloud.com/olivier-weiter/olivier-weiter-yearmix-2022)
---
### Rose Ringed
Amsterdam-based DJ and producer. Melodic, emotive house and techno with warm, dreamy atmospheres and strong chord progressions. Founder of Closed Eyes Recordings. Collaborates regularly with Joris Voorn.
- [SoundCloud](https://soundcloud.com/rose-ringed)
- [Resident Advisor](https://ra.co/dj/roseringed)
**Recommended listens:**
- [Solomun Open Air Brussels 2023](https://soundcloud.com/rose-ringed/rose-ringed-dj-set-solomun-open-air-cinquantenaire-brussel)
- [De Zon Festival 2023 (Sunset Set)](https://soundcloud.com/rose-ringed/rose-ringed-dj-set-live-at-de-zon-festival-2023)
- [Diynamic OFF Sonar Barcelona 2023](https://soundcloud.com/rose-ringed/rose-ringed-dj-set-diynamic-off-sonar-barcelona-2023-monasterio)
---
### Sandrien
Amsterdam-based DJ and producer. Versatile techno ranging from deep and atmospheric to high-energy breaks and acid. Founded "Imprint," a monthly underground techno night. Regular at Dekmantel, Awakenings, and Loveland.
- [SoundCloud](https://soundcloud.com/sandrien)
- [DJ Sets Playlist](https://soundcloud.com/sandrien/sets/dj-sets)
- [Website](https://www.dj-sandrien.nl/)
- [Resident Advisor](https://ra.co/dj/sandrien)
**Recommended listens:**
- [DJ Sets Playlist (SoundCloud)](https://soundcloud.com/sandrien/sets/dj-sets)
- [Boiler Room Amsterdam](https://boilerroom.tv/recording/sandrien/)
---
### Stephan Bodzin (live)
German producer and classically-trained pianist. Melodic and minimal techno with deep, emotionally-driven soundscapes. One of the biggest names in melodic techno. Performing a live set at Das Festival.
- [SoundCloud](https://soundcloud.com/stephanbodzin)
- [SoundCloud (Official)](https://soundcloud.com/stephanbodzinofficial)
**Recommended listens:**
- [Live at Piz Gloria (Swiss Alps) for Cercle](https://soundcloud.com/cerclelive/stephan-bodzin-piz-gloria-for-cercle)
- [Piz Gloria on Mixcloud](https://www.mixcloud.com/Cercle_interlinked/stephan-bodzin-piz-gloria-for-cercle/)
---
### Teyana
*Could not find a verified SoundCloud profile or detailed online presence for this artist. They may be an emerging or local talent in the Amsterdam scene. Check the [Komm Schon Alter website](https://www.kommschonalter.de/events/komm-schon-alter---das-festival-2026) closer to the festival for updated artist info.*

View File

@@ -29,6 +29,10 @@ When creating a Breeze profile, users provide:
- Photos (minimum 2 required) - Photos (minimum 2 required)
- Personal bio - Personal bio
- At least one Q&A prompt answer - At least one Q&A prompt answer
## Potenial changes
- Need more photos exspecially ones dressed nicly or in a suit.
- I need to show that i am looking for a bit of chaos, i am to good add buiulding routine.
## Q&A Prompts List ## Q&A Prompts List

View File

@@ -0,0 +1,146 @@
# QLS-1 Server Crash Analysis - 2026-03-04
## Server Specs
- **Instance:** AWS EC2 (aarch64)
- **CPUs:** 4
- **RAM:** 15.4 GB
- **Swap:** 1 GB
- **OS:** Ubuntu 22.04, kernel 6.8.0-1029-aws
## Summary
The server ran out of memory during a deployment and became completely unresponsive, requiring a reboot around 09:55 UTC. A deployment (unzip + node build) pushed an already critically overloaded system over the edge.
However, the real problem is that a single-site server with a few background processes should not be consuming 14 GB of RAM during normal operation. The deployment was the trigger, but not the underlying cause. Memory usage needs to be profiled and reduced.
## Timeline (UTC)
| Time | Event |
|---|---|
| 00:00 - 09:36 | Normal operation. Memory already dangerously tight: ~14 GB used, ~700 MB free, swap fully used (1024 MB). |
| **09:37** | Memory pressure intensifies. Used = 14758 MB, free = 291 MB. Cache shrinking. |
| **09:39** | `sessionclean` cron + `find`/`sed` spawn 59 processes each. Used = 15168 MB, free = **180 MB**. |
| **09:41** | **Deployment starts:** 233 `unzip` + 233 `rm` processes appear. Free = **119 MB**. |
| **09:42** | Cache evicted (172 MB), buffers = 9 MB. **1,181 allocation stalls.** Page scanning = 886,726. |
| **09:43** | `node`/`esbuild` build starts. **Redis forks for persistence.** D-state jumps to **121**. Alloc stalls = **4.4 million**. System grinding to a halt. |
| **09:44 - 09:54** | **Death spiral.** Free ~120 MB, cache = 0, buffers = 0. D-state peaks at **196**. Alloc stalls ~20 million/min. Cron jobs pile up (15 to 45). System frozen. |
| **09:55** | **Reboot.** Used drops to 262 MB, free = 15,251 MB. Swap = 0. |
| 09:56+ | Services restart. Normal operation resumes. |
## Key Numbers at Crash Point (09:43)
- **RAM:** 15,525 / 15,768 MB used (98.5%)
- **Swap:** 1024 / 1024 MB used (100%)
- **Page cache:** 112 MB (down from ~2 GB)
- **Buffers:** 0 MB
- **D-state processes:** 121 (normally ~60)
- **Alloc stalls:** 4.4 million / minute
## The Actual Problem: Per-Process Memory Breakdown
The deployment was the straw that broke the camel's back. The real issue is baseline memory consumption. This server hosts a single site with a few background processes, yet it was consuming ~14 GB of 15.4 GB available during normal operation with swap completely exhausted.
The atop log contains per-process resident memory (RSS) data. Here is what was running:
### Memory by process group at 09:30 UTC (normal operation, pre-crash)
| Process | Count | Threads | Total RSS | Total PSS | Swap | Notes |
|---|---|---|---|---|---|---|
| **redis-server** | 1 | 7 | **28,398 MB** | 28,390 MB | 448 MB | Single instance using 28 GB RSS |
| **php8.4** (CLI) | 27 | 27 | **12,835 MB** | 10,798 MB | 534 MB | Queue workers / artisan commands |
| mysqld | 1 | 55 | 8,096 MB* | ~1,500 MB | 2,551 MB | *RSS inflated by mmap'd InnoDB files |
| **php-fpm8.4** | 10 | 10 | 2,153 MB | 567 MB | 0 MB | FPM pool (PSS=567 MB shared) |
| **php** (CLI) | 1 | 1 | 1,756 MB | 1,638 MB | 0 MB | Single CLI process |
| **php-fpm8.3** | 15 | 15 | 131 MB | 5 MB | 489 MB | Old pool, mostly swapped out |
| **php-fpm8.2** | 7 | 7 | 69 MB | 11 MB | 221 MB | Old pool, mostly swapped out |
| nginx | 5 | 5 | 205 MB | 63 MB | 6 MB | |
| supervisord | 1 | 1 | 50 MB | 44 MB | 41 MB | |
| snapd | 1 | 12 | 79 MB | 78 MB | 8 MB | |
| amazon-ssm-agent | 1 | 11 | 46 MB | 46 MB | 4 MB | |
| squid | 2 | 2 | 43 MB | 21 MB | 46 MB | |
| meilisearch | 1 | 13 | 39 MB | 33 MB | 27 MB | |
| Everything else | ~55 | - | ~300 MB | - | - | |
**Note on RSS vs PSS:** RSS counts shared memory and memory-mapped files in every process that maps them, leading to overcounting. PSS (Proportional Set Size) divides shared pages among users. For PHP-FPM workers, PSS is much lower because workers share the same code pages. For MySQL, RSS is heavily inflated by memory-mapped InnoDB data files that are backed by disk -- actual private memory usage is ~1.5 GB (8%), not the 8 GB RSS reported by atop.
### The three big offenders
#### 1. Redis: 28 GB RSS (PID 781977)
This is by far the largest consumer. A single redis-server process with 28 GB RSS on a 15.4 GB server means it has a working set far larger than physical RAM. The kernel is constantly swapping redis pages in and out, contributing to I/O pressure and the high D-state count even during normal operation (~60 D-state processes at all times).
This needs immediate investigation:
- What is stored in Redis? Is it being used as a primary data store instead of a cache?
- What is `maxmemory` set to? If unset, Redis will grow without limit.
- What eviction policy is configured? (`maxmemory-policy`)
- Is `save` / RDB persistence enabled? Forking for persistence doubles memory briefly.
#### 2. PHP 8.4 CLI workers: 27 processes, 10.8 GB PSS
These are likely Laravel Horizon / queue workers. Individual workers range from 220 MB to 2,867 MB RSS. Two processes stand out:
- PID 165508 (php8.4): 2,867 MB RSS at 09:30, growing to 4,584 MB by 09:41 - a clear memory leak
- PID 165699 (php): 1,756 MB RSS at 09:30, growing to 4,569 MB by 09:43 - same pattern
These workers appear to have memory leaks. They should be configured to restart after processing N jobs (`--max-jobs`) or after exceeding a memory limit (`--memory`).
#### 3. MySQL: ~1.5 GB actual usage
The 8 GB RSS reported by atop is misleading -- it includes memory-mapped InnoDB data files backed by disk. Actual private memory usage is ~1.5 GB (8% of RAM as seen in `top`). MySQL is not a significant contributor to this crash.
### Memory progression leading to crash
| Time | Redis RSS | PHP8.4 CLI RSS | MySQL RSS | Free RAM | Event |
|---|---|---|---|---|---|
| 09:30 | 28,398 MB | 12,835 MB | 8,096 MB | 766 MB | Normal |
| 09:38 | 28,514 MB | 14,648 MB | 8,082 MB | 291 MB | PHP workers growing |
| 09:41 | 28,573 MB | 15,279 MB | 8,077 MB | 119 MB | Deployment starts |
| 09:43 | 57,464 MB* | 12,701 MB | 8,030 MB | 129 MB | Redis forked, system dead |
*At 09:43, a second redis-server process appeared (PID 173622, 28,861 MB RSS). This is Redis forking for BGSAVE/BGREWRITEAOF (RDB/AOF persistence). On a system with no free memory, forking a 28 GB process is fatal because of copy-on-write page faults causing massive memory demand.
**This is the kill shot: Redis persistence fork on an already OOM system.**
## Immediate Actions
### Priority 1: Redis (the root cause of the memory crisis)
1. **Set `maxmemory`** to a reasonable limit (e.g., 2-4 GB). If Redis holds more data than that, it needs to be moved to a dedicated instance or the data model needs rethinking.
2. **Set `maxmemory-policy allkeys-lru`** to enable eviction.
3. **Disable or schedule RDB persistence** (`save ""`) to prevent the fork that killed the server. If persistence is needed, use AOF with `aof-use-rdb-preamble yes` and schedule `BGREWRITEAOF` during low-traffic windows.
4. **Audit what is stored in Redis.** Run `redis-cli --bigkeys` and `redis-cli INFO memory` to understand what is consuming 28 GB.
### Priority 2: PHP CLI workers (memory leaks)
1. **Add `--max-jobs=500` and `--memory=256`** to queue worker commands to force periodic restarts.
2. **Investigate PIDs 165508 and 165699** specifically. These grew from ~2-3 GB to ~4.5 GB over 13 minutes. That rate of growth suggests either a leak or processing abnormally large jobs.
3. **Reduce worker count.** 27 CLI processes is excessive if they each consume 300-500 MB. Start with 5-8 workers and measure throughput.
### Priority 3: MySQL (low priority)
MySQL actual memory usage is ~1.5 GB, not the 8 GB RSS reported by atop. Not a significant contributor to this crash. No action needed unless memory remains tight after fixing Redis and PHP workers.
### Priority 4: Clean up legacy PHP pools
- **php-fpm8.3** (15 workers, 489 MB swap) and **php-fpm8.2** (7 workers, 221 MB swap) are almost entirely swapped out, meaning they are not actively used but still consuming swap space and incurring I/O when occasionally touched. Remove them if no sites use those versions.
## Deployment Hardening
Even after fixing the baseline, deployments should not be able to crash the server:
1. Serialize unzip/rm operations instead of 233 parallel processes.
2. Cap node build memory with `NODE_OPTIONS=--max-old-space-size=512`.
3. Add a pre-deploy memory check: abort if free memory is below a threshold.
4. Protect critical services with `OOMScoreAdjust=-900` in their systemd units.
5. **Disable Redis persistence during deployments** or ensure `BGSAVE` cannot trigger concurrently.
## Longer Term
- **Redis belongs on a separate instance** (or use ElastiCache) if it genuinely needs 28 GB. Running it on the same 15 GB server as MySQL and PHP is fundamentally unsound.
- Increasing swap from 1 GB to 2-4 GB buys time but does not fix the root cause.
- Upgrading to a larger instance is treating the symptom. The workload should fit comfortably in 16 GB with proper limits on Redis and MySQL.
- Set up memory monitoring and alerting (CloudWatch, Datadog, etc.) so this does not go unnoticed until it crashes.
## Data Source
Analysis performed by parsing the binary atop log file `atop_20260304` using Python + atoparser. The file covers 00:00:02 - 09:58:04 UTC with ~1 minute sampling intervals (599 records). Both system-level (memory, CPU, disk) and per-process (RSS, PSS, swap, state) data was extracted.

View File

@@ -0,0 +1,188 @@
# Redis Cheatsheet
## Memory & Diagnostics
```bash
# Overall memory stats
redis-cli INFO memory
# Human-readable used memory
redis-cli INFO memory | grep used_memory_human
# Total number of keys
redis-cli DBSIZE
# Memory usage of a specific key (in bytes)
redis-cli MEMORY USAGE "some:key"
# Find biggest keys per type (safe, non-blocking)
redis-cli --bigkeys
# Top 30 keys by memory usage (scans first 500 keys)
redis-cli --scan --pattern "*" | head -500 | while read key; do
bytes=$(redis-cli MEMORY USAGE "$key" 2>/dev/null)
echo "$bytes $key"
done | sort -rn | head -30
# Full scan (slow on large datasets)
redis-cli --scan | while read key; do
bytes=$(redis-cli MEMORY USAGE "$key" 2>/dev/null)
echo "$bytes $key"
done | sort -rn | head -50
# Memory doctor -- quick health check
redis-cli MEMORY DOCTOR
```
## Key Inspection
```bash
# Count keys matching a pattern
redis-cli --scan --pattern "cache:*" | wc -l
redis-cli --scan --pattern "horizon:*" | wc -l
redis-cli --scan --pattern "queues:*" | wc -l
# Check key type
redis-cli TYPE "some:key"
# Check TTL (-1 = no expiry, -2 = key doesn't exist)
redis-cli TTL "some:key"
# Find keys with no expiry (sample first 100)
redis-cli --scan --pattern "*" | head -100 | while read key; do
ttl=$(redis-cli TTL "$key")
if [ "$ttl" = "-1" ]; then echo "NO EXPIRY: $key ($(redis-cli MEMORY USAGE "$key") bytes)"; fi
done
# List all key prefixes and their counts
redis-cli --scan | sed 's/:[^:]*$//' | sort | uniq -c | sort -rn | head -30
```
## Streams
```bash
# Stream length
redis-cli XLEN "stream:key"
# Stream info (memory, first/last entry, etc.)
redis-cli XINFO STREAM "stream:key"
# Trim stream to max N entries
redis-cli XTRIM "stream:key" MAXLEN 10000
# Delete a stream entirely
redis-cli DEL "stream:key"
# Read last 5 entries
redis-cli XREVRANGE "stream:key" + - COUNT 5
```
## Hashes, Lists, Sets, Sorted Sets
```bash
# Hash: field count and sample fields
redis-cli HLEN "hash:key"
redis-cli HSCAN "hash:key" 0 COUNT 10
# List: length and sample
redis-cli LLEN "list:key"
redis-cli LRANGE "list:key" 0 9
# Set: member count and sample
redis-cli SCARD "set:key"
redis-cli SSCAN "set:key" 0 COUNT 10
# Sorted set: member count and top 10 by score
redis-cli ZCARD "zset:key"
redis-cli ZREVRANGE "zset:key" 0 9 WITHSCORES
```
## Memory Limits & Eviction
```bash
# Set memory limit (runtime, no restart)
redis-cli CONFIG SET maxmemory 2gb
# Set eviction policy
redis-cli CONFIG SET maxmemory-policy volatile-lru
# Persist config changes to redis.conf
redis-cli CONFIG REWRITE
# Check current settings
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy
redis-cli CONFIG GET save
```
### Eviction policies
| Policy | Behavior |
|---|---|
| `noeviction` | Refuse writes when full (default -- dangerous) |
| `volatile-lru` | Evict LRU keys that have a TTL set |
| `allkeys-lru` | Evict any LRU key |
| `volatile-ttl` | Evict keys with shortest TTL first |
| `volatile-random` | Evict random keys that have a TTL |
| `allkeys-random` | Evict any random key |
## Persistence
```bash
# Disable RDB snapshots (prevents fork that doubles memory)
redis-cli CONFIG SET save ""
# Trigger manual save (blocks until done)
redis-cli SAVE
# Trigger background save (forks -- dangerous if low memory)
redis-cli BGSAVE
# Check last save time
redis-cli LASTSAVE
# Check if background save is in progress
redis-cli INFO persistence | grep rdb_bgsave_in_progress
```
## Bulk Operations
```bash
# Delete all keys matching a pattern (use with care)
redis-cli --scan --pattern "prefix:*" | xargs -L 100 redis-cli DEL
# Count + size of keys matching a pattern
redis-cli --scan --pattern "horizon:*" | while read key; do
redis-cli MEMORY USAGE "$key"
done | awk '{s+=$1} END {printf "Total: %.2f MB\n", s/1024/1024}'
# Flush current database (DESTRUCTIVE)
redis-cli FLUSHDB
# Flush all databases (DESTRUCTIVE)
redis-cli FLUSHALL
```
## Monitoring
```bash
# Watch commands in real time (Ctrl+C to stop)
redis-cli MONITOR
# Slow log -- queries that took longer than threshold
redis-cli SLOWLOG GET 10
# Connected clients
redis-cli INFO clients | grep connected_clients
# Stats since startup
redis-cli INFO stats
```
## Config File Locations
```
/etc/redis/redis.conf # Debian/Ubuntu default
/etc/redis.conf # RHEL/CentOS
/etc/redis/6379.conf # Multi-instance setups
```

BIN
atop_20260304 Normal file

Binary file not shown.