This commit is contained in:
traveler 2026-04-12 16:06:16 -05:00
parent bb997e2fa7
commit 0f82f39fdd
25 changed files with 577 additions and 123 deletions

View file

@ -46,7 +46,7 @@ Data lives at `/data/nfs/Baxter/Green/` with two libraries: Clips and Movies.
PocketStash (port 9998) is a separate Stash instance that maintains a curated subset for travel. Before a trip, `syncoid` pushes `vault/Green/Pocket` to the Pocket Grimoire laptop. The Pocket instance runs in read-only travel mode — no writes while traveling.
See [Stash Integration](/Pocket-Grimoire/Software/Stash-Integration) in Pocket Grimoire docs.
See [Stash Integration](/Netgrimoire/Pocket-Grimoire/Software/Stash-Integration) in Pocket Grimoire docs.
---
@ -54,5 +54,5 @@ See [Stash Integration](/Pocket-Grimoire/Software/Stash-Integration) in Pocket G
| | |
|---|---|
| [Stash Management](/Green-Grimoire/Library/Stash-Management) | Library config, scrapers, metadata workflow |
| [VHS Restoration](/Green-Grimoire/Scripts/VHS-Restoration) | Encoding, deinterlace, restoration scripts |
| [Stash Management](/Netgrimoire/Green-Grimoire/Library/Stash-Management) | Library config, scrapers, metadata workflow |
| [VHS Restoration](/Netgrimoire/Green-Grimoire/Scripts/VHS-Restoration) | Encoding, deinterlace, restoration scripts |

View file

