Nr 1 Hemgjord mjukvara, visad i helfigur Oktober 2026 · English

jglot

10 program En verkstad, en båt, en telefon, en terminal Inga moln kom till skada

Tio program. En envis idé.

Att mjukvara för det egna livet kan göras hemma, som bröd: liten, exakt och anpassad till ett enda kök.

  • Till sjössEtt nakterhus på en Raspberry Pi, och en simulator som ritar vinden
  • VerkstadEn 3D-skrivare som bevakas, matas och ifrågasätts
  • TerminalBilder, CAD-modeller och en telefon, allt i ett rutnät av tecken
  • SkrivbordEn att-göra-lista som bor i källkoden
  • MaskinrumInstrumentpaneler, och en logg som inte går att ändra i tysthet
jsail: en segelbåt under gång, med lasten på seglen ritad som pilar
jstatus: en instrumentpanel i terminalen med klocka, maskin, värdar och loggar
rakemooner: en utskriven vas som verktygsbana i 3D över sitt bäddnät
Gjord
hemmautan moln
Till sjöss

nakterhus

En plotter, en loggbok och en trimcoach, som alla bor på en Raspberry Pi innanför nedgångsluckan.

Nakterhuset är skåpet som håller kompassen där rorsman kan se den. Det här håller betydligt mer än en kompass.

Varje instrument ombord talar SignalK, och nakterhus lyssnar. Det ritar båten på sjökort från OpenStreetMap och OpenSeaMap, lägger en rutt över dem, håller utkik i AIS-trafiken efter allt som är på kollisionskurs och sparar varje mätvärde i SQLite, så att en överfart kan spelas upp i efterhand med en enda markör delad mellan diagrammet och spåret: dra längs djupkurvan och en markering vandrar över sjökortet.

Det finns sju arbetsytor, var och en byggd för en uppgift: Navigate, Helm, Plan, History, Voyage, Dashboards och Sail. En siffertangent byter mellan dem, och ingenting stängs ner när man gör det.

Vilken källa som är live observeras, den ställs aldrig in. Om simulatorns port svarar är båten simulerad, och en blinkande etikett säger det.

Det är byggt för en båt på mobildata som kostar. Kamerorna är ffmpeg-processer som bara finns medan någon tittar. Den som tittar från land får ett långsammare flöde och en mindre bild, och en telefonsida som är dold hämtar ingenting alls.

Webbkonsolen är kommandoraden: ett och samma argparse-träd betjänar båda, så varje kommando finns i exakt en implementation. Instrumentpanelerna är HTML-fragment som ritas två gånger, av webbläsaren och direkt för e-pappersskärmen, med ett test som håller de två till samma bild.

Och när vinden ökar ger det råd. Arbetsytan Sail räknar ut bogen, säger när det är dags att reva och listar trimstegen i ordning, vart och ett med sitt skäl.

Körs på
En Raspberry Pi 4 ombord, Debian 13
Ytor
Arbetsytor på webben, en telefonsida, en kommandorad med ett 35-tal kommandogrupper, en e-pappersskärm på 7,5 tum
Gjord av
Python med tre beroenden vid körning; ES-moduler utan ramverk, Leaflet, three.js; SQLite
Talar med
SignalK, AIS, Victrons elsystem, USB-kameror, en 4G-router
Status
I bruk ombord. 1 058 commits sedan maj 2026, omkring 1 860 tester
Källkod: inte offentlig än
WebbläsareNavigate. Rutten från Lymington till Cowes, AIS-mål, kurspanelen och förkameran. Båten är simulatorns, och etiketten högst upp erkänner det.
WebbläsareHelm, i nattrött. Instrumenten flyter över ett nedtonat sjökort för att skona ögonen på nattvakten.
WebbläsareVoyage. Ett inspelat spår på 22,6 sjömil med anteckningar flaggade längs vägen, loggboken och ett djupdiagram.
WebbläsareHistory. Djup och fart över grund på samma tidsmarkör; sträckor utan inspelning ritas streckade.
WebbläsarePlan. Sex girpunkter, en färdplan som heter ”Sunday tea run” och en prognos som hämtas först när man ber om den.
E-papperSkärmen i sittbrunnen: 800 gånger 480 punkter enbits-e-papper, läsbart i fullt solljus, uppdaterat en gång i sekunden.
KommandoradSamma båt från ett skal: en statusrad, AIS med närmaste passageavstånd och färdplanens ben.
TelefonTelefonsidan, som installeras som en app och håller skärmen vaken vid rodret.

