Webentwicklung ohne SPA: Wie Clash mit VLang, Veb und htmx entsteht

Webentwicklung ohne SPA: Wie Clash mit VLang, Veb und htmx entsteht

Zurück zum Server: Eine Meetup-Plattform mit VLang, SQLite und htmx

Abstract

Die Meetup-Plattform Clash zeigt, wie eine vollwertige Web-App mit VLang, Veb, SQLite und htmx entsteht – serverseitig gerendert, sicher und ganz ohne klassisches JavaScript-Framework.
  • #React
  • #React Performance
  • #React Compiler
  • #useTransition
  • #useDeferredValue
  • #Code-Splitting
  • #Lazy Loading

Clash im Praxistest: Moderne Web-Apps ganz ohne JavaScript-Framework

Wer heute ein neues Webprojekt beginnt, greift fast reflexartig zu Next.js, SvelteKit oder Nuxt. Das ist ein bisschen so, als würde man für jede Fahrt zum Bäcker automatisch den Kombi mit Anhängerkupplung nehmen, auch wenn das Fahrrad völlig ausreichen würde. Das Projekt Clash geht bewusst einen anderen Weg: eine serverseitig gerenderte Web-App, gebaut mit VLang, dem Webframework Veb, SQLite und htmx 4. In diesem Artikel schauen wir uns Schritt für Schritt an, wie diese Anwendung funktioniert, was der Ansatz im Alltag bedeutet und wo seine Grenzen liegen.

Warum überhaupt ohne JavaScript-Framework?

Der Grundgedanke hinter Clash ist erfrischend einfach: Der Server behält die Kontrolle. Es gibt keinen React-State, keinen Client-Router und keine eigene API-Schicht, die nur existiert, damit das Frontend Daten abholen kann. Stattdessen gilt eine klare Arbeitsteilung, der Server verwaltet den Zustand, Templates erzeugen HTML, htmx lädt bei Bedarf einzelne Teile der Seite nach, und JavaScript kommt nur dort zum Einsatz, wo der Browser es wirklich braucht, etwa bei interaktiven Karten.

Man kann sich das wie ein gut geführtes Restaurant vorstellen: Die Küche (der Server) bereitet die Gerichte zu, der Kellner (htmx) bringt nur die Teller an den Tisch, die sich geändert haben. Der Gast muss nicht selbst kochen. Das wirkt auf den ersten Blick fast altmodisch, passt aber erstaunlich gut zu vielen Anwendungen mit Formularen, Listen und Arbeitsabläufen.

Der Stack im Überblick

Clash setzt auf VLang 0.5.x als Backend-Sprache, Veb als Webframework und SQLite als Datenbank. Das Frontend besteht aus serverseitigen Templates, ergänzt durch htmx 4 für gezielte Interaktivität. Gestaltet wird mit Tailwind CSS, Karten liefert Leaflet auf Basis von OpenStreetMap, und die Authentifizierung läuft über eigene Cookie-Sessions mit bcrypt-gehashten Passwörtern.

Was ist Clash eigentlich?

Clash ist eine kleine Social-Plattform für Meetups, also keine reine Demo-Seite, sondern eine Anwendung mit echtem Alltag: Login, Berechtigungen, Datenmodell und Arbeitsabläufen.

Die Bausteine der Anwendung

Das Herzstück bilden sechs Kernobjekte: registrierte Nutzer, Venues (Orte, optional mit Koordinaten), Clashes (die eigentlichen Events), Participations (Teilnahme-Anfragen mit Status), In-App-Benachrichtigungen und Login-Sessions. Diese überschaubare Menge an Objekten reicht aus, um alle typischen Herausforderungen einer echten Web-App abzubilden.

Ein typischer Ablauf

Stellen wir uns Anna vor, die einen Spieleabend organisieren möchte. Sie legt einen Clash an. Ben entdeckt das Event und fragt seine Teilnahme an, ähnlich wie ein Klingeln an der Tür. Anna sieht die offene Anfrage, kann sie annehmen oder ablehnen, und Ben erhält anschließend eine Benachrichtigung. Genau dieser Ablauf macht Clash zu einem guten Testfall, denn er verlangt mehr als simple Listen: Eigentumsregeln, Statusübergänge, Datenbank-Constraints und partielle Aktualisierungen der Oberfläche.

Die Architektur: So übersichtlich wie ein Behördengang

Der Request-Flow

