Compare commits
11 Commits
74dd354545
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c9371946e | ||
|
|
4968005873 | ||
|
|
756ce27740 | ||
|
|
d95434202f | ||
| 9099659f84 | |||
| 923c1a63f9 | |||
|
|
caca5624a3 | ||
|
|
f22f9e02d5 | ||
|
|
179f648d5d | ||
| 680836b6ad | |||
|
|
f98d528f1c |
@@ -4,4 +4,5 @@ https://github.com/malikad778/Laravel-migration-guard
|
||||
|
||||
https://www.calebleak.com/posts/dog-game/
|
||||
|
||||
https://blog.sshh.io/p/how-i-use-every-claude-code-feature
|
||||
https://blog.sshh.io/p/how-i-use-every-claude-code-feature
|
||||
https://pudding.cool/2026/02/happy-map/
|
||||
|
||||
3
2026-02-26.md
Normal file
3
2026-02-26.md
Normal file
@@ -0,0 +1,3 @@
|
||||
https://skills.laravel.cloud/skills/laravel-tdd
|
||||
|
||||
https://github.com/harris21/laravel-fuse
|
||||
1
2026-02-27.md
Normal file
1
2026-02-27.md
Normal file
@@ -0,0 +1 @@
|
||||
https://406.fail/
|
||||
4
2026-03-16.md
Normal file
4
2026-03-16.md
Normal file
@@ -0,0 +1,4 @@
|
||||
https://laravel-news.com/the-hidden-cost-of-mysql-defaults-in-laravel-apps
|
||||
|
||||
https://releem.com/blog/web-applications-performance#rec528181090
|
||||
https://releem.com/pricing
|
||||
9
Backlog.md
Normal file
9
Backlog.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Backlog
|
||||
|
||||
Tasks and to-dos that need attention when time allows.
|
||||
|
||||
---
|
||||
|
||||
- [ ] Switch Jane to Opus 4.6 (claude-opus-4-6) in config
|
||||
- [ ] Fix typing indicator to keep running during multi-message responses (currently stops after first message)
|
||||
- [ ] Lightweight watcher system: let Jane write small code snippets (curl + diff) that run cheaply on a cron. Only wake the full AI model if the check returns something interesting. Two-tier: cheap watcher → full agent on trigger.
|
||||
0
Bathroom Blueprint.svg.md
Normal file
0
Bathroom Blueprint.svg.md
Normal file
6
Knee.md
6
Knee.md
@@ -1,2 +1,6 @@
|
||||
On the first of May, I fell while climbing over something and slipping, landing with my full weight just below my knee. Initially, it was painful but not more than you would expect, considering the circumstances. The swelling was less than I expected. I even finished my run and when on a run on the 5th.
|
||||
However, the pain didn't disappear, so I stopped running and playing padel. I did continue with my strength training, although at a much lower weight when training my legs. On the 23rd of June (after about 7 weeks), I asked my doctor about it, and he told me to rest and take a non-steroidal anti-inflammatory drug for at least the next two weeks.
|
||||
However, the pain didn't disappear, so I stopped running and playing padel. I did continue with my strength training, although at a much lower weight when training my legs. On the 23rd of June (after about 7 weeks), I asked my doctor about it, and he told me to rest and take a non-steroidal anti-inflammatory drug for at least the next two weeks.
|
||||
|
||||
---
|
||||
|
||||
Around Wednesday 11 March 2026, both knees started hurting again. On 13 March, a run was cut short after about 100 meters due to persistent aching. Likely overuse, unrelated to the previous injury.
|
||||
@@ -0,0 +1 @@
|
||||
[New management asked me to use a no-code platform instead of our normal workflow to increase our speed : r/ExperiencedDevs](https://www.reddit.com/r/ExperiencedDevs/comments/1rcy0lr/new_management_asked_me_to_use_a_nocode_platform/)
|
||||
@@ -0,0 +1 @@
|
||||
[New management asked me to use a no-code platform instead of our normal workflow to increase our speed : r/ExperiencedDevs](https://www.reddit.com/r/ExperiencedDevs/comments/1rcy0lr/new_management_asked_me_to_use_a_nocode_platform/)
|
||||
BIN
Personal/Areas/Home improvement/Bathroom Blueprint copy.png
Normal file
BIN
Personal/Areas/Home improvement/Bathroom Blueprint copy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 494 KiB |
@@ -115,7 +115,7 @@
|
||||
<circle cx="40" cy="1675" r="30" fill="none" stroke="#4a90d9" stroke-width="7" />
|
||||
<circle cx="40" cy="1675" r="10" fill="#4a90d9" />
|
||||
<!-- Drain -->
|
||||
<circle cx="425" cy="875" r="25" fill="none" stroke="#999" stroke-width="5" />
|
||||
<!-- <circle cx="425" cy="875" r="25" fill="none" stroke="#999" stroke-width="5" /> -->
|
||||
<g transform="translate(425, 1675) scale(1,-1)">
|
||||
<text text-anchor="middle" dominant-baseline="central" font-size="45" fill="#666">Bath</text>
|
||||
</g>
|
||||
@@ -127,7 +127,8 @@
|
||||
<rect x="25" y="620" width="120" height="110" rx="8" fill="#aaa" fill-opacity="0.2"
|
||||
stroke="#999" stroke-width="4" stroke-dasharray="10,6" />
|
||||
<g transform="translate(200, 675) scale(1,-1)">
|
||||
<text text-anchor="start" dominant-baseline="central" font-size="30" fill="#999">TISKEN baskets</text>
|
||||
<text text-anchor="start" dominant-baseline="central" font-size="30" fill="#999">TISKEN
|
||||
baskets</text>
|
||||
</g>
|
||||
|
||||
<!-- Shower: nook, x=1500-2500, y=1600-2600 -->
|
||||
@@ -137,9 +138,9 @@
|
||||
<circle cx="2475" cy="2100" r="60" fill="none" stroke="#4a90d9" stroke-width="7" />
|
||||
<circle cx="2475" cy="2100" r="20" fill="#4a90d9" />
|
||||
<!-- Drain -->
|
||||
<circle cx="2000" cy="2100" r="35" fill="none" stroke="#999" stroke-width="5" />
|
||||
<line x1="1980" y1="2100" x2="2020" y2="2100" stroke="#999" stroke-width="5" />
|
||||
<line x1="2000" y1="2080" x2="2000" y2="2120" stroke="#999" stroke-width="5" />
|
||||
<!-- <circle cx="2000" cy="2100" r="35" fill="none" stroke="#999" stroke-width="5" /> -->
|
||||
<!-- <line x1="1980" y1="2100" x2="2020" y2="2100" stroke="#999" stroke-width="5" /> -->
|
||||
<!-- <line x1="2000" y1="2080" x2="2000" y2="2120" stroke="#999" stroke-width="5" /> -->
|
||||
<g transform="translate(2000, 2200) scale(1,-1)">
|
||||
<text text-anchor="middle" dominant-baseline="central" font-size="45" fill="#4a90d9">Shower</text>
|
||||
</g>
|
||||
@@ -163,30 +164,35 @@
|
||||
</g>
|
||||
|
||||
<!-- Mirror light: 560mm, 60mm from wall E, on wall F above sink -->
|
||||
<rect x="25" y="60" width="80" height="560" rx="10" fill="none" stroke="#f5a623" stroke-width="5"/>
|
||||
<rect x="25" y="60" width="80" height="560" rx="10" fill="none" stroke="#f5a623"
|
||||
stroke-width="5" />
|
||||
<g transform="translate(160, 340) scale(1,-1)">
|
||||
<text text-anchor="start" dominant-baseline="central" font-size="30" fill="#f5a623">Mirror 560mm</text>
|
||||
<text text-anchor="start" dominant-baseline="central" font-size="30" fill="#f5a623">Mirror
|
||||
560mm</text>
|
||||
</g>
|
||||
|
||||
<!-- Shelf: wall A, 800mm long, 250mm deep, 500mm from wall F -->
|
||||
<rect x="500" y="calc(2600 - 250)" width="800" height="250" fill="#c8b896" fill-opacity="0.3"
|
||||
stroke="#999" stroke-width="5" />
|
||||
<g transform="translate(900, 2475) scale(1,-1)">
|
||||
<text text-anchor="middle" dominant-baseline="central" font-size="35" fill="#666">Shelf 800x250</text>
|
||||
<text text-anchor="middle" dominant-baseline="central" font-size="35" fill="#666">Shelf
|
||||
800x250</text>
|
||||
</g>
|
||||
|
||||
<!-- Ceiling light: 1100 from wall F, 700 from wall A → (1100, 2600-700) = (1100, 1900), r=210 -->
|
||||
<circle cx="1100" cy="1900" r="210" fill="none" stroke="#f5a623" stroke-width="6"/>
|
||||
<line x1="1070" y1="1900" x2="1130" y2="1900" stroke="#f5a623" stroke-width="4"/>
|
||||
<line x1="1100" y1="1870" x2="1100" y2="1930" stroke="#f5a623" stroke-width="4"/>
|
||||
<circle cx="1100" cy="1900" r="210" fill="none" stroke="#f5a623" stroke-width="6" />
|
||||
<line x1="1070" y1="1900" x2="1130" y2="1900" stroke="#f5a623" stroke-width="4" />
|
||||
<line x1="1100" y1="1870" x2="1100" y2="1930" stroke="#f5a623" stroke-width="4" />
|
||||
<g transform="translate(1100, 1830) scale(1,-1)">
|
||||
<text text-anchor="middle" dominant-baseline="central" font-size="35" fill="#f5a623">Light (420mm)</text>
|
||||
<text text-anchor="middle" dominant-baseline="central" font-size="35" fill="#f5a623">Light
|
||||
(420mm)</text>
|
||||
</g>
|
||||
|
||||
<!-- Vent: on wall D, 200mm wide, 750mm from wall E -->
|
||||
<rect x="1400" y="750" width="100" height="200" fill="none" stroke="#888" stroke-width="5" stroke-dasharray="15,8"/>
|
||||
<line x1="1400" y1="750" x2="1500" y2="950" stroke="#888" stroke-width="3"/>
|
||||
<line x1="1500" y1="750" x2="1400" y2="950" stroke="#888" stroke-width="3"/>
|
||||
<rect x="1400" y="750" width="100" height="200" fill="none" stroke="#888" stroke-width="5"
|
||||
stroke-dasharray="15,8" />
|
||||
<line x1="1400" y1="750" x2="1500" y2="950" stroke="#888" stroke-width="3" />
|
||||
<line x1="1500" y1="750" x2="1400" y2="950" stroke="#888" stroke-width="3" />
|
||||
<g transform="translate(1350, 850) scale(1,-1)">
|
||||
<text text-anchor="end" dominant-baseline="central" font-size="35" fill="#888">Vent</text>
|
||||
</g>
|
||||
@@ -252,7 +258,8 @@
|
||||
<text x="100" y="315" font-size="40" fill="#555">Door</text>
|
||||
<circle cx="40" cy="360" r="18" fill="none" stroke="#f5a623" stroke-width="4" />
|
||||
<text x="100" y="375" font-size="40" fill="#555">Light</text>
|
||||
<rect x="15" y="405" width="50" height="50" fill="none" stroke="#888" stroke-width="3" stroke-dasharray="8,5" />
|
||||
<rect x="15" y="405" width="50" height="50" fill="none" stroke="#888" stroke-width="3"
|
||||
stroke-dasharray="8,5" />
|
||||
<line x1="15" y1="405" x2="65" y2="455" stroke="#888" stroke-width="2" />
|
||||
<line x1="65" y1="405" x2="15" y2="455" stroke="#888" stroke-width="2" />
|
||||
<text x="100" y="440" font-size="40" fill="#555">Vent</text>
|
||||
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,91 @@
|
||||
---
|
||||
created: 2026-03-15
|
||||
updated: 2026-03-15
|
||||
status: planned
|
||||
---
|
||||
# Migration: TrueNAS to Ubuntu + Coolify
|
||||
|
||||
## Motivation
|
||||
|
||||
- TrueNAS is storage-first OS; not ideal for general-purpose app hosting and experimentation
|
||||
- Server idles 99% of the time — underutilized capacity
|
||||
- Coolify provides one-click app installs and git-push deploys (useful as a Laravel developer)
|
||||
- Current setup makes experimenting with new apps slow (e.g., OpenClaw took 3-4 hours)
|
||||
|
||||
## Current Setup
|
||||
|
||||
- **OS:** TrueNAS Scale (Debian-based) on NVMe SSD (`nvme0n1`)
|
||||
- **Storage:** ZFS stripe pool `tank` on two separate disks (~29T total, ~14.8T used)
|
||||
- **Services:** Traefik, Gitea, Servarr stack (Gluetun/ProtonVPN, qBittorrent, Sonarr, Radarr, Lidarr, Prowlarr, Bazarr, Recyclarr), CrowdSec, Dozzle, Watchtower
|
||||
- **Paths:** Stacks at `/mnt/tank/stacks/`, configs at `/mnt/tank/configs/`, media at `/mnt/tank/media/`
|
||||
|
||||
## Target Setup
|
||||
|
||||
- **OS:** Ubuntu Server on NVMe SSD
|
||||
- **Storage:** Same ZFS stripe pool `tank`, imported as-is
|
||||
- **Management:** Coolify for app deployment and management
|
||||
- **Services:** Same as before, plus easy deployment of new apps and Laravel projects
|
||||
|
||||
## Migration Plan
|
||||
|
||||
### Before Wiping TrueNAS
|
||||
|
||||
1. **Document network config** — static IP, DNS settings, hostname, router port forwards
|
||||
2. **Back up compose files and configs** — copy `/mnt/tank/stacks/` and `/mnt/tank/configs/` to USB stick or laptop (they're on the ZFS pool and will survive, but be safe)
|
||||
3. **Export the ZFS pool cleanly:**
|
||||
```bash
|
||||
zpool export tank
|
||||
```
|
||||
4. **Note disk identifiers** for the pool (already known from `zpool status`)
|
||||
|
||||
### Install Ubuntu
|
||||
|
||||
5. **Install Ubuntu Server** on the NVMe SSD (wipes TrueNAS)
|
||||
6. **Set up networking** — replicate static IP, hostname, DNS
|
||||
|
||||
### Restore Storage
|
||||
|
||||
7. **Install ZFS support:**
|
||||
```bash
|
||||
sudo apt install zfsutils-linux
|
||||
```
|
||||
8. **Import the pool** at the same mount point:
|
||||
```bash
|
||||
sudo zpool import -d /dev/disk/by-id tank
|
||||
```
|
||||
Pool should appear at `/tank` — if paths need to match old config, set the mountpoint:
|
||||
```bash
|
||||
sudo zfs set mountpoint=/mnt/tank tank
|
||||
```
|
||||
9. **Verify data integrity:**
|
||||
```bash
|
||||
zpool status tank
|
||||
zpool scrub tank
|
||||
```
|
||||
|
||||
### Install Coolify
|
||||
|
||||
10. **Install Coolify** (one-liner from their docs)
|
||||
11. **Decide on reverse proxy strategy:**
|
||||
- Option A: Use Coolify's built-in Traefik — simplest, let Coolify manage SSL and routing
|
||||
- Option B: Keep existing Traefik + CrowdSec config — more control, but manage it outside Coolify
|
||||
- Do NOT run both on port 443 simultaneously
|
||||
12. **Re-deploy services** via Coolify using existing Docker Compose files from `/mnt/tank/stacks/`
|
||||
|
||||
### Post-Migration
|
||||
|
||||
13. **Verify Servarr stack** — confirm VPN routing through Gluetun works
|
||||
14. **Verify Gitea** — confirm repos are accessible
|
||||
15. **Set up disk monitoring:**
|
||||
```bash
|
||||
sudo apt install smartmontools
|
||||
```
|
||||
16. **Set up ZFS scrub cron** (Ubuntu may set this up automatically, verify)
|
||||
17. **Test deploying a Laravel project** via git push to confirm Coolify workflow
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **Mount point must match** — Docker Compose files reference `/mnt/tank/...` paths
|
||||
- **Coolify has its own Traefik** — conflicts with existing Traefik if both claim port 443
|
||||
- **ZFS pool must be exported cleanly** before wiping TrueNAS, otherwise force-import is needed
|
||||
- **Servarr stack VPN routing** through Gluetun may need network config adjustments in Coolify's Docker environment
|
||||
@@ -0,0 +1 @@
|
||||
[Tomorrow I have a 1:1, I'm burnt and I would like to know any way to drive an actual positive conversation. : r/ExperiencedDevs](https://www.reddit.com/r/ExperiencedDevs/comments/1rox7pg/tomorrow_i_have_a_11_im_burnt_and_i_would_like_to/)
|
||||
Reference in New Issue
Block a user