Elma: det agent-system jeg byggede på barsel
.............. .......::::::..... .....::::::::::::... .....::::::----:::::... ...::::---------:::... ..... ::::------------:::.. .......... ::-----=====----:: .............. :----=======---::. ############### ### ### ..... ### .. ######### .....:::::::.... ---=========--:::. ############### ### ### ### ######### .....::::::::::... --=========---::.. ### ### ###### ###### ### ### ....:::::::::::::.. --========---::... ### ### ###### ####@@ @@@ :::.. ### ....:::::-----::::. --=======---:::.. ### ### ### ### #@@ @@@ -:::: ### ....:::::------:::: ---=====---:::.. ### ### ### ### ##@ @@@ ### .....::::-------::: ----------:::.. ############ ### ### ### ##@ @@@@@@@@@###### .....:::::------::: :--------:::.. ############ ### ### ### ### @@@@@@@@@###### ......:::::----:::: :::----::::.. ### ### ### ### @@@ ### .......:::::::::::. :::::::::... ### ### ### ### @@@ ---:: ### ......:::::::::.. ...:::::... ### ### ### ### @@@ --::: ### ......:::::::... ......... #** ### ### ### @@@ ::::. ### ......:::..... ...... *********###### ############### ### . ### @@@ ::... ### ........... ************### ############### ### .. ### ### .... ### ......... ... .. ....... .......:::....... ..... ............. .... ... ...... ......... ............ ................ > elma --status_ o 2 agenter kører
Noget af det fedeste, jeg har lavet indtil videre på min barsel, er Elma.
Elma er et værktøj til agent-orkestrering. Altså et system, der kan oprette AI-agenter og sætte dem til at løse opgaver for mig.
Jeg er langt fra den første, der laver sådan et system. Der findes allerede hundredvis af dem. Alligevel manglede jeg altid det sidste. Og nu hvor vi har AI til at hjælpe os, er det hurtigere (og sjovere) at bygge sit eget end at bruge noget færdigt eller bruge tiden på at sætte sig ind i et open source-værktøj, før man kan bygge videre på det.
Fra et par timer til rigtig mange
Elma startede som et lille værktøj, der skulle hjælpe mig med at løse konkrete opgaver, mest kodeopgaver. Planen var et par timers arbejde. Før jeg vidste af det, var der gået rigtig mange timer, og en masse nye funktioner var blevet shippet.
PLANLAGT ##................................................ 2 timer FAKTISK #####################################............. 111 timer -------------------------------------------------------------------------- 0fdc7f1 shipped grok build via cli fa169e4 shipped github-integration b2f38b8 shipped slack-integration 857d6fd shipped vercel-integration 67d044e shipped noter i et git-repo 775b058 shipped design.md-bibliotek 3d6bbca shipped indstillinger (alt for mange) 8da6bf2 shipped forside med widgets bad59ec shipped custom composer 4200335 shipped ask: bare chat > 27ec3b6 shipped agent-visning i realtid elma/main 12 af 16 features
En server der aldrig sover
Jeg ville have et sted, hvor mine agenter kunne arbejde, uden at min MacBook skulle stå tændt døgnet rundt. Så jeg begyndte at undersøge mulighederne. Så kom jeg i tanke om, at jeg havde en Ubuntu-VPS hos Hostinger, som jeg aldrig havde fået opsagt. Den havde tidligere kørt en Hermes-agent, men efter Grok Bot kom til, blev den ligegyldig, og jeg glemte simpelthen at opsige den.
Nu havde jeg en VPS. Men hvordan pokker får jeg en agent til at snakke med en server?
Hmm...
Løsningen var selvfølgelig at hoste hele projektet på VPS'en. Så kører det hele lokalt, og jeg kan samtidig bruge det, der ligger på serveren, som CLI-værktøjer og lokale data. Det blev også nyttigt senere, da jeg skulle lave lokale databaser.
Nu kørte værktøjet, og jeg kunne tilgå det fra min private IP herhjemme. Så langt, så godt.
\|/ kl. 12:20 -O- /|\ .---------------------. +---------------------+ | .-----------------. | | [ ] :.|:...:| 01 | | | > elma | | |---------------------| | | opgave sendt | | opgaver | [ ] .:|:|:|:. 02 | | | | | --------->--------->- |---------------------| | '-----------------' | | [ ] :....||:: 03 | '---------------------' +---------------------+ /_______________________\ ______________________________________________________________________________ MacBook online VPS hostinger · ubuntu sender opgaver o kører 3 opgaver løst
Integrationer, fordi man kan
Så kom det, jeg ofte sidder med: der skulle kobles forbindelser på. GitHub, Slack, Vercel og mange, mange flere.
Nu hvor vi har AI, kunne vi lige så godt gøre det “rigtigt”. Ikke fordi der var brug for det, for systemet er mit eget og kun til mig. Men fordi det er nemt, og fordi jeg sover bedre om natten når det er helt færdigt. Så jeg byggede et helt bibliotek af integrationer. Man kan jo lige så godt tilføje en masse ting, man aldrig får brugt.
[ GitHub ]
|
[ + mange flere ] | [ Slack ]
(aldrig brugt) | ////
\\\ | ////
\\\ | ////
\\\ | ////
+------------+
| |
[ Hostinger ] ------------- | ELMA | o.------------- [ Vercel ]
| |
+------------+
//// | \.o
//// | \\\
//// | \\\
//// o \\\
[ Hetzner ] . [ Grok Build ]
|
|
[ DeepSeek ]
5 kaldNu havde jeg tre ting på plads:
- En VPS, hvor mit værktøj kører.
- Agenter: Grok Build, som kører via CLI'en på min VPS, og DeepSeek Flash til almindelig chat og de AI-funktioner, der ligger rundt omkring i systemet.
- GitHub, så mine agenter har et sted at gemme deres kode.
Opdateringer med ét klik
Min næste udfordring: jeg vidste, at jeg ville blive ved med at bygge på systemet, men jeg gad ikke sidde fast i en terminal med en SSH-forbindelse til min VPS og derfra bruge Claude, Grok eller andet.
Løsningen var egentlig ret simpel. Jeg installerede Git på VPS'en og skrev et script, der holder øje med, om mit GitHub-repo har nye ændringer i forhold til den version, der kører på serveren. Er der det, dukker der en “Opdater”-knap op. Et klik, og scriptet henter ændringerne, installerer dem og genstarter hele systemet. Done.
+------------------------+ +------------------------+ | GITHUB | git fetch | VPS | | byhartvig/elma | <--------------------o | /srv/elma | | main b09516a | ens | kører b09516a | | | == | | +------------------------+ +------------------------+ alt er opdateret +-------------+ | OPDATER | +-------------+ seneste opdatering: ingen endnu > git pull origin main .................... [ ] > npm ci .................................. [ ] > npm run build ........................... [ ] > genstart elma ........................... [ ]
Bagefter lavede jeg rigtig mange ændringer, især i UI'et, for det er en af mine største kærligheder ❤️