Der Weg einer Anfrage durch die Anwendung ist bewusst geradlinig gehalten: Der Browser schickt eine Anfrage, ein Veb-Route-Handler nimmt sie entgegen, spricht mit SQLite beziehungsweise der Domänenlogik, ein Template rendert das Ergebnis und zurück kommt entweder eine vollständige HTML-Seite oder ein htmx-Fragment. Keine Umwege, keine versteckten Zwischenschichten.

Die Anwendung startet in einer zentralen Datei, in der die Datenbank initialisiert, das statische Verzeichnis registriert und der Server auf Port 8080 gestartet wird. Eine pragmatische Eigenheit: Die Datenbankverbindung liegt als globale Variable vor, weil der zentrale Vorab-Hook von Veb keinen direkten Zugriff auf den App-Zustand hat. Elegant ist das nicht unbedingt, aber ehrlich und der Build berücksichtigt es über ein entsprechendes Compiler-Flag.

Zentrale Zugangskontrolle mit before_request

Einer der angenehmsten Aspekte der Architektur ist der zentrale before_request-Hook. Er funktioniert wie ein Pförtner am Werkstor: Bevor irgendein Handler zum Zug kommt, prüft er bei verändernden Formular-Anfragen den CSRF-Schutz, lädt die Session aus dem Cookie und leitet nicht eingeloggte Besucher auf die Login-Seite um, inklusive Rücksprungadresse. Die einzelnen Handler müssen sich dadurch nicht mehr selbst um die Frage kümmern, ob überhaupt jemand eingeloggt ist. Sie konzentrieren sich auf ihre fachliche Aufgabe.

pub fn (mut ctx Context) before_request() {
	path := ctx.req.url.all_before('?')

	if is_mutating(ctx) && is_form_post(ctx) && !csrf_ok(ctx) {
		ctx.res.set_status(.forbidden)
		_ := ctx.html('Cross-site form submissions are forbidden')
		return
	}

	if token := ctx.get_cookie(session_cookie) {
		if user := find_session_user(token) {
			ctx.user = user
			ctx.session_token = token
			renew_if_needed(mut ctx, token)
		}
	}

	if is_public_path(path) {
		return
	}

	if ctx.user == none {
		target := '/login?redirectTo=' + urllib.query_escape(path)
		_ := ctx.redirect(target, typ: .see_other)
	}
}

Der CSRF-Schutz ist dabei bewusst schlank gelöst: Bei mutierenden Requests wird verglichen, ob der Origin-Host zum Request-Host passt. Für eine produktive Anwendung, insbesondere hinter Proxies, wäre ein echtes CSRF-Token die robustere Wahl, das räumt das Projekt selbst offen ein.

fn csrf_ok(ctx &Context) bool {
	origin := ctx.get_header(.origin) or { '' }
	if origin == '' {
		return false
	}

	host := ctx.get_header(.host) or { '' }
	origin_host := origin.all_after('://')
	return origin_host == host
}

Serverseitiges Rendering mit htmx

Fragmente statt ganzer Seiten

Die zentrale Idee von htmx lässt sich in einem Satz zusammenfassen: Der Browser fragt HTML an, nicht JSON. Bei einer normalen Seitenanfrage bettet Veb den Inhalt in ein Layout ein. Kommt die Anfrage jedoch von htmx, erkennbar am HX-Request-Header, liefert der Server nur das benötigte Fragment zurück. Der Handler prüft also lediglich, wer fragt, und antwortet passend.

Beispiel: Die Live-Suche

Besonders anschaulich wird das bei der Suche in der Event-Liste. Ein Suchfeld ist mit htmx-Attributen versehen, die bei jeder Eingabe (mit kurzer Verzögerung von 250 Millisekunden) eine Anfrage an den Server schicken. Dieser rendert nur die Liste neu und htmx tauscht den entsprechenden Bereich der Seite aus. Der Nutzer erlebt eine flüssige Live-Suche, ganz ohne eine Zeile eigenen JavaScript-Codes. Der Server entscheidet, wie der neue Zustand aussieht, so wie ein Regisseur, der jede Szene selbst abnimmt.

<input
	type="search"
	name="q"
	value="@{esc(q)}"
	placeholder="Search by title..."
	hx-get="/clashes"
	hx-trigger="input changed delay:250ms"
	hx-target="#clash-list"
	hx-swap="innerHTML"
/>