Till sjöss, inomhus

jsail

En seglingssimulator som förklarar sina krafter. Varje newton räknas ut, och varje newton ritas.

DesktopUnder gång i 5,81 knop med 18 graders krängning; autopiloten styr mot ett märke i lovart. De orange pilarna är lasten på varje remsa av seglet; panelen nere till vänster visar vilka remsor som lever och vilka som har överstegrat.

En genomgång av det som redan fanns hittade simulatorer med fysik som inte förklarar någonting, och övningsprogram som förklarar allt utan någon fysik bakom. Så här kommer båda.

Seglens aerodynamik, skrov, köl och roder, vind, ström och vågor: jsail löser alltihop och ritar sedan det den löste. Trycket löper uppför förliket som en kam av pilar. Strömlinjer böjer sig runt riggen, blå där luften går långsammare än vinden och röda där den går fortare. Den rätande och den krängande hävarmen står utsatta i meter, på båten, medan hon kränger.

Rodervinkeln löses tillsammans med giren, så lovgirighet och en broach är sådant som händer en, inte inställningar. Under gång stegas hon genom tiden i sex frihetsgrader, besättningen trimmar i vinschens takt, och ett slag kostar fart precis som det ska.

Begär man för mycket av henne svarar hon rakt på sak: ”no sail set may be carried in 14 m/s.”

Trimmet är besättningens eller ditt, punkt för punkt. Åtta reglage har var sin Auto-ruta, och allt du lämnar i fred optimeras kring det du envisas med. Blir det riktigt fel kliver instruktören in: en rättelse i taget, var och en med sitt skäl och vad den är värd i knop, och en guldpil som pekar på reglaget som ska flyttas.

Varje tal i en båtfil bär sin härkomst: uppgivet, beräknat eller uppskattat. jsail boat check skriver ut uppskattningarna under rubriken ”the to-do list”.

Den fristående versionen är en binär på 2,1 MB som räknar ut ett polardiagram på en Raspberry Pi på under en tiondels sekund.

Ytor
En 3D-vy i Godot och en fristående kommandorad, jsail
Gjord av
En Rust-arbetsyta med sex crates, Godot 4 via gdext, GLSL för vatten, segel och strömning
Prövad mot
WinVPP:s polardiagram och Delfts systematiska skrovserie: 0,42 knop RMS över 224 celler
Status
Första iterationen står. Hon går att segla
Källkod: ligger kvar i land tills vidare
DesktopPlanvy. Beräknade strömlinjer, en tryckkam på båda seglen och varje kraft utsatt i newton: framdrift 1 121, krängning 3 025.
DesktopInstruktören, steg ett av fem: ”Sheet in the headsail”, med en pil på reglaget det gäller.
DesktopDomen. Som du hade henne, 1,74 knop. Efter lektionen, för hand, 5,71. Besättningen, 5,86.
DesktopMätare: krängande mot rätande moment, framdrift mot motstånd, rodret, och seglen remsa för remsa.
KommandoradEtt polardiagram från kommandoraden. Vid 19 knops vind plattar besättningen till seglen och revar sedan.
KommandoradEtt slag, sekund för sekund: farten faller från 5,85 knop till omkring 2 och klättrar tillbaka.

Verkstad

rakemooner