Hvad Elma kan
Lige for at opsummere, så kunne systemet nu det her:
- Agenter, der løser opgaver i mine repos, hver på deres egen branch.
- Integrationer til AI-modeller, GitHub, Slack, servere og meget mere.
- Noter, gemt i et Git-repo eller på serveren.
- Design: et bibliotek af design.md-filer og instruktioner, som agenterne følger, og som kan hentes direkte fra mine Git-repos.
- Indstillinger med alt for mange muligheder.
- En forside med widgets, der viser det vigtigste, og en custom composer til at sende opgaver afsted.
- Ask, et chatinterface, hvor man bare kan chatte i stedet for at sætte agenter i gang.
- Agent-visning, hvor jeg kan følge med i realtid i, hvad en agent laver.
- Boxes, en liste over de servere, jeg har koblet på, med mulighed for hurtigt at starte flere op, fx hos Hostinger eller Hetzner.
- Memory, hvor agenterne gemmer det, de lærer undervejs, fx hvordan jeg vil have tingene lavet, eller noget om mig.
- Schedules, hvor jeg hurtigt kan sætte agenter til at køre faste opgaver, ligesom cron jobs.
main -------o------o-oo-------o--o-----oo-------o--------o--------o-o------oo-o----
\/ \ \ / / \
/\ \ \ / / / \
ing-ci --o----o--o--o \ \ o agent/opdater-forside --o---/-o \
\ \ / / \
\ \ / / \
\ o agent/dark-mode --o--/----o--o \
\ /
\ /
o agent/ny-widget --o---o----o-o
o commit \ ny branch / merge til main 1 agent i gang · 4 mergedSystemet var færdigt. Det var lækkert, og det hele spillede.

Men der manglede noget
Alligevel ikke helt. Det føltes, som om der manglede liv. Noget, der virkede, som om det tænkte selv. Og ja, jeg er ikke Dario fra Anthropic, så jeg ved godt, at en AI ikke er levende. Heller ikke selvom den har en SOUL.md-fil.
Et system, der kører agenter døgnet rundt, burde også kunne forbedre sig selv. Både ud fra de workflows, det kører, og med tiden, når det (og jeg) ved bedre, hvor vi skal hen.
Derfor byggede jeg endnu en agent oven på mit agent-system. Den hedder Steward. Den holder øje med alt i systemet: de andre agenter, hvad de laver, og hvordan deres arbejdsgange kører. Den overvåger også mine Git-repos, mine pipelines og de fejl, der opstår. Og så lærer den, hvordan jeg arbejder.
....... STEWARD ser på systemet \ ....... ....... ------------------------------------------ .... .... > ny commit i byhartvig/Portfolio ... ... > du skrev 507 gange i dine noter .. o schedules > du er mest aktiv 08:00-11:00 ... . . . . . ... > alle schedules kører til tiden ... . o . ....... > agent #14 h .. . . ........... .. . ............... ------------------------------------------ ... +................... .. . +::::............ FORSLAG widget · fra dine vaner .. . . ++:::o:agent #14 ... . #++::::::::... Dine to-dos på forsiden ... . . . . . #+++::::... De åbne to-dos fra alle dine noter, dem .. #+++:.. med kortest frist først. ... ##... .... . .... ....... ....... ....... [ Godkend ] [ Ikke nu ]
Steward “lever” bare i systemet. Når den ser noget, der kan tilføjes, ændres eller fjernes, foreslår den det, og jeg godkender med et klik. Hvis jeg beskriver, hvad jeg gerne vil se på forsiden, designer den endda selv en ny widget til mig.

Fremtiden er skræddersyet
Jeg tror på, at den slags modulære systemer er fremtiden. Systemer, der er skræddersyet til dig, mig eller svigermor. Systemer, der “kender” dig og derfor ved, hvad der skal laves, måske før du selv gør.
AI er fedt. Og det bliver kun federe.