<div id="clash-list">
	@include '_clash_list'
</div>

Sicherheit: Wo man genau hinschauen muss

Templates und der XSS-Fallstrick

Ein wichtiger Punkt, der Einsteiger überraschen kann: Veb-Templates escapen Benutzereingaben nicht automatisch. Man kann sich das wie eine Haustür ohne automatisches Schloss vorstellen, sie schützt nur, wenn man selbst abschließt. Das Projekt setzt deshalb konsequent einen eigenen Escape-Helfer ein, der kritische Zeichen wie spitze Klammern und Anführungszeichen in ihre HTML-Entitäten umwandelt. Jede Ausgabe von Nutzerdaten muss durch diese Funktion laufen. Wer das an einer Stelle vergisst, öffnet potenziell die Tür für Cross-Site-Scripting. In Frameworks mit Auto-Escaping ist diese Fehlerklasse deutlich stärker abgefedert, hier ist Disziplin gefragt.

pub fn esc(s string) string {
	return s
		.replace('&', '&amp;')
		.replace('<', '&lt;')
		.replace('>', '&gt;')
		.replace('"', '&quot;')
		.replace("'", '&#39;')
}

Passwörter und Sessions: Der Garderobenmarken-Trick

Bei der Authentifizierung zeigt Clash, wie man es richtig macht. Passwörter werden mit bcrypt gehasht, wie es sich gehört. Noch interessanter ist der Umgang mit Sessions: In der Datenbank landet nicht das rohe Session-Token, sondern nur dessen SHA-256-Hash. Das Prinzip erinnert an eine Garderobe: Der Gast bekommt die Marke (das rohe Token im Cookie), das Personal führt nur eine Liste mit Prüfnummern. Würde die Session-Tabelle einmal in falsche Hände geraten, wären die Tokens nicht direkt verwendbar. Das Cookie selbst wird mit HttpOnly, SameSite=Lax und im Produktivbetrieb zusätzlich mit dem Secure-Flag gesetzt.

SQLite und das handgeschriebene Schema

Das Datenmodell wird in V zwar als Structs mit ORM-Annotationen beschrieben, die eigentliche Datenbankdefinition ist jedoch bewusst von Hand geschrieben. Der Grund: Die Annotationen des V-ORM können nicht alle gewünschten Regeln ausdrücken, etwa das automatische Löschen abhängiger Datensätze (ON DELETE CASCADE) oder das Nullsetzen von Referenzen (ON DELETE SET NULL).

@[table: 'clashes']
pub struct Clash {
pub mut:
	id          string @[primary]
	title       string
	description ?string
	starts_at   time.Time
	host_id     string
	venue_id    ?string
	created_at  time.Time
}

Besonders wichtig ist die Tabelle der Teilnahmen. Eine Check-Constraint erlaubt nur die Status-Werte "pending", "accepted" und "declined", und eine Unique-Constraint stellt sicher, dass jeder Nutzer pro Event nur genau eine Teilnahme haben kann. Die Datenbank fungiert damit als letzter Wächter der Geschäftsregeln, selbst wenn im Code einmal etwas schiefgeht, lässt sie ungültige Zustände gar nicht erst zu.

CREATE TABLE IF NOT EXISTS participations (
	id         TEXT PRIMARY KEY,
	user_id    TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
	clash_id   TEXT NOT NULL REFERENCES clashes(id) ON DELETE CASCADE,
	status     TEXT NOT NULL CHECK (status IN ('pending', 'accepted', 'declined')),
	created_at INTEGER NOT NULL,
	updated_at INTEGER NOT NULL,
	UNIQUE (user_id, clash_id)
)

Der Teilnahme-Workflow als State Machine

Der spannendste Teil der Geschäftslogik ist der Teilnahme-Ablauf, der wie eine kleine Ampelschaltung funktioniert: Eine Anfrage steht zunächst auf "pending", der Host schaltet sie auf "accepted" oder "declined", und nach einer Ablehnung darf erneut angefragt werden.

Die gesamte Logik steckt in einer zentralen Funktion. Sie prüft zunächst, ob der Anfragende nicht zufällig selbst der Gastgeber ist, behandelt dann bestehende Teilnahmen je nach Status unterschiedlich und legt andernfalls eine neue Anfrage an, jeweils mit Benachrichtigung an den Host. Der HTTP-Handler bleibt dadurch angenehm dünn: Er holt Nutzer und Event, ruft die Domänenfunktion auf und übersetzt deren Ergebnis in eine HTTP-Antwort. Die Fachlogik entscheidet, was erlaubt ist; der Handler entscheidet nur, wie daraus eine Antwort wird. Diese Trennung ist wie die zwischen Küche und Service, jeder macht das, was er am besten kann.

