Wish You Were Here

← Artiklar

LocalhostBar

En liten macOS-app i menyraden som visar allt som lyssnar på localhost och låter dig stänga av det med ett klick. Öppen källkod, ren Swift, under en megabyte.

Alla som bygger webb känner igen ögonblicket. npm run dev svarar med att port 3000 är upptagen. Av vad? Ingen aning. Någon dev-server från i tisdags, en Docker-container som aldrig stängdes, eller ett Node-skript som lever kvar i bakgrunden sedan ett projekt du inte ens jobbar i längre. Så börjar letandet: lsof -i :3000, läsa av en PID, kill, testa igen. Det tar en minut varje gång, och den minuten kommer alltid när man är på väg någon annanstans.

Jag tröttnade på den minuten. Och när jag funderade på var lösningen borde bo blev svaret uppenbart. Vad är tillgängligt i princip hela tiden, för dig som sitter på en Mac? Menyraden. Ytan uppe vid klockan är synlig i varje program, i varje fullskärmsläge, mitt i vilket flöde som helst och ändå en enligt mig relativt oanvänd yta. De flesta av oss har en Wi-Fi-symbol, ett batteri och ett klockslag där, sedan ingenting. Det är egentligen konstigt: den enda pixelyta som alltid finns inom räckhåll, och vi låter den stå tom.

LocalhostBar är mitt försök att använda den ytan till något: en liten macOS-app som bor i menyraden och visar allt som lyssnar på localhost och låter dig stänga av det med ett klick. Nu ligger den öppen på GitHub under MIT-licens.

LocalhostBar

Vad den gör

Klicka på ikonen vid klockan så får du en lista över alla portar i lyssnande läge, sorterad efter portnummer. Varje rad visar processens fullständiga namn och PID men också det som visat sig mest användbart i praktiken: vilken projektmapp processen kör i. Tre Node-processer i listan säger ingenting; ~/code/kundprojekt-webb bredvid porten säger allt. En mappikon öppnar katalogen i Finder, en kompassikon öppnar http://localhost:PORT i webbläsaren.

Varje port visar dessutom sin bindadress. Lyssnar processen bara på loopback märks den lokalt; lyssnar den på alla nätverksinterface får den en orange markering. Den detaljen låter teknisk men är värd att ha synlig en dev-server som binder mot 0.0.0.0 är nåbar för alla på samma nätverk, vilket sällan är avsikten på ett kafé eller kontorshotell.

Och så avstängningen, själva poängen. Ett klick på power-ikonen, en bekräftelse, klart. Under huven skickas SIGTERM först, så att processen får chansen att städa efter sig; först om den vägrar dö inom några sekunder eskaleras det till SIGKILL. Samma ordning som en noggrann utvecklare hade valt i terminalen bara utan terminalen.

Siffran uppe i menyraden visar hela tiden hur många egna servrar som är igång. Den fungerar som ett slags samvete: står det 7 en fredag eftermiddag vet man att det är dags att städa.

Medvetet liten

LocalhostBar är byggd i ren Swift med SwiftUI:s MenuBarExtra ingen Electron, inga tredjepartsberoenden, inget ramverk. Hela bygget är ett enda swiftc-anrop, och den färdiga appen väger under en megabyte och rör knappt processorn. Under huven frågar den lsof var fjärde sekund när panelen är öppen och betydligt mer sällan när den är stängd; portar som ägs av systemet (som AirPlay-mottagaren på port 5000 och 7000, en klassiker bland "vad är det som ligger på min port?"-mysterier) hämtas via netstat och visas som systemtjänster.

Lika viktigt är vad appen inte gör. Den gör inga nätverksanrop. Den samlar inte in någonting. Den kan bara påverka processer som den inloggade användaren själv äger systemprocesser visas men rörs inte. Koden är kort nog att läsa igenom på en kaffe, vilket för ett verktyg med kill-behörighet är en egenskap, inte en tillfällighet.

Öppen källkod, byggd lokalt

Appen distribueras som källkod, inte som färdig binär. ./install.sh kompilerar den lokalt på din maskin, lägger den i Program-mappen och registrerar den som inloggningsobjekt så att den alltid finns på plats efter omstart. Det kräver Xcode Command Line Tools och macOS 13 eller senare och det betyder samtidigt att den binär du kör är byggd av kod du själv kan granska, inte något opaket som laddats ner från nätet.

Repot ligger på GitHub: github.com/Wish-You-Were-Here/LocalhostBar. MIT-licens använd, forka, gör vad ni vill. Hittar du en bugg eller saknar något är issues och pull requests välkomna.

Verktyg som försvinner in i vardagen

LocalhostBar började som en personlig irritation och blev klar på dagar snarare än veckor. Det är den sortens verktyg jag tycker om att bygga: små, avgränsade, utan ambition att bli plattformar. De bästa verktygen är de man slutar tänka på som bara sitter där i menyraden, den där alltid närvarande ytan de flesta låter stå oanvänd, och gör att en viss sorts minut aldrig behöver ägnas åt fel saker igen.

Är du nyfiken på hur vi jobbar, eller har en egen återkommande irritation som borde bli ett verktyg eller en del av ditt gränssnitt? Hör av dig.

Vad ska vi göra tillsammans?

KONTAKT

Vill du jobba med oss?

hello@wishyouwerehere.se

Adress

Kyrkogatan 26, 411 15 Göteborg