Skip to content
Tech briefing

Tech briefing

Dagens tech-nyheder, læst højt på ti minutter. Hver morgen kl. 06 samler en lille Java-app de vigtigste nyheder om AI og softwareudvikling og udgiver dem som en privat podcast og en side, jeg kan skimme på telefonen.

Hvad det er

Jeg følger omkring 20 kilder: nyhedsbreve, forskningsblogs, arXiv, Hacker News, Lobsters og engineering-blogs fra blandt andre Anthropic, Netflix og GitHub. Det er for meget at læse hver dag, men for vigtigt at springe over.

Tech briefing læser det hele for mig, vælger det vigtigste og laver to ting ud af det samme indhold:

  • En MP3-episode i et privat podcast-feed. Den havner i min podcast-app og kan høres i bilen via CarPlay.
  • En skrevet digest som statisk HTML. Den kan lægges på telefonens hjemmeskærm som en PWA og læses offline.

Intentionen

  • Kort og forudsigelig. En episode er på cirka 1.450 ord, omkring ti minutter. Først overskrifter, så AI og machine learning, så softwareudvikling. Jeg kan stoppe når som helst uden at misse det vigtigste.
  • Modellen skriver aldrig links. Hver artikel har et id. Modellen henviser til id’er, og appen indsætter selv de gemte links. Et opdigtet link kan derfor ikke ende i digesten.
  • Altid et direkte link. Hver historie linker til selve artiklen og til diskussionen, hvis der er en.
  • Statiske filer, ingen webapp. Indholdet ændrer sig én gang i døgnet og er ens for alle. Appen skriver filerne til disk, og Nginx serverer dem til både podcast-appen og PWA’en.
  • Billigt i drift. Ét kald til en lille model om dagen, anslået til under to dollars om måneden. Oplæsningen er gratis.

Sådan virker det

  1. Hent. Appen henter alle feeds og gemmer nye artikler i PostgreSQL. Den samme artikel fra flere kilder bliver til én, også når URL’en er stavet forskelligt.
  2. Vælg. Hver kilde har sine egne regler i en YAML-fil: mindste antal point, højeste antal artikler eller nøgleord. En episode har højst 14 historier, og det, der ikke kom med, får en chance næste dag.
  3. Opsummér. Ét kald til Claude Haiku skriver overskrifter og et kort resumé af hver historie. Svaret er struktureret, og tokens og pris bliver logget for hver episode.
  4. Udgiv. Appen skriver dagens side, arkivet og podcast-feedet. Feedet har tidskoder, så jeg kan hoppe direkte til en historie.
  5. Læs højt. Manuskriptet bliver sendt i bidder til en lille tale-service, og appen sætter selv MP3-stykkerne sammen, uden ffmpeg. Kode og tabeller bliver erstattet af en kort bemærkning, så oplæsningen kan følges.
  6. Ryd op. MP3-filer bliver slettet efter 30 dage. Teksten bliver liggende i arkivet.

Nogle indlæg er for gode til at forkorte. En regel pr. kilde kan derfor bestemme, at et indlæg læses op i sin fulde længde. Det gælder for eksempel Martin Fowlers “Fragments”.

Hvis oplæsningen fejler, bliver teksten stadig udgivet, og lyden kan laves senere. Kun de bidder, der mangler, bliver hentet igen.

Tech stack

App

  • Java 25 · Spring Boot 4 · Maven · planlagt kørsel med Spring @Scheduled
  • PostgreSQL 18 med Flyway · JdbcClient uden JPA
  • ROME til feeds · jsoup til artikeltekst · Thymeleaf til de statiske sider
  • Anthropic API med det officielle Java SDK og struktureret svar

Tale

  • Python med edge-tts som en lille HTTP-service

Udgivelse

  • Nginx serverer de statiske filer
  • RSS 2.0 med iTunes-tags og tidskoder · PWA med manifest og service worker

Drift

  • Udvikling i Docker Compose med devcontainer: app, tale, PostgreSQL og Nginx
  • Produktion uden Docker: jar og tale-service under systemd på en Hetzner-server, sat op med Ansible
  • Build og deploy med GitHub Actions
Sidst opdateret