Benachrichtigungen und Karten

Notifications per htmx-Polling

Das Benachrichtigungs-Badge in der Navigation aktualisiert sich alle 20 Sekunden sowie beim Fokuswechsel zurück ins Browserfenster, gesteuert allein durch htmx-Attribute. Der Server liefert dabei jeweils nur ein winziges HTML-Fragment mit der aktuellen Zahl ungelesener Nachrichten. Auch hier bleibt das Grundprinzip erhalten: kein JSON-State im Browser, nur ausgetauschtes HTML.

<span
	id="notif-count"
	hx-get="/notifications/unread"
	hx-trigger="every 20s, focus from:window"
	hx-swap="outerHTML">
	@include '_notif_count'
</span>

Der Handler liefert nur ein kleines HTML-Fragment:

@['/notifications/unread']
pub fn (mut app App) notifications_unread(mut ctx Context) veb.Result {
	user := ctx.user or {
		return ctx.text('')
	}

	unread := unread_count(user.id)
	return ctx.html($tmpl('templates/_notif_count.html'))
}

Leaflet für die Kartenansicht

Karten sind einer der wenigen Bereiche, in denen echtes Client-JavaScript unverzichtbar ist. Clash bettet die Venue-Daten als JSON in ein Script-Tag der Seite ein, wohlgemerkt mit escapten spitzen Klammern, um Injection-Probleme zu vermeiden. Im Browser liest Leaflet diese Daten aus und setzt Marker auf eine OpenStreetMap-Karte. Die App ist also serverseitig geprägt, aber nicht dogmatisch JavaScript-frei: Wo der Browser gebraucht wird, wird er genutzt.

Licht und Schatten des Ansatzes

Was gut funktioniert

Für Anwendungen dieser Art hat sich der Stack bewährt. Die Request/Response-Struktur bleibt einfach, es gibt kaum Client-State, und die Trennung zwischen Handlern, Datenbankabfragen und Domänenlogik ist klar. SQLite erweist sich als robuste lokale Datenbank, htmx ergänzt kleine, gezielte Interaktionen, und das Deployment reduziert sich im Idealfall auf ein Binary plus ein statisches Verzeichnis. Gerade für CRUD-Anwendungen, Admin-Oberflächen, Workflow-Tools und interne Werkzeuge ist dieses Modell attraktiv, viele davon brauchen schlicht keine große SPA-Architektur.

Wo es hakt

Ehrlich betrachtet gibt es aber klare Kompromisse. V und Veb sind längst nicht so ausgereift wie etablierte Stacks, man muss bereit sein, Dinge selbst herauszufinden. Das fehlende Auto-Escaping der Templates ist der wichtigste Sicherheitspunkt, denn ein einziges vergessenes Escaping kann zu XSS führen. Fragment-Rendering will bewusst geplant sein: Welche Seitenteile funktionieren als Partial, und welche Variablen brauchen sie? ORM und Datenbankschema decken sich nicht vollständig, weshalb handgeschriebenes SQL nötig war. Und obwohl die vorhandene Testsuite Modelle, Auth, Datenbankregeln und den Teilnahme-Workflow gut abdeckt, wären für eine produktionsnähere App HTTP- und Browser-Smoke-Tests der logische nächste Schritt.

Fazit

Clash beweist, dass sich mit VLang, Veb und htmx 4 eine vollständige kleine Web-App bauen lässt, ganz ohne klassisches JavaScript-Framework. Der Stack ist sicher nicht der bequemste Standardweg: Es gibt weniger fertige Middleware, ein kleineres Ökosystem, und bei Sicherheit und Rendering muss man genauer hinschauen. Dafür erhält man eine erfrischend direkte Architektur, in der HTML vom Server kommt, die Datenbank nah an der Domäne bleibt und JavaScript klein und zweckgebunden ist. Die wichtigste Erkenntnis des Projekts lautet: Nicht jede moderne Web-App braucht ein SPA. Für viele Anwendungen genügen ein schneller Server, gute Templates, klare Domänenlogik und eine Prise htmx, so wie eben nicht jede Fahrt zum Bäcker den großen Kombi verlangt.