En färdskrivare för en 3D-skrivare. Varje utskrift sparad, varje sekund av den, och en markör att vandra tillbaka genom alltihop med.

WebbläsareArbetsytan Model. En vriden vas stoppad vid lager 529 av 700 och färgad efter höjd, stående på det bäddnät skrivaren mätte upp innan den började.

Moonraker berättar vad en Klipper-skrivare gör just nu. Rakemooner, som är Moonraker med stavelserna omkastade, minns vad den gjorde.

Medan en utskrift pågår skriver en liten demon ner allt skrivaren rapporterar: temperaturer och deras börvärden, värmeeffekt, fläktar, hastighet, luftfuktigheten i filamentlådan, varje konsolrad, bäddnätet, webbkameran. Efteråt låter webbgränssnittet en gå tillbaka över det, och en enda tidsmarkör styr hela sidan. Dra i ett diagram och avläsningarna, G-kodsraden, verktygsbanan i 3D och filmen flyttar sig alla till det ögonblicket.

Verktygsbanan ritas som solida lådor med varje strängs verkliga bredd och höjd, ungefär en och en halv miljon av dem för en tiotimmarsutskrift, i ett enda ritanrop. Färga dem efter typ, hastighet, höjd, filamentfack eller vilket inspelat fält som helst.

Att byta arbetsyta stänger ingenting. Webbkameran fortsätter strömma och en halvskriven anteckning överlever.

Utskrifter samlar sig i projekt utan att någon sorterar dem. En modells version är en kontrollsumma av dess geometri; inställningarna som ändrats mellan två utskrifter läses ur blocket som slicern lämnar i slutet av G-koden. Bocka i två utskrifter och den berättar vad som skilde.

Och sedan frågar arbetsytan Slicer: tänk om. Den tar slicerprojektet som en utskrift gjordes från, skivar det på nytt med andra inställningar genom OrcaSlicers egen kommandorad och ställer resultaten sida vid sida: 25 minuter och 6,5 gram sparade, med två väggar och mindre fyllning.

Ur temperaturen och luftfuktigheten i filamentlådan räknar demonen dessutom ut daggpunkten, eftersom någon ville veta.

Ytor
En inspelningsdemon, ett webbgränssnitt med telefonläge, rm-cli och ett skrivbordsskal
Gjord av
Nio Rust-crates på tokio, axum och Tauri; ren JavaScript och three.js, utan byggsteg
Spelar in
Givare i 1 Hz, G-kod, konsol, bäddnät och webbkamerafilm
Lutar sig mot
Moonraker för skrivaren, ffmpeg för filmen, OrcaSlicers kommandorad för ett andra utlåtande
Status
I dagligt bruk. 243 commits sedan maj 2026
Källkod: inte offentlig än
WebbläsareHistory. Sex diagram över första halvtimmen av ett fäste i PETG, med flaggor där ett börvärde ändrades.
WebbläsareLive. Lager 382 av 700, de senaste trettio minuternas mätvärden och verktygsbanan som växer medan den skrivs ut.
WebbläsareFärgad efter typ: väggar, gyroidfyllning, toppyta och brätte, med G-koden som följer markören.
WebbläsareSlicer. Ett fäste skivat två gånger; den andra kolumnen visar bara det som skiljer, och vad det sparar.
WebbläsareProjects. En vas genom två versioner av sin modell, och två av dess utskrifter jämförda.
KommandoradSamma frågor från ett skal: status, projekt, en jämförelse och en skivning med två inställningar ändrade.

Verkstad

bidibok

Fyra spolar, en filamentlåda och en kommandorad som vet vilken färg var och en av dem har.

Qidi Box matar en Q2-skrivare från fyra spolar och torkar dem medan den väntar. Pekskärmen kan styra den. Det kan numera också ett skript.

