Zum Inhalt springen

[ Anolilab — Lunora Backend-Framework ]

Vier Dateien und rund vierzig Zeilen. Der Reihe nach gelesen ist das bereits das ganze Modell, denn viel mehr gibt es nicht.

Ein typsicheres Realtime-Backend im eigenen Cloudflare-Account.

[ Anolilab — Schritt 1 von 4 ]

Das Schema ist die Quelle der Wahrheit für Datenbank, Server-Funktionen und Client-Typen. Es gibt keine zweite Definition, die nachgezogen werden muss.

Die Daten einmal beschreiben.

lunora/schema.ts

Weiter: ganz normale Funktionen dagegen schreiben

import { defineSchema, defineTable, v } from "@lunora/server";

export default defineSchema({
  messages: defineTable({
    author: v.string(),
    body: v.string(),
    ts: v.number(),
  }),
});

[ Anolilab — Schritt 2 von 4 ]

Eine Query liest, eine Mutation schreibt, und beide sind ganz normales TypeScript mit typisiertem Kontext. Keine Controller, keine Routing-Tabelle, keine Serialisierung von Hand.

Ganz normale Funktionen dagegen schreiben.

lunora/messages.ts

Weiter: vom Client lesen

import { mutation, query, v } from "./_generated/server";

export const list = query.query(async ({ ctx }) =>
  ctx.db.query("messages").order("desc").take(50));

export const send = mutation
  .input({ author: v.string(), body: v.string() })
  .mutation(async ({ ctx, args }) => {
    await ctx.db.insert("messages", { ...args, ts: Date.now() });
  });

[ Anolilab — Schritt 3 von 4 ]

Queries sind Subscriptions. Die Komponente rendert neu, sobald sich die Daten dahinter ändern, auf jedem verbundenen Client, ohne Socket-Verdrahtung und ohne Cache-Invalidierung.

Die Liste bleibt live.

src/App.tsx

Zuletzt: wo das alles läuft

import { useQuery, useMutation } from "@lunora/react";
import { api } from "../lunora/_generated/api";

const messages = useQuery(api.messages.list) ?? [];
const send = useMutation(api.messages.send);

[ Anolilab — Schritt 4 von 4 ]

Managed Backends verlangen, die Daten auf ihre Server zu verschieben, und rechnen später ab. Lunora deployt dieselben Primitives in den Cloudflare-Account, der dir ohnehin gehört: Projekte im Leerlauf kosten praktisch nichts, und ein Wechsel kostet ein Redeploy.

Es bleibt dein Account.

Cloudflare

Workers

Deine Funktionen laufen als Workers, lokal in derselben Runtime wie in der Produktion.

Durable Objects

SQLite-gestützter State an der Edge. Nach Tenant-Key shardbar oder Lesezugriffe global repliziert.

D1

Relationaler Speicher für alles, was ein einzelnes Objekt überdauert.

R2

Datei- und Blob-Speicher ohne Egress-Gebühren.

Queues

Hintergrundaufgaben und geplante Jobs, ohne zweiten Anbieter.

[ Anolilab ]

Der Kompromiss, auf dem Lunora aufbaut: die Developer Experience eines Managed Backends, auf Infrastruktur, die du kontrollierst.

Wo es einzuordnen ist

LunoraConvexFirebaseCloudflare pur
Typsicher von Ende zu Endepartialselbst bauen
Realtime-Subscriptionsselbst bauen
Läuft im eigenen Account
Skaliert über ein Durable Object hinausn/an/aselbst bauen
Lokale Entwicklung Vite-firstn/an/aselbst bauen

[ Anolilab ]

Der Starter richtet Schema, Dev-Server auf workerd und einen React-Client ein. Lunora ist Alpha-Software: aus dem Alpha-Tag installieren und damit rechnen, dass sich die API noch ändert.

Im Free Tier starten.

  • pnpm dlx lunorash@alpha init my-app
  • cd my-app && pnpm install
  • pnpm dev
Sterne auf GitHub
214
Aktuelle Version
v1.0.0-alpha
Open Source
Apache-2.0

[ Anolilab ]

Lunora entsteht öffentlich und entwickelt sich schnell. Issues, Fragen und Pull Requests sind willkommen.

Gemeinsam bauen

[ Anolilab — Kontakt ]

Erzähl mir, was du baust. Ich sage dir, wie ich helfen kann.

Lass uns reden.

Schnelle Antwort.
Wenn du bereit bist, gemeinsam etwas zu bauen, freue ich mich, von dir zu hören.
Klare nächste Schritte.
Nach der Beratung erstelle ich dir einen detaillierten Plan.
Alternativ kannst du mir direkt eine E-Mail senden an hello@anolilab.com