FAQ

Für welche Projekte eignet sich der Stack aus VLang, Veb und htmx besonders?

Vor allem für CRUD-Anwendungen, interne Tools, Admin-Oberflächen und Workflow-Systeme, bei denen der Server ohnehin die Datenhoheit hat. Wer komplexe, hochinteraktive Oberflächen mit viel Client-Zustand braucht, etwa einen Grafik-Editor, fährt mit einem SPA-Framework weiterhin besser.

Ist der Verzicht auf ein JavaScript-Framework nicht ein Sicherheitsrisiko?

Nicht per se, aber die Verantwortung verschiebt sich. Da Veb-Templates nicht automatisch escapen, muss jede Ausgabe von Nutzerdaten diszipliniert durch eine Escape-Funktion laufen. Wer das beherzigt und zusätzlich auf gehashte Session-Tokens, sichere Cookies und CSRF-Schutz achtet, erreicht ein solides Sicherheitsniveau, nur eben in Handarbeit statt per Framework-Automatik.

Warum wurde das Datenbankschema von Hand geschrieben statt über das ORM generiert?

Weil die ORM-Annotationen von V nicht alle gewünschten Datenbankregeln abbilden können. Verhaltensweisen wie das automatische Löschen abhängiger Datensätze oder Check- und Unique-Constraints ließen sich nur mit handgeschriebenem SQL sauber umsetzen. So wacht die Datenbank selbst über die Geschäftsregeln, unabhängig davon, was im Anwendungscode passiert.

  • Technologien
  • Programmiersprachen
  • Tools

Weitere Blog-Artikel

React-Performance 2026: Warum weniger Optimierung mehr Tempo bringt

Viele React-Performance-Tipps sind veraltet. Anhand eines anschaulichen Autobahn-Vergleichs zeigt dieser Artikel, was 2026 wirklich zählt: richtige State-Platzierung, nebenläufige Features, Code-Splitting und der React Compiler.

mehr erfahren

React-Komponenten verbinden: Welcher Weg passt wann?

Props, Context, Stores, Server State und mehr: So finden Sie für jede Situation den passenden Weg, damit zwei React-Komponenten miteinander kommunizieren.

mehr erfahren

KI-Agenten in der Schleife: Wie sich Claude Code und Codex selbst Aufgaben geben

Was ein Loop wirklich ist, welche vier Typen es gibt und wie du in Claude Code und Codex Agenten baust, die sich selbst prompten, einsteigerfreundlich erklärt.

mehr erfahren

JavaScript 2026: Bun, Deno und TypeScript 7 läuten eine neue Ära ein

JavaScript erlebt 2026 seinen größten Umbruch seit einem Jahrzehnt: drei konkurrierende Laufzeitumgebungen, ein in Go portierter TypeScript-Compiler, Signals in den Frameworks und Werkzeuge in Rust. Dieser Artikel erklärt anschaulich, was dahintersteckt und was Sie jetzt lernen sollten.

mehr erfahren

npm-Pakete sicher prüfen: So vermeiden Sie böse Überraschungen

Ein praxisnaher Ablauf, mit dem Sie ein npm-Paket in fünf bis zehn Minuten bewerten, von Wartung über Provenance bis hin zu Install-Skripten und Sicherheitslücken.

mehr erfahren

npm install unter der Lupe: Wie Angreifer Ihre Software-Lieferkette kapern

Was passiert wirklich, wenn Sie npm install ausführen? Eine anschauliche Einführung in Supply-Chain-Angriffe, reale Fälle wie qix und Shai-Hulud sowie konkrete Schutzmaßnahmen für Ihren Entwickleralltag.

mehr erfahren

Aktuelle Blog-Artikel

React-Performance 2026: Warum weniger Optimierung mehr Tempo bringt

Viele React-Performance-Tipps sind veraltet. Anhand eines anschaulichen Autobahn-Vergleichs zeigt dieser Artikel, was 2026 wirklich zählt: richtige State-Platzierung, nebenläufige Features, Code-Splitting und der React Compiler.

mehr erfahren

React-Komponenten verbinden: Welcher Weg passt wann?

Props, Context, Stores, Server State und mehr: So finden Sie für jede Situation den passenden Weg, damit zwei React-Komponenten miteinander kommunizieren.

mehr erfahren