bidibok läser lådan och dess fack, laddar och matar ur filament, startar en torkning, läser RFID-taggen på en spole och tilldelar filament, färg och tillverkare utifrån den. Färger visas som äkta 24-bitars färgrutor, och försvinner artigt när utdata skickas vidare i ett rör.

Dina egna filament bor i en liten lokal fil, lagd ovanpå skrivarens lista efter index. En uppdatering av den inbyggda programvaran skriver över skrivarens kopia; din överlever, och preset sync lägger tillbaka den, rör bara dina poster och lämnar de ursprungliga orörda, byte för byte.

Det följer med en skrivare att leka med: laddningar tar sina sekunder, torkning värmer lådan och luftfuktigheten sjunker.

Simulatorn kör G-koden den tar emot mot en modell av lådan, långsamt, så som den riktiga gör. Allt på den här sidan är taget mot den.

Två generationer av den inbyggda programvaran känns igen under körning. Slutkoderna betyder något: 1 för ”kan gå senare”, 2 för ”det hjälper inte att fråga igen”.

Ytor
En kommandorad, och ett bibliotek som vad som helst kan länka
Gjord av
Rust: en protokollkärna utan egen I/O, ett gränssnitt i clap, en simulerad skrivare
Talar med
Moonraker över HTTP. Ingen SSH, ingenting installerat på skrivaren
Tester
137 facitfiler; ingen av dem behöver en skrivare
Källkod: inte offentlig än
KommandoradFyra fack, fyra filament. Fack 1A matar skrivaren, lådan har åtta timmars torkning vid 55 °C framför sig, och ingenting kan hoppa in för något annat.
KommandoradStatus och givare: programvara, ändlägen, värmaren på 5 % effekt, luften vid 6 % relativ fuktighet.
KommandoradEn eftermiddags arbete: läs varje tagg, ge en färg ett namn, sänk en pågående torkning fem grader, förhandsgranska en synkning.

Verkstad

jbuilder

Klicka på en avrundning. Hamna på den rad Python som gjorde den.

Med build123d skriver man en solidmodell som ett Python-skript. Det är underbart, tills detaljen har fyrtio ytor och man behöver namnet på en av dem.

jbuilder bevakar skriptet. Spara det från vilken editor som helst och modellen byggs om. Klicka på en yta, en kant eller ett hörn i visaren och källkodspanelen rullar till raden som skapade den, eftersom en spårningskrok förde anteckningar medan skriptet kördes. En orörd yta behåller sin rad genom varje senare skärning och avrundning.

Klicket besvarar också den svårare frågan: hur pekar jag ut den här saken i kod? jbuilder tar fram tänkbara selektoruttryck, utvärderar vart och ett och behåller bara dem som ger exakt den form du klickade på. Upp till tre kommer tillbaka, det enklaste först.

Selektorförslagen är en vanlig algoritm. Varje förslag har körts och befunnits stämma.

Skriv en egen selektor och träffarna tänds medan du skriver, med ett antal. Klicka på ett radnummer och visaren visar bara det som den raden byggde. Anropa show() var som helst i skriptet för att lämna en namngiven, färgad kontrollpunkt; den kostar ingenting förrän någon klickar på den.

Det finns ett skissverktyg med geometriska villkor som öppnas på vilken plan yta som helst, en kladdbuffert som delar modellens namnrymd, och ett neovim-tillägg som gör byggfel till vanliga diagnostikmeddelanden och låter visaren följa markören.

Ytor
En webbvisare, ett skrivbordsfönster, jbuilder-cli och ett tillägg till neovim
Gjord av
Python med FastAPI och build123d; Three.js och CodeMirror utan byggsteg
Exporterar
STL, STEP, BREP, glTF och 3MF
Husets regel
jbuilder ändrar aldrig i din modellkod
Källkod: inte offentlig än
WebbläsareEtt väggfäste till en skrivbordslampa. Avrundningen mellan arm och platta är markerad, och källkodspanelen har gått till rad 52: part = fillet(root, 5).
WebbläsareSelektorpanelen: ett uttryck, 46 träffar, varje cirkelkant lyser.
WebbläsareRad 29, förhandsgranskad. Bara armen som den raden extruderade syns.
WebbläsareTre kontrollpunkter överlagrade i röntgenvy: profilerna som detaljen byggdes av.
WebbläsareSkiss på en yta, med villkor, en namngiven parameter och den genererade koden bredvid.
TerminalI neovim: tre verifierade selektorer för ytan som valdes i visaren, klara att infoga.