@ -49,7 +49,7 @@ Gremlin is a stack of four services running together on `docker4`, all pinned to
| `qwen2.5-coder:7b` | ~5 GB | Code review, YAML audits, compose analysis |
| `llama3.2:3b` | ~2 GB | Alert triage, Q&A, summarization |
Models must be pulled before workflows run. See [Ollama Model Management](/Gremlin-Grimoire/Runbooks/Model-Management).
Models must be pulled before workflows run. See [Ollama Model Management](/Netgrimoire/Gremlin-Grimoire/Runbooks/Model-Management).
---
@ -57,9 +57,9 @@ Models must be pulled before workflows run. See [Ollama Model Management](/Greml
| | |
|---|---|
| [Stack](/Gremlin-Grimoire/Stack/Build-Config) | Full build config, volumes, env vars, compose YAML |
| [Workflows](/Gremlin-Grimoire/Workflows/Forgejo-Audit) | All n8n workflows — architecture, patterns, gotchas |
| [Runbooks](/Gremlin-Grimoire/Runbooks/Deploy) | Deploy, model management, troubleshooting |
| [Stack](/Netgrimoire/Gremlin-Grimoire/Stack/Build-Config) | Full build config, volumes, env vars, compose YAML |
| [Workflows](/Netgrimoire/Gremlin-Grimoire/Workflows/Forgejo-Audit) | All n8n workflows — architecture, patterns, gotchas |
| [Runbooks](/Netgrimoire/Gremlin-Grimoire/Runbooks/Deploy) | Deploy, model management, troubleshooting |
---

View file

@ -71,10 +71,10 @@ $config['imap_conn_options'] = ['ssl' => ['verify_peer' => false, 'verify_peer_n
## Related Docs
- [MXRoute Integration](/Keystone-Grimoire/Mail/MXRoute-Integration)
- [Domain Setup](/Keystone-Grimoire/Mail/Domain-Setup)
- [MailCow Hardening](/Keystone-Grimoire/Mail/Hardening)
- [MailCow Backup](/Vault-Grimoire/Backups/MailCow-Backup)
- [MXRoute Integration](/Netgrimoire/Keystone-Grimoire/Mail/MXRoute-Integration)
- [Domain Setup](/Netgrimoire/Keystone-Grimoire/Mail/Domain-Setup)
- [MailCow Hardening](/Netgrimoire/Keystone-Grimoire/Mail/Hardening)
- [MailCow Backup](/Netgrimoire/Vault-Grimoire/Backups/MailCow-Backup)
---

View file

@ -20,10 +20,10 @@ The Keystone Grimoire holds the architectural blueprints of Netgrimoire — how
| Section | Contents |
|---------|----------|
| [Hosts](/Keystone-Grimoire/Hosts/Host-Inventory) | Node inventory, roles, IPs, pinned services, hardware |
| [Network](/Keystone-Grimoire/Network/Topology) | Topology, VLANs, DNS, WireGuard, OpenVPN, port assignments |
| [Docker](/Keystone-Grimoire/Docker/Swarm-Template) | Swarm template standard, overlay network, label rules, volume paths |
| [Mail](/Keystone-Grimoire/Mail/MailCow-Overview) | MailCow, MXRoute, DKIM, SRS, domain setup, hardening |
| [Hosts](/Netgrimoire/Keystone-Grimoire/Hosts/Host-Inventory) | Node inventory, roles, IPs, pinned services, hardware |
| [Network](/Netgrimoire/Keystone-Grimoire/Network/Topology) | Topology, VLANs, DNS, WireGuard, OpenVPN, port assignments |
| [Docker](/Netgrimoire/Keystone-Grimoire/Docker/Swarm-Template) | Swarm template standard, overlay network, label rules, volume paths |
| [Mail](/Netgrimoire/Keystone-Grimoire/Mail/MailCow-Overview) | MailCow, MXRoute, DKIM, SRS, domain setup, hardening |
---

View file

@ -14,20 +14,7 @@ dateCreated: 2026-04-12T00:00:00.000Z
Netgrimoire is the primary self-hosted homelab infrastructure running on `znas` and a cluster of worker nodes under Docker Swarm. It is the foundation every other grimoire depends on.
This section is intentionally high-level — the spine. Detailed technical content lives in the specialized grimoires.
---
## Infrastructure at a Glance
| Host | Role | IP | Runtime |
|------|------|----|---------|
| znas | NAS + Primary Swarm manager | 192.168.5.10 | Docker Swarm manager + Compose |
| docker2 | VPN gateway | — | Docker Compose |
| docker3 | LibreNMS host | — | Docker Compose |
| docker4 (hermes) | Mail + AI worker | 192.168.5.16 | Docker Compose + Swarm worker |
| docker5 | Media host | 192.168.5.18 | Docker Compose |
| Pi nodes | Swarm workers + vault nodes | various | Docker Swarm workers |
This section is the spine — intentionally high-level. All detailed technical content lives in the specialized grimoires nested here.
---
@ -35,14 +22,27 @@ This section is intentionally high-level — the spine. Detailed technical conte
| Grimoire | What Lives There |
|----------|-----------------|
| [Keystone Grimoire](/Keystone-Grimoire/Overview) | Architecture, network topology, Caddy, Docker template, DNS, mail infrastructure |
| [Vault Grimoire](/Vault-Grimoire/Overview) | ZFS storage, Kopia backups, NFS exports, offsite replication |
| [Ward Grimoire](/Ward-Grimoire/Overview) | OPNsense, CrowdSec, Authentik, Authelia, LLDAP, WireGuard, blocklists |
| [Watch Grimoire](/Watch-Grimoire/Overview) | Uptime Kuma, Beszel, LibreNMS, Grafana, Graylog, ntfy, DIUN |
| [Gremlin Grimoire](/Gremlin-Grimoire/Overview) | Ollama, Open WebUI, Qdrant, n8n, AI workflows |
| [Shadow Grimoire](/Shadow-Grimoire/Overview) | Usenet, torrents, arr stack, indexers, media acquisition |
| [Green Grimoire](/Green-Grimoire/Overview) | Adult media: Stash, Jellyfinx, Namer, Whisparr |
| [Pocket Grimoire](/Pocket-Grimoire/Overview) | Portable laptop lab, offline-first, travel vault node |
| [Keystone Grimoire](/Netgrimoire/Keystone-Grimoire/Overview) | Architecture, network topology, Caddy, Docker template, DNS, mail |
| [Vault Grimoire](/Netgrimoire/Vault-Grimoire/Overview) | ZFS storage, Kopia backups, NFS exports, offsite replication |
| [Ward Grimoire](/Netgrimoire/Ward-Grimoire/Overview) | OPNsense, CrowdSec, Authentik, Authelia, LLDAP, WireGuard, blocklists |
| [Watch Grimoire](/Netgrimoire/Watch-Grimoire/Overview) | Uptime Kuma, Beszel, LibreNMS, Grafana, Graylog, ntfy, DIUN |
| [Gremlin Grimoire](/Netgrimoire/Gremlin-Grimoire/Overview) | Ollama, Open WebUI, Qdrant, n8n, AI workflows |
| [Shadow Grimoire](/Netgrimoire/Shadow-Grimoire/Overview) | Usenet, torrents, arr stack, indexers, media acquisition |
| [Green Grimoire](/Netgrimoire/Green-Grimoire/Overview) | Adult media: Stash, Jellyfinx, Namer, Whisparr |
| [Pocket Grimoire](/Netgrimoire/Pocket-Grimoire/Overview) | Portable laptop lab, offline-first, travel vault node |
---
## Infrastructure at a Glance
| Host | Role | IP | Runtime |
|------|------|----|---------|
| znas | NAS + Primary Swarm manager | 192.168.5.10 | Swarm manager + Compose |
| docker2 | VPN gateway | — | Compose only |
| docker3 | LibreNMS | — | Compose only |
| docker4 (hermes) | Mail + AI worker | 192.168.5.16 | Compose + Swarm worker |
| docker5 | Media host | 192.168.5.18 | Compose only |
| Pi nodes | Swarm workers + vault nodes | various | Swarm workers |
---
@ -57,7 +57,7 @@ This section is intentionally high-level — the spine. Detailed technical conte
| | |
|---|---|
| 📋 [Service Catalog](/Netgrimoire/Service-Catalog) | Full service inventory with status and grimoire assignment |
| 📖 [Documentation Standards](/Netgrimoire/Conventions/Doc-Standards) | How docs are structured, named, and maintained |
| 📄 [Service Doc Template](/Netgrimoire/Conventions/Service-Doc-Template) | Template for writing new service docs |
| 📖 [Doc Standards](/Netgrimoire/Conventions/Doc-Standards) | How docs are structured, named, and maintained |
| 📄 [Service Doc Template](/Netgrimoire/Conventions/Service-Doc-Template) | Template for new service docs |
| 🎨 [Wiki Theme](/Netgrimoire/Conventions/Theme) | CSS customization and branding |
| 🔍 [Audit Reports](/Netgrimoire/Audits/README) | Gremlin-generated weekly YAML audits |

View file

@ -51,7 +51,7 @@ Pocket Grimoire receives a `syncoid` push from `znas` before each trip:
syncoid znas:vault/Green/Pocket pocket:/srv/greenpg/Green
```
This makes it an offsite encrypted backup node whenever it leaves home. See [Vault Architecture](/Vault-Grimoire/Offsite/Vault-Architecture).
This makes it an offsite encrypted backup node whenever it leaves home. See [Vault Architecture](/Netgrimoire/Vault-Grimoire/Offsite/Vault-Architecture).
---
@ -59,6 +59,6 @@ This makes it an offsite encrypted backup node whenever it leaves home. See [Vau
| | |
|---|---|
| [Hardware](/Pocket-Grimoire/Hardware/Inventory) | Full hardware list, power kit, storage layout |
| [Software](/Pocket-Grimoire/Software/Stack) | Services, Docker config, ZFS pool |
| [Sync & Deployment](/Pocket-Grimoire/Sync/Pre-Travel-Sync) | Pre-travel checklist, syncoid, deployment guide |
| [Hardware](/Netgrimoire/Pocket-Grimoire/Hardware/Inventory) | Full hardware list, power kit, storage layout |
| [Software](/Netgrimoire/Pocket-Grimoire/Software/Stack) | Services, Docker config, ZFS pool |
| [Sync & Deployment](/Netgrimoire/Pocket-Grimoire/Sync/Pre-Travel-Sync) | Pre-travel checklist, syncoid, deployment guide |

View file

@ -47,4 +47,4 @@ ssh pocket "zpool status pocket-green"
## Deployment Guide
See original [Deployment Guide](/Pocket-Grimoire/Sync/Deployment-Guide) for full from-scratch build procedure.
See original [Deployment Guide](/Netgrimoire/Pocket-Grimoire/Sync/Deployment-Guide) for full from-scratch build procedure.

View file

@ -41,4 +41,4 @@ The vault container (`vault.yaml`) runs a Kopia server on port 51516 that serves
Pocket Grimoire's ZFS pool (`pocket-green` at `/srv/greenpg/`) receives a `syncoid` push from `znas` before each trip. This makes Pocket Grimoire an offsite backup node whenever it leaves the house.
See [Pocket Grimoire Sync](/Pocket-Grimoire/Sync/Pre-Travel-Sync) for the pre-travel checklist.
See [Pocket Grimoire Sync](/Netgrimoire/Pocket-Grimoire/Sync/Pre-Travel-Sync) for the pre-travel checklist.

View file

@ -20,10 +20,10 @@ The Vault Grimoire covers all storage and backup infrastructure. Data starts at
| Section | Contents |
|---------|----------|
| [ZFS](/Vault-Grimoire/ZFS/Storage-Layout) | ZFS pools, datasets, NFS exports, commands reference |
| [Kopia](/Vault-Grimoire/Kopia/Kopia-Overview) | Backup repos, retention, restore, two-repo architecture |
| [Backups](/Vault-Grimoire/Backups/Services-Backup) | Per-service backup runbooks (Immich, MailCow, Nextcloud, Wiki, services) |
| [Offsite](/Vault-Grimoire/Offsite/Vault-Architecture) | Pi vault nodes, ZFS raw send, syncoid workflow |
| [ZFS](/Netgrimoire/Vault-Grimoire/ZFS/Storage-Layout) | ZFS pools, datasets, NFS exports, commands reference |
| [Kopia](/Netgrimoire/Vault-Grimoire/Kopia/Kopia-Overview) | Backup repos, retention, restore, two-repo architecture |
| [Backups](/Netgrimoire/Vault-Grimoire/Backups/Services-Backup) | Per-service backup runbooks (Immich, MailCow, Nextcloud, Wiki, services) |
| [Offsite](/Netgrimoire/Vault-Grimoire/Offsite/Vault-Architecture) | Pi vault nodes, ZFS raw send, syncoid workflow |
---

View file

@ -24,8 +24,8 @@ All Netgrimoire alerts route through self-hosted ntfy at `ntfy.netgrimoire.com`.
## Alert Sources
**OPNsense → ntfy:** CrowdSec HTTP plugin (`/usr/local/etc/crowdsec/notifications/ntfy.yaml`) + Monit script (`/usr/local/bin/ntfy-alert.sh`). See [OPNsense Alerts](/Ward-Grimoire/Notifications/OPNsense-Alerts).
**OPNsense → ntfy:** CrowdSec HTTP plugin (`/usr/local/etc/crowdsec/notifications/ntfy.yaml`) + Monit script (`/usr/local/bin/ntfy-alert.sh`). See [OPNsense Alerts](/Netgrimoire/Ward-Grimoire/Notifications/OPNsense-Alerts).
**Uptime Kuma → Gremlin → ntfy:** Kuma webhook fires on DOWN/RECOVERED → n8n triage workflow → Ollama analysis (DOWN path only) → ntfy `gremlin-alerts`. See [Gremlin Kuma Triage](/Gremlin-Grimoire/Workflows/Kuma-Triage).
**Uptime Kuma → Gremlin → ntfy:** Kuma webhook fires on DOWN/RECOVERED → n8n triage workflow → Ollama analysis (DOWN path only) → ntfy `gremlin-alerts`. See [Gremlin Kuma Triage](/Netgrimoire/Gremlin-Grimoire/Workflows/Kuma-Triage).
**DIUN → ntfy:** Docker image update watcher. Schedule: every 6 hours. Priority must be integer (15), not string `"default"`.

View file

@ -20,9 +20,9 @@ The Ward Grimoire covers all security enforcement, access control, and threat re
| Section | Contents |
|---------|----------|
| [Firewall](/Ward-Grimoire/Firewall/OPNsense) | OPNsense dual-WAN, NAT, static IPs, Suricata IDS, Zenarmor, blocklists, GeoIP |
| [Access](/Ward-Grimoire/Access/Auth-Overview) | Authentik (SSO), Authelia (wasted-bandwidth), LLDAP, Vaultwarden, YubiKey, WireGuard |
| [Notifications](/Ward-Grimoire/Notifications/Alert-Routing) | ntfy, CrowdSec alerts, OPNsense Monit, alert routing |
| [Firewall](/Netgrimoire/Ward-Grimoire/Firewall/OPNsense) | OPNsense dual-WAN, NAT, static IPs, Suricata IDS, Zenarmor, blocklists, GeoIP |
| [Access](/Netgrimoire/Ward-Grimoire/Access/Auth-Overview) | Authentik (SSO), Authelia (wasted-bandwidth), LLDAP, Vaultwarden, YubiKey, WireGuard |
| [Notifications](/Netgrimoire/Ward-Grimoire/Notifications/Alert-Routing) | ntfy, CrowdSec alerts, OPNsense Monit, alert routing |
---

View file

@ -20,9 +20,9 @@ The Watch Grimoire is the observatory of Netgrimoire. The Oracle sees every hear
| Section | Contents |
|---------|----------|
| [Monitoring](/Watch-Grimoire/Monitoring/Services) | Uptime Kuma, AutoKuma, Beszel, LibreNMS, DIUN, phpIPAM, Scrutiny |
| [Logging](/Watch-Grimoire/Logging/Log-Stack) | Graylog, Loki + Promtail + Grafana, Dozzle |
| [Dashboards](/Watch-Grimoire/Dashboards/Homepage) | Homepage, Glance, Portainer, Homelable |
| [Monitoring](/Netgrimoire/Watch-Grimoire/Monitoring/Services) | Uptime Kuma, AutoKuma, Beszel, LibreNMS, DIUN, phpIPAM, Scrutiny |
| [Logging](/Netgrimoire/Watch-Grimoire/Logging/Log-Stack) | Graylog, Loki + Promtail + Grafana, Dozzle |
| [Dashboards](/Netgrimoire/Watch-Grimoire/Dashboards/Homepage) | Homepage, Glance, Portainer, Homelable |
---

23
Periphery/Overview.md Normal file
View file

@ -0,0 +1,23 @@
---
title: Periphery
description: Non-homelab documentation — family, business, and work
published: true
date: 2026-04-12T00:00:00.000Z
tags: periphery
editor: markdown
dateCreated: 2026-04-12T00:00:00.000Z
---
# Periphery
Things that don't relate directly to Netgrimoire infrastructure — family services, business operations, and work documentation.
---
## Sections
| Section | Purpose |
|---------|---------|
| [PNC Harris](/Periphery/PNC-Harris/Overview) | Family services — Immich, Nextcloud, Mealie, Vikunja, Vaultwarden |
| [PNC Fish & More](/Periphery/PNC-Fish/Overview) | Saltwater fish and coral store — IT, operations, accounting, equipment |
| [Work](/Periphery/Work/Overview) | Cisco switching builds, NTP configs, upgrades, Ducky automation |

View file

@ -0,0 +1,68 @@
---
title: Accounting Overview
description: Bigcapital setup, Schedule C, COGS, livestock deaths, owner draws
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, accounting, bigcapital
editor: markdown
dateCreated: 2026-04-12T00:00:00.000Z
---
# Accounting Overview
## Tool: Bigcapital
Self-hosted, open-source accounting at `accounts.netgrimoire.com` (docker5, static Caddyfile entry).
Bigcapital handles:
- Income entry from Square sales reports
- Expense categorization to Schedule C lines
- Livestock death inventory shrinkage journal entries
- Owner draw tracking (separate from business expenses)
## Chart of Accounts
Mapped to **Schedule C** lines. Setup is in progress — not yet finalized.
Key accounts to establish:
| Account | Type | Schedule C Line |
|---------|------|----------------|
| Sales — Livestock | Revenue | Line 1 (Gross receipts) |
| Sales — Supplies/Accessories | Revenue | Line 1 |
| COGS — Livestock purchases | COGS | Line 36-39 |
| Inventory shrinkage (deaths) | COGS adjustment | Line 39 |
| Rent | Expense | Line 20b |
| Utilities | Expense | Line 25 |
| Supplies | Expense | Line 22 |
| Advertising | Expense | Line 8 |
| Owner draws | Equity | Not on Schedule C |
## COGS for Livestock
Livestock is inventory. COGS is calculated as:
```
Beginning Inventory + Purchases - Ending Inventory = COGS
```
**Livestock deaths** reduce ending inventory. Track in dedicated Google Sheet tab, then enter as inventory shrinkage journal entries in Bigcapital. Do not process deaths through Square.
## Owner Draws
Owner draws are equity withdrawals — not business expenses. They do not appear on Schedule C and must not be categorized as expenses. Record separately in Bigcapital as equity/drawing transactions.
## Income Entry Workflow
1. Pull sales report from Square (weekly or monthly)
2. Enter total sales as income in Bigcapital
3. Categorize to appropriate revenue accounts (livestock vs. supplies/accessories)
4. Enter any expenses paid that period (receipts, invoices)
5. Record any livestock deaths from the Google Sheet tab as shrinkage journal entries
## Pending
- [ ] Finalize chart of accounts — map all accounts to Schedule C lines
- [ ] Confirm COGS tracking method aligns with chosen inventory accounting method (FIFO vs. average cost)
- [ ] Set up livestock death log tab in Google Sheets
- [ ] Establish journal entry cadence for shrinkage entries

View file

@ -0,0 +1,51 @@
---
title: Reef Tank Maintenance
description: Saltwater reef tank maintenance, water parameters, and cyanobacteria protocol
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, reef, equipment
editor: markdown
dateCreated: 2026-04-12T00:00:00.000Z
---
# Reef Tank Maintenance
## Cyanobacteria Treatment Protocol
Use this protocol in order. Do not skip to later steps without completing earlier ones.
| Step | Action | Notes |
|------|--------|-------|
| 1 | Manual siphon removal | During water change — remove as much as possible physically |
| 2 | Verify RO/DI TDS = 0 | Replace resin if TDS is above 0 — contaminated source water is a primary cause |
| 3 | Check phosphate | If undetectable (<0.03 ppm), dose KH2PO4 to raise slightly paradoxically low phosphate favors cyano over corals |
| 4 | 3-day blackout + large water change | Starves cyano of light. Combine both for best effect. |
| 5 | Add chaeto to refugium | Outcompetes cyano for nutrients long-term |
| 6 | Vibrant liquid bacteria | If cyano persists after steps 15 |
**Note:** Chemi-Clean was used previously and did not fully resolve the issue. Underlying cause (RO/DI quality, phosphate imbalance, flow dead spots) was suspected. Provide current water parameters — nitrate, phosphate, TDS, salinity — to continue diagnosis.
## Water Parameters to Track
| Parameter | Target Range | Notes |
|-----------|-------------|-------|
| Salinity | 1.0251.026 SG | Use refractometer |
| Temperature | 7678°F | Inkbird ITC-306A controls this |
| pH | 8.18.3 | Check morning and evening |
| Ammonia | 0 | Should always be undetectable |
| Nitrite | 0 | Should always be undetectable |
| Nitrate | <10 ppm | Lower for SPS; <20 for LPS/fish-only |
| Phosphate | 0.030.10 ppm | Too low favors cyano; too high causes algae |
| TDS (RO/DI output) | 0 | Replace resin if above 0 |
## Lighting: ReefBreeder
*Document ReefBreeder light model, schedule, and intensity settings here.*
## Water Change Schedule
*Document water change frequency, volume, and salt mix used.*
## Equipment List
*Document all tank equipment: skimmer, return pump, powerheads, refugium light, dosing equipment, etc.*

View file

@ -0,0 +1,43 @@
---
title: Temperature Controllers
description: Inkbird ITC-306A WiFi temperature controller setup and troubleshooting
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, equipment, inkbird, reef
editor: markdown
dateCreated: 2026-04-12T00:00:00.000Z
---
# Inkbird ITC-306A Temperature Controller
## Specs & Requirements
| Item | Detail |
|------|--------|
| Model | Inkbird ITC-306A |
| WiFi | 2.4GHz only — will not connect to 5GHz |
| App | INKBIRD+ (iOS and Android) |
## Setup
1. Ensure phone is connected to a **2.4GHz WiFi network** (not 5GHz) before pairing
2. Put device in pairing mode (hold button per manual)
3. Open INKBIRD+ app → Add device → follow pairing wizard
4. Enter 2.4GHz WiFi credentials in app — do not attempt to connect to 5GHz SSID
## Known Issue — App Not Functioning After WiFi Connect
**Status: INCOMPLETE — resolution not confirmed**
Symptom: Device connects to WiFi successfully but INKBIRD+ app still does not function correctly (cannot control or read device).
Troubleshooting steps to try:
- [ ] Close and fully restart INKBIRD+ app
- [ ] Check if a firmware update is available in the app
- [ ] Try re-pairing: remove device from app → factory reset device → re-add
- [ ] Try a different phone if available
- [ ] Check if router has AP isolation enabled (would prevent app ↔ device communication even on same network)
## Configuration (Once App Working)
Set temperature probe calibration offset if probe reads inaccurately. Configure heating/cooling setpoints appropriate for the tank species being controlled.

View file

@ -0,0 +1,63 @@
---
title: Digital Signage Runbook
description: How to update price boards and manage the TV signage system
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, signage, runbook
editor: markdown
dateCreated: 2026-04-12T00:00:00.000Z
---
# Digital Signage Runbook
## Updating a Price
1. Open Google Sheets (master inventory)
2. Find the item row, edit price (col C), name (col B), or tank designator (col D)
3. Google Slides updates automatically
4. TVs pick up the change within 5 minutes — no further action needed
5. **Immediate update:** force-stop ScreenLite on that FireTV → relaunch
## Adding New Inventory
1. Add new row: SKU (A), display name (B), price (C), tank designator(s) (D)
2. Multiple tank designators are space-separated: `T4 T5`
3. Slides update automatically
4. Push to Square: currently manual via Square catalog CSV upload
## When an Item Sells — Manual Fallback
1. Remove the tank designator from col D of that item's row
2. Slides update automatically within a minute
3. TV picks it up within 5 minutes
## Google Sheets Column Reference
| Column | Field | Example |
|--------|-------|---------|
| A | SKU | `CLOWN-001` |
| B | Display name | `Ocellaris Clownfish` |
| C | Price | `29.99` |
| D | Tank designator(s) | `T4` or `T4 T5` |
## Troubleshooting
| Problem | Fix |
|---------|-----|
| TV showing stale price | Force-stop ScreenLite → relaunch |
| Image blurry/soft text | Add `?sz=s1920` to PNG export URL in HTML file |
| Slides not updating from Sheet | Check Apps Script in Extensions → Apps Script for errors |
| FireTV lost the URL | Re-enter Apache URL in ScreenLite settings |
## Square Webhook Automation (When Deployed)
Once live, the automation flow will be:
```
Square sale → Webhook POST → Google Apps Script Web App
→ Find item SKU in Sheet
→ Remove tank designator from col D
→ Slides auto-update → TV picks up within 5 min
```
**Status:** Designed, not yet deployed. Next step: configure Square developer dashboard webhook endpoint to the Apps Script URL and test with a real sale.

View file

@ -1,6 +1,6 @@
---
title: IT Overview
description: PNC Fish & More IT infrastructure
description: PNC Fish & More IT infrastructure — web server, digital signage, networking
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, it
@ -10,19 +10,61 @@ dateCreated: 2026-04-12T00:00:00.000Z
# IT Overview
## Website
## Infrastructure
Hosted on `pncfishandmore.com`. Static/PHP stack via the Netgrimoire `web.yaml` Apache/PHP service.
| Resource | Details |
|----------|---------|
| Domain | `pncfishandmore.com` — managed via ISPConfig |
| Web server | Apache on NetGrimoire (self-hosted Docker, `web.yaml`) |
| Email | MailCow + MXRoute relay |
| DNS | ISPConfig + internal Technitium |
| Accounting | Bigcapital (Docker on docker5, `accounts.netgrimoire.com`) |
## Email
---
Handled via MailCow + MXRoute. Domain configured as part of the 8-domain mail setup.
See [MailCow Domain Setup](/Keystone-Grimoire/Mail/Domain-Setup).
## Digital Signage System
## POS System
Three FireTV devices display live price board slides on in-store TVs. Each TV runs ScreenLite kiosk app loading an Apache HTML page, which fetches a Google Slides PNG export and refreshes it every 5 minutes via JavaScript.
*Document POS system here.*
### TV Pages on Apache
## Network
| File | Slide Deck | Purpose |
|------|-----------|---------|
| `left.html` | Saltwater fish | Main fish price board |
| `right.html` | Secondary | Freshwater or secondary display |
| `inverts.html` | Invertebrates | Inverts price board |
*Document store network here — router, AP, any on-site devices.*
### Google Slides Deck IDs
| Deck | Slide ID |
|------|---------|
| Left (saltwater fish) | `1S3j0K1QlWAtkjq73E73At3gz9vWp9vVr_yZswUHiyN8` |
| Right (secondary) | `1mWzgisxMQAFAhME9HXY_PEK0v_hIuQ4Md0PQS10ES8Q` |
| Inverts | `1nzunM4pQxqmW82_Ab0rrOsV4QuO8G5TVUDodplI_4tY` |
PNG export URL format: `https://docs.google.com/presentation/d/<ID>/export/png?sz=s1920`
Use `sz=s1920` for sharper text. If display looks soft, increase canvas size in Google Slides settings.
### Critical: ScreenLite Does Not Respond to Meta-Refresh
ScreenLite ignores `<meta http-equiv="refresh">`. All TV page refreshes use JavaScript `setInterval` image src swap only:
```javascript
setInterval(function() {
var img = document.getElementById('slide');
img.src = SLIDE_URL + '?t=' + Date.now();
}, 300000); // 300,000ms = 5 minutes
```
### Force Immediate Refresh
Force-stop ScreenLite on the FireTV and relaunch. It reloads the Apache URL and picks up the latest PNG immediately.
---
## Pending
- [ ] Square webhook → Apps Script → Google Sheets automation (designed, not deployed)
- [ ] "Push to Square" Apps Script button in Google Sheets
- [ ] Store network documentation (router, AP, FireTV connections)

View file

@ -1,6 +1,6 @@
---
title: Marketing Overview
description: PNC Fish & More marketing and promotions
description: Digital signage content, promotions, social media
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, marketing
@ -10,4 +10,18 @@ dateCreated: 2026-04-12T00:00:00.000Z
# Marketing Overview
*Add marketing documentation here: social media accounts, posting schedules, ad campaigns, promotions, photography workflow for livestock, etc.*
## Digital Signage
In-store TV price boards are the primary customer-facing marketing surface. See [Digital Signage Runbook](/PNC-Fish/IT/Digital-Signage-Runbook) for how to update content.
## Social Media
*Document social media accounts, posting schedule, and content workflow here.*
## Promotions
*Document any recurring promotions, seasonal sales, or loyalty programs here.*
## Photography Workflow
*Document how livestock photos are taken and used for signage, social media, and Square catalog.*

View file

@ -0,0 +1,67 @@
---
title: Inventory Management
description: Google Sheets master inventory, Square POS, and sales workflow
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, inventory, square
editor: markdown
dateCreated: 2026-04-12T00:00:00.000Z
---
# Inventory Management
## Source of Truth
**Google Sheets is the master inventory.** Square is a downstream target. Never update Square first and then try to sync back to Sheets — always update Sheets first.
## Google Sheets Structure
| Column | Field | Notes |
|--------|-------|-------|
| A | SKU | Unique identifier |
| B | Display name | Name shown on price board |
| C | Price | Retail price |
| D | Tank designator(s) | Space-separated: `T4 T5`. Drives which TV slide shows the item. Remove when sold. |
A separate tab tracks **livestock deaths** — used for inventory shrinkage journal entries in Bigcapital. See [Accounting](/PNC-Fish/Accounting/Overview).
## Square POS Integration
### Current State (Manual)
New inventory added to Square via CSV catalog upload. Sales are recorded in Square, then manually reconciled against Google Sheets.
### Planned Automation
| Direction | Method | Status |
|-----------|--------|--------|
| Sale → Sheet | Square webhook → Google Apps Script → remove tank designator | Designed, not deployed |
| Sheet → Square | "Push to Square" Apps Script button | Planned, not built |
### Square API Notes
- Square API access is free — no additional cost beyond transaction fees
- Webhook + Apps Script integration has zero incremental cost
- Apps Script is deployed as a Google Web App to receive Square webhook POSTs
## Adding New Livestock
1. Add row to Google Sheet: SKU, display name, price, tank designator
2. Slides auto-update → TV price board updates within 5 minutes
3. Push to Square: CSV upload to Square catalog (manual until automation is live)
## When Item Sells
**With automation (planned):** Square fires webhook → Apps Script removes tank designator → done
**Manual fallback (current):**
1. Process sale in Square
2. Open Google Sheet
3. Remove tank designator from col D for that item
4. Slides auto-update, TV picks up within 5 minutes
## Livestock Death Tracking
1. Record death in dedicated Google Sheet tab (date, species, SKU, cost)
2. Enter as inventory shrinkage journal entry in Bigcapital
3. Do NOT process through Square

View file

@ -1,6 +1,6 @@
---
title: Operations Overview
description: PNC Fish & More day-to-day operations documentation
description: Day-to-day store operations — sales, inventory, payroll
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, operations
@ -10,4 +10,19 @@ dateCreated: 2026-04-12T00:00:00.000Z
# Operations Overview
*Add operations documentation here: inventory management, supplier contacts, tank maintenance schedules, livestock sourcing, water chemistry protocols, etc.*
## Key Runbooks
| | |
|---|---|
| [Inventory Management](/PNC-Fish/Operations/Inventory) | Google Sheets, Square POS, adding livestock, sales workflow |
| [Payroll](/PNC-Fish/Operations/Payroll) | Current process, Florida Reemployment Tax, tool decision |
## Quick Reference
**Updating a price board:** Edit Google Sheet → TV updates in 5 minutes
**New livestock arrived:** Add to Sheet → Push to Square (CSV) → update tank designator
**Item sold:** Remove tank designator from Sheet col D
**Employee paid:** Weekly by check — record hours in inherited Excel spreadsheets

View file

@ -0,0 +1,43 @@
---
title: Payroll
description: Current payroll process, Florida Reemployment Tax, tool decision
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, payroll, hr
editor: markdown
dateCreated: 2026-04-12T00:00:00.000Z
---
# Payroll
## Current Process
| Item | Method |
|------|--------|
| Pay schedule | Weekly |
| Payment method | Handwritten check |
| Hours tracking | Inherited Excel spreadsheets |
| Quarterly filing | Florida Reemployment Tax — filed manually |
| Annual | W-2s |
The Excel spreadsheets were inherited from the prior accountant. They are still in active use.
## Compliance Requirements
- **Florida Reemployment Tax** must be filed quarterly
- **W-2s** issued annually to employees
- **Owner draws** are not wages — do not run through payroll, do not appear on Schedule C
## Tool Decision — Pending
| Option | Cost | Notes |
|--------|------|-------|
| Continue manual (Excel) | Free | Works but scales poorly; compliance risk increases with headcount |
| Square Payroll | ~$35/mo + $6/employee | Handles FL Reemployment Tax, W-2s, direct deposit |
| Other managed payroll | Varies | QuickBooks Payroll, Gusto, etc. |
**Decision not yet made.** Key factor: Florida Reemployment Tax compliance and W-2 accuracy. The manual approach is viable for 1-2 employees but becomes a compliance risk as the team grows.
## Next Step
Review inherited Excel spreadsheets. Determine current employee count and pay structure. Make managed vs. manual decision based on headcount and compliance comfort level.

View file

@ -1,6 +1,6 @@
---
title: PNC Fish & More
description: Saltwater fish and coral store — IT, operations, and business documentation
description: Saltwater fish and coral store — IT, operations, accounting, and equipment
published: true
date: 2026-04-12T00:00:00.000Z
tags: pncfish, business
@ -12,7 +12,9 @@ dateCreated: 2026-04-12T00:00:00.000Z
![pncfish-badge](/images/pncfish-badge.png)
PNC Fish & More is a saltwater fish and coral store. This section of the grimoire covers IT infrastructure, business operations, and marketing documentation for the store.
PNC Fish & More is a saltwater fish and coral store (single-member LLC, Fort Walton Beach, FL). This grimoire covers all IT infrastructure, business operations, accounting, and equipment documentation for the store.
**Design principle:** Zero/low-cost, self-managed stack. No unnecessary SaaS subscriptions. Open-source tools where maintenance burden is manageable.
**Domain:** `pncfishandmore.com`
@ -22,21 +24,50 @@ PNC Fish & More is a saltwater fish and coral store. This section of the grimoir
| Section | Contents |
|---------|----------|
| [IT](/PNC-Fish/IT/Overview) | Website, POS system, networking, hosting |
| [Operations](/PNC-Fish/Operations/Overview) | Inventory management, suppliers, tank management |
| [Marketing](/PNC-Fish/Marketing/Overview) | Social media, promotions, advertising |
| [IT](/PNC-Fish/IT/Overview) | Apache web server, digital signage, networking, hosting |
| [Operations](/PNC-Fish/Operations/Inventory) | Inventory management, Square POS, sales workflow |
| [Accounting](/PNC-Fish/Accounting/Overview) | Bigcapital, Schedule C, COGS, payroll |
| [Equipment](/PNC-Fish/Equipment/Temperature-Controllers) | Inkbird ITC-306A, ReefBreeder lights, reef tank |
| [Marketing](/PNC-Fish/Marketing/Overview) | Digital signage content, promotions |
---
## IT Overview
## Stack at a Glance
| Resource | Details |
|----------|---------|
| Domain | `pncfishandmore.com` (managed via ISPConfig) |
| Website | Hosted on Netgrimoire Apache/PHP stack |
| Email | Via MailCow + MXRoute relay |
| DNS | ISPConfig + OPNsense internal |
| Service | Host | Purpose | Cost |
|---------|------|---------|------|
| Apache web server | NetGrimoire (self-hosted) | Serves TV signage pages | Free |
| Bigcapital | NetGrimoire (Docker) | Accounting / Schedule C | Free / self-hosted |
| Google Sheets | Google | Master inventory source of truth | Free |
| Google Slides (3 decks) | Google | Digital signage content | Free |
| Google Apps Script | Google | Square webhook + automation | Free |
| Square POS | In-store | Point-of-sale, transaction processing | Transaction fees only |
| ScreenLite | FireTV devices | Kiosk app, loads Apache pages | App cost |
| FireTV (multiple) | In-store TVs | Display hardware | Hardware only |
---
*Sections below are stubs — add content as needed.*
## Integration Architecture
```
Google Sheets (master inventory)
→ Google Slides (auto-updated from Sheet)
→ Apache HTML pages (PNG export, 5-min refresh)
→ FireTV + ScreenLite (display)
Square sale
→ Webhook → Google Apps Script
→ Google Sheets (decrement / remove tank designator)
→ Slides update automatically
```
---
## Key Design Decisions
- **Google Sheets is the master source of truth** for inventory — Square is a downstream target, not the source
- **ERPNext rejected** — US tax table upkeep burden too high for a small operation
- **ScreenLite ignores meta-refresh** — all TV page refreshes must use JavaScript `setInterval` image src swap, not `<meta http-equiv="refresh">`
- **Square API access is free** — webhook + Apps Script integration has zero incremental cost
- **Livestock deaths** tracked via dedicated Sheet tab + Bigcapital journal entries, not through Square
- **Owner draws are not business expenses** and must not appear on Schedule C

72
home.md
View file

@ -22,36 +22,29 @@ dateCreated: 2026-04-12T00:00:00.000Z
---
## 🔮 The Grimoires — Homelab
## 🔮 Netgrimoire — Homelab
| Grimoire | Badge | Purpose |
|----------|-------|---------|
| 🟢 [Netgrimoire](/Netgrimoire/Overview) | `netgrimoire-badge.png` | Core homelab — service catalog, host inventory, standards |
| 🏰 [Keystone Grimoire](/Keystone-Grimoire/Overview) | `keystone-badge.png` | Architecture — network design, Caddy, Docker Swarm, DNS, mail |
| 🗄️ [Vault Grimoire](/Vault-Grimoire/Overview) | `vault-badge.png` | Storage & backup — ZFS, Kopia, NFS, offsite replication |
| 🛡️ [Ward Grimoire](/Ward-Grimoire/Overview) | `ward-badge.png` | Security — OPNsense, CrowdSec, auth, VPN, blocklists |
| 🔮 [Watch Grimoire](/Watch-Grimoire/Overview) | `watch-badge.png` | Monitoring — Uptime Kuma, Beszel, Grafana, alerts, logs |
| 🤖 [Gremlin Grimoire](/Gremlin-Grimoire/Overview) | `gremlin-badge.png` | Local AI — Ollama, Open WebUI, n8n, Qdrant, workflows |
| 💀 [Shadow Grimoire](/Shadow-Grimoire/Overview) | `shadow-badge.png` | Acquisition — Usenet, torrents, arr stack, indexers |
| 🌿 [Green Grimoire](/Green-Grimoire/Overview) | `green-badge.png` | Adult media — Stash, Jellyfinx, Namer, Whisparr |
| 🎒 [Pocket Grimoire](/Pocket-Grimoire/Overview) | `pocket-badge.png` | Portable lab — laptop, offline-first, travel vault node |
| 🏰 [Keystone Grimoire](/Netgrimoire/Keystone-Grimoire/Overview) | `keystone-badge.png` | Architecture — network, Caddy, Docker Swarm, DNS, mail |
| 🗄️ [Vault Grimoire](/Netgrimoire/Vault-Grimoire/Overview) | `vault-badge.png` | Storage & backup — ZFS, Kopia, NFS, offsite replication |
| 🛡️ [Ward Grimoire](/Netgrimoire/Ward-Grimoire/Overview) | `ward-badge.png` | Security — OPNsense, CrowdSec, auth, VPN, blocklists |
| 🔮 [Watch Grimoire](/Netgrimoire/Watch-Grimoire/Overview) | `watch-badge.png` | Monitoring — Kuma, Beszel, Grafana, alerts, logs |
| 🤖 [Gremlin Grimoire](/Netgrimoire/Gremlin-Grimoire/Overview) | `gremlin-badge.png` | Local AI — Ollama, Open WebUI, n8n, Qdrant, workflows |
| 💀 [Shadow Grimoire](/Netgrimoire/Shadow-Grimoire/Overview) | `shadow-badge.png` | Acquisition — Usenet, torrents, arr stack, indexers |
| 🌿 [Green Grimoire](/Netgrimoire/Green-Grimoire/Overview) | `green-badge.png` | Adult media — Stash, Jellyfinx, Namer, Whisparr |
| 🎒 [Pocket Grimoire](/Netgrimoire/Pocket-Grimoire/Overview) | `pocket-badge.png` | Portable lab — laptop, offline-first, travel vault node |
---
## 🏠 Personal & Business
## 🌐 Periphery — Beyond the Lab
| Section | Badge | Purpose |
|---------|-------|---------|
| 👨‍👩‍👧 [PNC Harris](/PNC-Harris/Overview) | `pncharris-badge.png` | Family services — Immich, Nextcloud, Mealie, Vikunja |
| 🐠 [PNC Fish & More](/PNC-Fish/Overview) | `pncfish-badge.png` | Saltwater fish & coral store — IT, operations, marketing |
---
## 💼 Work
| | |
|---|---|
| 🔧 [Work Overview](/Work/Overview) | Cisco switching builds, NTP, upgrades, Ducky automation |
| 👨‍👩‍👧 [PNC Harris](/Periphery/PNC-Harris/Overview) | `pncharris-badge.png` | Family services — Immich, Nextcloud, Mealie, Vikunja |
| 🐠 [PNC Fish & More](/Periphery/PNC-Fish/Overview) | `pncfish-badge.png` | Saltwater fish & coral store — IT, ops, accounting |
| 💼 [Work](/Periphery/Work/Overview) | — | Cisco switching, NTP, upgrades, Ducky automation |
---
@ -59,31 +52,32 @@ dateCreated: 2026-04-12T00:00:00.000Z
| | |
|---|---|
| 📋 [Service Catalog](/Netgrimoire/Service-Catalog) | All services — status, host, URL, grimoire assignment |
| 🏗️ [Docker Swarm Template](/Keystone-Grimoire/Docker/Swarm-Template) | Standard YAML, label rules, volume paths |
| 📄 [Service Doc Template](/Netgrimoire/Conventions/Service-Doc-Template) | Template for new service documentation |
| 📖 [Documentation Standards](/Netgrimoire/Conventions/Doc-Standards) | Structure, naming, diagram, git workflow |
| 🔍 [Audit Reports](/Netgrimoire/Audits/README) | Gremlin-generated YAML compliance audits |
| 📋 [Service Catalog](/Netgrimoire/Service-Catalog) | All services — status, host, URL, grimoire |
| 🏗️ [Docker Swarm Template](/Netgrimoire/Keystone-Grimoire/Docker/Swarm-Template) | Standard YAML, label rules, volume paths |
| 📄 [Service Doc Template](/Netgrimoire/Conventions/Service-Doc-Template) | Template for new service docs |
| 📖 [Doc Standards](/Netgrimoire/Conventions/Doc-Standards) | Structure, naming, diagram, git workflow |
| 🔍 [Audit Reports](/Netgrimoire/Audits/README) | Gremlin-generated weekly YAML audits |
---
## 🗺️ Wiki Structure
## 🗺️ Structure
```
wiki/
├── home.md ← you are here
├── Netgrimoire/ ← spine: catalog, standards, conventions
├── Keystone-Grimoire/ ← architecture: hosts, network, Docker, mail
├── Vault-Grimoire/ ← storage: ZFS, Kopia, NFS, backups
├── Ward-Grimoire/ ← security: OPNsense, CrowdSec, auth, VPN
├── Watch-Grimoire/ ← monitoring: Kuma, Beszel, Grafana, ntfy
├── Gremlin-Grimoire/ ← AI: Ollama, n8n, Qdrant, workflows
├── Shadow-Grimoire/ ← acquisition: arr stack, Usenet, torrents
├── Green-Grimoire/ ← adult media: Stash, Jellyfinx, Namer
├── Pocket-Grimoire/ ← portable lab: laptop + Beryl AX
├── PNC-Harris/ ← family services
├── PNC-Fish/ ← business docs
└── Work/ ← Cisco / network engineering
├── home.md
├── Netgrimoire/ ← homelab spine + all grimoires
│ ├── Keystone-Grimoire/ ← architecture
│ ├── Vault-Grimoire/ ← storage & backup
│ ├── Ward-Grimoire/ ← security
│ ├── Watch-Grimoire/ ← monitoring
│ ├── Gremlin-Grimoire/ ← AI stack
│ ├── Shadow-Grimoire/ ← acquisition
│ ├── Green-Grimoire/ ← adult media
│ └── Pocket-Grimoire/ ← portable lab
└── Periphery/ ← non-homelab
├── PNC-Harris/ ← family
├── PNC-Fish/ ← business
└── Work/ ← Cisco / networking
```
---

BIN
netgrimoire-export.zip Normal file

Binary file not shown.