KI-Agenten in der Schleife: Wie sich Claude Code und Codex selbst Aufgaben geben

Was ein Loop wirklich ist, welche vier Typen es gibt und wie du in Claude Code und Codex Agenten baust, die sich selbst prompten, einsteigerfreundlich erklärt.

mehr erfahren

JavaScript 2026: Bun, Deno und TypeScript 7 läuten eine neue Ära ein

JavaScript erlebt 2026 seinen größten Umbruch seit einem Jahrzehnt: drei konkurrierende Laufzeitumgebungen, ein in Go portierter TypeScript-Compiler, Signals in den Frameworks und Werkzeuge in Rust. Dieser Artikel erklärt anschaulich, was dahintersteckt und was Sie jetzt lernen sollten.

mehr erfahren

npm-Pakete sicher prüfen: So vermeiden Sie böse Überraschungen

Ein praxisnaher Ablauf, mit dem Sie ein npm-Paket in fünf bis zehn Minuten bewerten, von Wartung über Provenance bis hin zu Install-Skripten und Sicherheitslücken.

mehr erfahren

npm install unter der Lupe: Wie Angreifer Ihre Software-Lieferkette kapern

Was passiert wirklich, wenn Sie npm install ausführen? Eine anschauliche Einführung in Supply-Chain-Angriffe, reale Fälle wie qix und Shai-Hulud sowie konkrete Schutzmaßnahmen für Ihren Entwickleralltag.

mehr erfahren

Programmiersprachen 2026: Wenn die KI Rust besser schreibt als der Mensch

Wenn KI den Code schreibt, ändert sich die Wahl der Programmiersprache grundlegend. Warum Rust, Go und Co. plötzlich attraktiver werden, und was das für Python bedeutet.

mehr erfahren

PI Agent vs. Claude Code: Der unterschätzte Open-Source-Konkurrent

PI Agent ist der erste ernstzunehmende Open-Source-Konkurrent zu Claude Code. Wir zeigen anschaulich, was das Tool kann, wie es sich anpassen lässt und wann sich der Wechsel lohnt.

mehr erfahren

Agentic Engine Optimization: So machen Sie Ihre Unternehmenswebsite fit für KI-Agenten

Erfahren Sie, wie Sie mit Agentic Engine Optimization (AEO) Ihre Unternehmenswebsite gezielt für KI-Assistenten wie ChatGPT, Claude oder Perplexity optimieren – inklusive praxisnaher Checkliste für Marketing- und Kommunikationsverantwortliche.

mehr erfahren

Claude Skills für Einsteiger - Individuelle KI-Workflows Schritt für Schritt aufbauen

Erfahre, wie du eigene Claude Skills erstellst, installierst und verwaltest. Mit Skills sparst du dir das wiederholte Einfügen von Anweisungen und sorgst für konsistente Ergebnisse in jeder Konversation.

mehr erfahren

Claude Code richtig nutzen: Diese 15 Profi-Funktionen kennt fast niemand

Boris Cherny, der Erfinder von Claude Code, hat seine 15 liebsten Power-Funktionen verraten. Wir erklären jede einzelne, verständlich, praxisnah und mit konkreten Tipps zum Sofort-Loslegen.

mehr erfahren

Claude Code für Einsteiger: Vom Terminal zur fertigen Anwendung

Erfahren Sie, wie Sie mit Claude Code CLI ohne klassische Programmierkenntnisse echte Software bauen. Von Terminal-Grundlagen über Dashboards bis hin zu MCP-Servern, ein praxisnaher Überblick.

mehr erfahren

OpenClaw im Praxistest: Vom Chatbot zum echten digitalen Assistenten

Erfahre, wie du mit OpenClaw einen autonomen KI-Agenten einrichtest, der Aufgaben erledigt, Tools nutzt und wie ein echter Assistent für dich arbeitet, inklusive Sicherheitstipps und Praxisbeispiele.

mehr erfahren

Das Ende der Menüs: Wie KI unsere Arbeitsumgebung für immer verändert

Seit 40 Jahren navigieren wir durch Menüs, Fenster und Ordner. Doch KI-Systeme wie Claude zeigen: Das war gestern. Wir stehen am Beginn einer neuen Architektur des digitalen Arbeitens – und die meisten merken es noch nicht.

mehr erfahren

Microsoft gegen den Speicherfehler: Warum Rust C und C++ bis 2030 ablösen soll