Terminal

jcat

cat, fast för bilder. Sedan var det någon som riktade den mot en CAD-fil.

En terminal som talar kittys grafikprotokoll kan visa riktiga bildpunkter. jcat är en liten visare byggd på det: zooma med hjulet, panorera genom att dra, eller använd hjkl som en civiliserad människa.

Bilden laddas upp en gång. Därefter är varje zoomning eller panorering ett enda placeringskommando på några dussin byte, och grafikkortet sköter skalningen. Vektorformat rastreras i dubbla skärmstorleken så att de förblir skarpa när man lutar sig fram. Över SSH märker den det, och strömmar bilden i stället för att räcka terminalen en fil.

Inne i tmux fungerar inget av det, så där gör den något helt annat: platshållartecken i Unicode, en bildpyramid och två bild-ID:n som används växelvis så att det aldrig blir en tom ruta. Anteckningarna om implementationen innehåller en nödlösning för en viss tmux-version som tappar diakriter i rutor som inte ligger vid vänsterkanten.

Andra program lånar den som sin bildkomponent: --place ritar en bild i ett block av teckenrutor och går sin väg.

Sedan har vi modelrender, ett andra litet program som gör om en 3D-modell till ett ark med vyer där de dolda linjerna är ordentligt borttagna. Det rastrerar en djupbuffert enbart för att svara på vad som syns, och skriver sedan svaret som vektorbanor. Alla nio vyer delar skala, så storlekar går att jämföra mellan dem.

Sätt ihop de två och jcat bracket.stl fungerar. Medan FreeCAD tessellerar tumlar en kub av punktskriftstecken runt för att fördriva tiden.

Ytor
Två kommandon: jcat och modelrender
Gjord av
Python. Pillow och ImageMagick för jcat; trimesh, numpy och en huvudlös FreeCAD för modelrender
Läser
Bitmappar, SVG, PDF, HEIC; STL, 3MF, OBJ, glTF; STEP, IGES, BREP och FreeCAD-dokument
Status
jcat kallar sig en prototyp, med anteckningar skrivna för den som en dag skriver om den
Källkod: inte offentlig än

Utan modelrender

TerminalEn Juliamängd på 4 800 bildpunkter i 100 %, panorerad in bland spiralerna. Statusraden är allt gränssnitt som finns.
TerminalAnpassad till fönstret. n och p stegar mellan filerna; en PDF och en SVG väntar bakom den här.

Med modelrender

TerminalEtt FreeCAD-dokument med sex kroppar, isärdraget, i nio vyer, i en terminal. Färgerna läses ur filen.
TerminalSamma ark i 100 %, panorerat till vyn snett framifrån höger och uppifrån.
Ritningmodelrender för sig, utan skuggning: en ritning med dolda linjer borttagna, värdig en manual.
RitningEtt kugghjul med 28 tänder i tre valda vyer, guld på mörkt, utan etiketter.
KommandoradKropparna i ett dokument listas, två av dem ritas, och en förloppsmätare räknar medan FreeCAD arbetar.

Skrivbord

jpim

Dina projekt bor redan i filsystemet. Att-göra-listan kan lika gärna flytta in hos dem.

De flesta planeringsverktyg vill vara platsen där allting bor. jpim vill hellre vara ett tunt lager över de kataloger, anteckningar och källkodsfiler du redan har.