Microsoft plant, C und C++ bis 2030 durch Rust zu ersetzen. Was steckt hinter dieser Entscheidung, welche technischen und kulturellen Hürden lauern, und was bedeutet das für Entwickler, die heute noch in C++ schreiben?

mehr erfahren

TanStack Start: Das moderne React-Framework, das Next.js herausfordert

TanStack Start ist ein modernes, DX-optimiertes Fullstack-Framework für React mit Server-Rendering, Streaming, Server Functions und durchgängiger TypeScript-Typsicherheit. Was steckt dahinter, und warum ist es eine echte Alternative zu Next.js?

mehr erfahren

Die Ralph Wiggum Strategie: Warum du deinen KI-Coding-Agent einfach machen lassen solltest

Erfahre, wie die Ralph Wiggum Strategie das Arbeiten mit KI-Coding-Agents revolutioniert. Weniger Eingreifen, bessere Ergebnisse – so funktioniert der neue Ansatz.

mehr erfahren

Warum KI dich nicht ersetzt – sondern zum Super-Entwickler macht

Erfahre, warum KI und Vibe Coding keine Bedrohung für Entwickler sind, sondern die größte Karrierechance seit Jahrzehnten. Praktische Tipps für deinen Weg zum Super-Empowered Developer.

mehr erfahren

Von Node.js zu Bun: So holst du mehr Performance aus deinem Next.js-Projekt

Erfahre, wie die Bun-Runtime deine Next.js-Anwendungen beschleunigt. Ein praxisnaher Überblick über Installation, Vorteile und die schrittweise Migration von Node.js zu Bun.

mehr erfahren

Bun.js: Das JavaScript-Schweizer-Taschenmesser, das Node.js alt aussehen lässt

Bun.js ist mehr als nur eine JavaScript-Runtime. Es ersetzt Bundler, Testframeworks und Paketmanager in einem einzigen Binary. Was steckt dahinter, und warum wechseln so viele Entwickler von Node.js zu Bun?

mehr erfahren

KI-Agenten richtig anleiten: So schreibst du Spezifikationen, die wirklich funktionieren

Erfahre, wie du effektive Spezifikationen für KI-Coding-Agenten wie Claude Code oder GitHub Copilot schreibst. Mit praktischen Tipps, bewährten Strukturen und Alltagsvergleichen für bessere Ergebnisse.

mehr erfahren

Was ist .NET? Einfach erklärt für Entwickler, die endlich durchstarten wollen

Was ist .NET eigentlich und warum nutzen es Millionen Entwickler weltweit? In diesem Artikel erklären wir die Plattform von Microsoft von Grund auf: Geschichte, Architektur, Ökosystem und ein erstes einfaches Beispiel.

mehr erfahren

Künstliche Intelligenz 2026: Vom Chatbot zum digitalen Kollegen

Ein anschaulicher Blick auf die wichtigsten KI-Trends 2026: Von Multi-Agenten-Systemen über physische KI bis hin zu Quanten-Computing.

mehr erfahren

Was 2025 uns über künstliche Intelligenz gelehrt hat – und was 2026 kommt

Entdecken Sie die vier wichtigsten KI-Entwicklungen aus 2025 und was dies für 2026 bedeutet: Von unsichtbaren Agenten über Hardware-Engpässe bis hin zu modularen Spezialistenteams. Ein verständlicher Überblick für Einsteiger.

mehr erfahren

REST war gestern: Warum Event-Streams die Zukunft der Backend-Entwicklung sind

Erfahre, warum führende Tech-Unternehmen wie Netflix, Uber und Discord von REST auf Event-Streams umsteigen und wie du diese moderne Architektur in deinen Projekten einsetzen kannst.

mehr erfahren

Shai-Hulud 2.0: Wie ein digitaler Wurm durch das npm-Ökosystem kriecht und was Sie dagegen tun können

Eine verständliche Erklärung des Shai-Hulud 2.0 npm-Wurms: Wie er funktioniert, warum er so gefährlich ist und wie Sie sich schützen können. Mit praktischen Tipps für Entwickler.

mehr erfahren

HTMX: Moderne Webanwendungen ohne JavaScript-Framework bauen

HTMX erobert die Web-Entwicklung zurück. Erfahre, wie du mit dieser schlanken Bibliothek moderne, interaktive Webanwendungen baust, ganz ohne komplexe JavaScript-Frameworks.