Skriv @jpim { kind = "todo" } i en kommentar, i vilken textfil som helst, och en uppgift finns. Filen förblir sanningskällan: ändra raden och uppgiften följer med. Avsökaren respekterar .gitignore, minns vad den har sett och går igenom ett projekt på 37 GB på ungefär två sekunder.

Den rör inte dina filer om du inte ber om det. Be, och den skriver tillbaka ett id på åtta tecken i raden, kirurgiskt, så att uppgiften överlever en flytt.

Ett datum utan klockslag betyder slutet av den dagen. Midnatt skulle göra saken försenad hela den dag den ska vara klar.

En och samma snabbgrammatik fungerar överallt: varnish the tiller #boat @boatyard due:fri +marigold läses likadant i skalet, i tmux-popupen, i terminalgränssnittet och på webben. Båda gränssnitten har en kommandorad bakom : som tar vilket jpim-kommando som helst, för när musen ligger för långt bort.

Terminalens kalender är inte en andra implementation av kalendern. Det är kommandoradens egen ritare som lämnar över samma rader. Markörerna betyder något även utan färg: en punkt för ett möte, en romb för en tidsgräns, en triangel för något försenat.

Platser är namngivna cirklar på en karta, och en uppgift kan vänta vid en av dem.

Ytor
Demon, kommandorad, terminalgränssnitt, webbapp, skrivbordsskal, ett neovim-tillägg och en tmux-popup
Gjord av
Rust: axum, SQLite, ratatui, Tauri. Webbappen är Svelte, inbäddad i demonen
Ändpunkter
35, var och en med sitt eget kommando; annars faller bygget på ett test
Status
Fungerar på varje yta den föresatte sig att ha
Källkod: inte offentlig än
WebbläsareToday, i webbläsaren. Taggar, platser, försenade tidsgränser i rött, och filerna en uppgift pekar på listade under den.
TerminalOch i terminalen: oktober med sin agenda bredvid. Varje rad i rutnätet är ritad av kommandoraden.
WebbläsareDirektiv: varje @jpim som hittats i ett projekts källkod, med fil, rad och TOML-texten som den står.
WebbläsarePlatser. Fem cirklar på en karta över Falmouth, var och en med uppgifterna som väntar där.
WebbläsareKommandoraden, mitt i en mening, med en plats ifylld av Tab.
TerminalUppgifter i terminalen: försenade först, deluppgifter indragna, ett blekt märke på dem som kom från en fil.
TerminalEn uppgift, öppnad: förfallodag, taggar, plats och två numrerade hänvisningar att öppna.
KommandoradInget gränssnitt alls: en vecka tvärs över terminalen, en dag, och allt som är taggat #varnish.

Skrivbord

jphone

Telefonen ligger kvar i rummet intill. Dess sms, kamera, kontakter och position kommer till tangentbordet.

Att svara på ett sms borde inte kräva att man tar upp apparaten det kom till. jphone lägger hela telefonen i ett kommando och en terminalskärm.

Fem flikar: Messages, Contacts, Camera, Location, Status. Foton visas i terminalen som foton. Skrivfältet räknar sms-delar medan du skriver, och talar om vilket tecken som just tvingade över meddelandet till det dyra alfabetet, 70 tecken per del i stället för 160.

Varken terminalskärmen eller webbappen läser någonsin en datafil. Varje flik ritas av det kommandoraden svarar och varje handling kör kommandoraden, så allt finns i en enda implementation och går att skripta.

Oläst är ärligt. En skärm som ingen tittar på läser ingenting.

Telefonen har ingen server att ansluta till. Den ringer in över SSH till ett begränsat inloggningsskal och håller ett långt wait öppet som sin kanal för nyheter. När den sover på mobildata väcks den av ett enda UDP-paket, och är uppe ur djupsömn på två till fyra sekunder.

Hitta-min-telefon är inbyggt: en färsk position, en inspelning av var den har varit, och en signal på full volym även när den är tystad, med en ”Found it”-knapp åt den som gräver fram den ur soffan.

Kommentarer och taggar på ett foto skrivs in i själva JPEG-filen, så de följer med vart filen än tar vägen.

Ytor
En kommandorad, en terminalskärm med fem flikar, en webbapp, och Android-appen i andra änden
Gjord av
Go och Bubble Tea på skrivbordet; Svelte i webbläsaren; Kotlin på telefonen
Färdas via
SSH över WireGuard, ett kommando per förfrågan. Ingen serverport någonstans
Lånar
jcat för att rita foton, jkarta för att rita kartan, jpim för vad du är skyldig varje kontakt
Källkod: inte offentlig än
TerminalMeddelanden, i en terminal. Sex olästa konversationer, en öppen, och dess foto ritat på plats av jcat.
WebbläsareSamma konversationer i en webbläsare: en grupp på fyra, strecket ovanför det som är nytt, och skrivfältet.
TelefonOch, om man nu envisas, på en telefon.
TerminalPosition. Telefonens tillstånd, tre inspelningar och en promenad runt Central Park ritad som en bild i terminalen.
TerminalKamera. Varje foto och film med taggar och kommentar; p tar ett nytt från andra sidan huset.
TerminalEtt svar skrivs. Räknaren på nedersta raden säger ”1 part, 10 left”.
WebbläsarePosition på webben: färsk position, ring, spela in, och samma karta, som inte heller sidan har ritat.
WebbläsareKamerarullen, med redigeraren för kommentar och taggar öppen på en fyr.
TerminalKontakter, var och en med de anteckningar och uppgifter i jpim som nämner dem.

Maskinrum

jstatus

Allt som är värt en blick, på en skärm, upplagt så som en kaklande fönsterhanterare skulle göra det.

TerminalOverview. En klocka, maskinen, sex värdar (en av dem nere sedan tre timmar och tjugotvå minuter), de senaste loggraderna från en annan maskin och dagens möten.

En panel är en flik. En flik består av widgetar, inramade rutor i nästlade lådor. Varje dator får sin egen, eftersom en bärbar och en server inte vill veta samma saker.

Maskinens widgetar täcker processorn och dess historik, minne, givare, diskar och deras trafik, nätverket, de mest upptagna processerna. Andra blickar utåt: vilka värdar som svarar och hur fort, de senaste posterna i jlogger, kalendern från jpim, en stor klocka, och vad helst ett kommando du anger får för sig att skriva ut.

Upplägget redigeras på plats, med tangenterna från en kaklande fönsterhanterare. Dela med v och s, knuffa runt en ruta med HJKL, märk två och låt dem byta plats, ångra. En trådmodell visar resultatet i sin verkliga storlek i teckenrutor.

Det finns en demon för att ”nere sedan 3 h” ska vara sant oavsett om någon hade en panel öppen.

Den demonen har ingen autentisering och ingen öppen port. En panel når den genom ssh -W och talar HTTP genom röret, så en SSH-inloggning är grinden.

Varje ruta släpper detaljer innan den släpper utrymme: ett diagram blir en miniatyrkurva och sedan ingenting; kolumner lämnar i en dokumenterad ordning. Och givarwidgeten slutar fråga ett vilande grafikkort, eftersom frågan om hur varmt det är skulle hålla det vaket för alltid.

En trasig inställningsfil stoppar ingenting. Den blir en flik med en varningsskylt på.

Ytor
Ett terminalgränssnitt, en liten demon som håller vakt, och ett kantlöst skrivbordsfönster
Gjord av
Go med Bubble Tea och Lip Gloss; fönstret är 280 rader C, GTK och VTE
Ställs in i
KDL, en liten fil per panel, eller inte alls: det finns en editor
Widgetar
Sexton, från cpu till command, som ramar in vad ett program än skriver ut
Källkod: inte offentlig än
TerminalMachine: processorhistorik i punktskrift, två diskars trafik speglad, givare och processer.
TerminalNetwork: tio värdar med svarstidskurvor, två världsklockor, sexton loggrader.
TerminalEditorn: upplägget som ett träd, en widgets egenskaper och en levande trådmodell.
TerminalEn månad ritad av jpim självt, och en tidvattentabell från ett skalskript, båda inramade som inbyggda widgetar.
TerminalEn ruta delas: skriv för att filtrera bland de sexton sorternas widgetar.
TerminalÅttiofyra kolumner. Åtta rutor viker ihop sig; öppna bilden för att se alltihop.

Maskinrum

jlogger

Ett ställe där varje maskin i huset kan säga vad som hände, och en hashkedja som håller det ärligt.

Cron-jobb, säkerhetskopieringsskript, en givare i växthuset, en skrivare som blir klar klockan fyra på morgonen. Alla har något att rapportera, och syslog på sex maskiner är sex ställen att leta på.

Varje post lagras tillsammans med hashen av den föregående, hela vägen tillbaka till en första post vars föregångare är ordet genesis. Ändra en rad och varje hash efter den blir fel; jlog verify pekar ut det första felaktiga id:t. En andra kopia som bara går att lägga till i, och ett tjänstekonto avklätt varje rättighet, gör kedjan ännu svårare att skriva om i tysthet.

Vem som helst på nätverket får logga. Klienter som bryr sig kan signera det de skickar, och servern kontrollerar signaturen innan den tar emot ett ord.

Att skicka en loggpost avslutas alltid med noll. En loggserver som ligger nere får aldrig vara skälet till att säkerhetskopieringen inte gick.

Logginnehåll behandlas som fientligt. Det lagras byte för byte, så att hasharna håller, men visarna oskadliggör styrtecken och tecken som vänder skrivriktningen, så att inget meddelande kan måla över din terminal eller förfalska raden ovanför.

Webbvisaren ritas på servern och frågar var tredje sekund efter något nyare. Sortera på något annat och den slutar skjuta in rader under dig, och erbjuder i stället en räknare över vad som är nytt.

Ytor
En demon, kommandoraden jlog, en terminalvisare, en webbvisare, och en zsh-klient för maskiner som inte har annat än jq
Gjord av
Omkring 2 600 rader Go, SQLite i ren Go, HTML som ritas på servern
Tillit
En SHA-256-kedja över varje post; Ed25519-signaturer för klienter som vill ha dem
Körs på
amd64, arm64 och armv7, paketerad för Arch och Debian
Källkod: inte offentlig än
WebbläsareVarningar och värre, det värsta först. Någon blev av med strömmen; en jordgivare har ljugit om tomaterna.
KommandoradKedjan, verifierad; sedan en rad ändrad bakom ryggen på servern, och kedjan bruten på exakt den raden.
WebbläsareEn värds natt: en säkerhetskopiering från start till synkning utanför huset, i Gruvbox, ett av sju teman.
TerminalEn signerad post i terminalvisaren, med sin hash, föregångarens, och utslaget om signaturen.

Så gjordes numret

Programmen

Tio projekt av en människa och en LLM, skrivna för ett hushåll: en verkstad med en 3D-skrivare, en segelbåt, en telefon och väldigt många terminaler. De delar vanor snarare än kod. Alla har en riktig kommandorad. Demonerna är små och säger vad de är. Data ligger kvar på maskiner man kan lägga handen på. Där två program behöver varandra kör det ena det andras kommando och läser vad det skriver ut.

Källkoden

Inte offentlig än. Om någon sida här fick dig att vilja läsa koden bakom den är det precis sådant som kan ändra på saken.

Papperet

Statisk HTML, en stilmall och några dussin rader skript för bildvisaren. Typsnittet är Noto Serif Display, nedskuret till de bokstäver numret använder och serverat härifrån. Ingenting på den här sidan ringer hem någonstans.