mehr erfahren

Electron vs. Tauri: Der praktische Vergleich für Desktop-Apps mit Web-Technologien

Ein praxisnaher Vergleich zwischen Electron und Tauri für die Entwicklung von Desktop-Anwendungen mit Web-Technologien. Erfahre, welches Framework für dein Projekt besser geeignet ist.

mehr erfahren

Architekturkompetenz im KI-Zeitalter: Der Weg zum Full-Stack-Professional

Eine systematische Analyse der sich wandelnden Rollenbilder in der Software-Architektur und die methodische Entwicklung von Full-Stack-Kompetenzen im Kontext moderner KI-Werkzeuge.

mehr erfahren

Omarchy im Test: So macht Linux endlich wieder Spaß

Entdecken Sie Omarchy - das moderne Linux-System, das Ästhetik und Effizienz vereint. Perfekt für alle, die mehr aus ihrem Computer herausholen möchten.

mehr erfahren

JWT und seine Tücken: Warum Entwickler vor JSON Web Tokens warnen

JWT gilt als moderne Lösung für die Authentifizierung, doch erfahrene Entwickler warnen vor den Fallstricken. Erfahren Sie, warum klassische Sessions oft die bessere Wahl sind und wann JWT wirklich Sinn macht.

mehr erfahren

7 KI-Begriffe, die jeder kennen sollte: Von KI-Agenten bis Superintelligenz

Entdecken Sie die sieben wichtigsten KI-Begriffe von Agentic AI bis ASI – verständlich erklärt mit praktischen Beispielen. Perfekt für alle, die die KI-Revolution verstehen möchten.

mehr erfahren

Machine Learning verstehen: Von den Grundlagen bis zu modernen KI-Systemen

Ein umfassender Einstieg in die Welt des Machine Learning: Verstehen Sie die Unterschiede zwischen KI, ML und Deep Learning und entdecken Sie, wie moderne Algorithmen aus Daten lernen.

mehr erfahren

Die Scrum-Master-Rolle auf dem Prüfstand: Architekturperspektiven auf agile Organisationsstrukturen

Eine systematische Analyse der Scrum-Master-Rolle aus Architektursicht: Wann schafft sie Wert, wann wird sie zum organisatorischen Antipattern?

mehr erfahren

Spec-Driven Development: Wie GitHub Spec Kit Ihre KI-Projekte strukturiert

Entdecken Sie, wie GitHub Spec Kit spec-driven development revolutioniert. Lernen Sie die vier Phasen kennen: Spezifikation, Planung, Aufgabenerstellung und Implementierung für strukturierte KI-Projekte.

mehr erfahren

Warum Python, Go und Rust die Zukunft der Softwareentwicklung prägen

Ein umfassender Vergleich der wichtigsten Programmiersprachen: Python, Go, Rust und TypeScript und wie KI-Tools die Wahl der richtigen Sprache beeinflussen.

mehr erfahren

Wie KI-Systeme lernen, sich zu erinnern: Langzeitgedächtnis für Sprachmodelle

Erfahren Sie, wie moderne KI-Systeme mit Langzeitgedächtnis ausgestattet werden und welche technischen Lösungen Entwickler nutzen, um Sprachmodelle mit zuverlässiger Erinnerungsfähigkeit zu versehen.

mehr erfahren

SOLID-Prinzipien in der modernen Webentwicklung: Was funktioniert noch?

Eine praxisnahe Betrachtung der SOLID-Prinzipien für moderne Web-Entwicklung. Erfahren Sie, welche Design-Prinzipien heute noch relevant sind und wie Sie diese in TypeScript-Projekten einsetzen.

mehr erfahren

JavaScript-Frameworks: Warum wir nicht zu viele Frameworks haben, sondern zu wenige Paradigmen

Eine systematische Analyse der strukturellen Probleme moderner JavaScript-Frameworks und warum die Branche nicht an einer Framework-Inflation, sondern an einer Paradigmen-Monokultur leidet.

mehr erfahren

NPM Sicherheit: Best Practices zum Schutz deiner JavaScript-Projekte

Entdecke essenzielle Sicherheitspraktiken für NPM, Yarn, PNPM und Bun. Von pinned dependencies über Lifecycle-Scripts bis hin zu 2FA - so schützt du deine JavaScript-Projekte effektiv.

mehr erfahren

Was dürfen wir für Sie tun?

So sind wir zu erreichen: