This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
meistlucid ,. ,MinimalBlog , wie einfach kann ein ASP-. ,NET Blog wirklich Be , ? ,
Monday, 01 December 2025
Einleitung
Wenn du diesem Blog gefolgt bist, könnte es dir aufgefallen sein, dass meine Haupt-Blogging-Plattform......" let' genannt wird.""enthusiastisch gestaltet"MSC5" PostgreSQL UND Vektordatenbanken , semantische und vollständige Textsuche mit GIN-Indizes..., automatisierte Übersetzung in "MSC9"-Sprachen., mehrere gehostete Dienste "MSSK11" Hangfire Job Scheduling" , Prometheus Metriken , Serilog tracing ," HTMX interactions , usign my own nuget packages , und genug Docker Container um ein Schiff eifersüchtig zu machen...MSC17
Dass ,''s vollständig absichtlich ,.' Diese Seite ist mein lebendes Labor, ein Spielplatz, wo ich mit Technologien experimentiere.,-Testeinsatzstrategien messen Leistungseigenschaften und wiederverwendbare Pakete erstellen angenommen zu sein über---engineered, weil dass ,' , wie ich lerne , durch die Lösung von Problemen, die die meisten Blogs Don , ' , nicht tatsächlich haben , um diese Lösungen als offene , - source Bibliotheken andere verwenden können ,
Aber hier ist das Ding Sie wahrscheinlich nicht brauchen, dass eine von denen, um einen Blog zu führen.
Das ist der Grund, warum ich meistlucid-.-MinimalBlog Um zu zeigen, was passiert, wenn man alle Experimente entfernt und sich auf das absolute Wesentliche konzentriert.... keine Datenbank... keine Pipeline bauen... keine Komplexität... nur Markdown-Dateien in einem Ordner, der im Web erscheint.
ANMERKUNG: Siehe das Ende des Artikels für einen Link zur Quelle: ,. Ich plane auf die Freigabe dieses als Nuget-Paket sobald ich Zeit bekomme, um sicherzustellen, dass es 's zuverlässig und es 's perf ist ,' , TOO schrecklich , ( , so suchen Sie für k , 6 , Test Artikel bald
Weniger ist mehr
Das gesamte Projekt ist um ein Prinzip herum konzipiert. Halten Sie es einfachKeine Datenbank...... keine Bau-Pipeline.... kein JavaScript-Framework.... nur ASP.
HINWEIS:-Sie COULD tun sogar diese Client-Seite, indem Sie die Likes von Markdown---it dann haben Sie einfach die Server-Site Map statisch .md Dateien und machen es sogar SIMPLER, aber...
Projektstruktur
Lassen Sie uns sehen, wie das Projekt organisiert wird
Mostlylucid.MinimalBlog/
├── Pages/
│ ├── Index.cshtml # Homepage with post list
│ ├── Post.cshtml # Individual post page
│ ├── Categories.cshtml # List of all categories
│ ├── Category.cshtml # Posts in a category
│ ├── _Layout.cshtml # Shared layout
│ ├── _ViewImports.cshtml # Shared imports
│ └── _ViewStart.cshtml # Layout selection
├── wwwroot/
│ └── css/
│ └── site.css # All the CSS you need
├── MarkdownBlogService.cs # Core blog logic
├── MetaWeblogService.cs # XML-RPC for external editors
├── Program.cs # Application setup
├── appsettings.json # Configuration
└── Mostlylucid.MinimalBlog.csproj # Project file
Der Herz-Markdown-BlogService
Der Kern des Blogs ist die MarkdownBlogService Klasse: ., es ist bemerkenswert einfach -, nur Linien des Codes, die mit : umgehen
- Markdown-Dateien aus einem Verzeichnis lesen
- Metadaten parsing ](-title .,-Kategorien ?,-Veröffentlichungsdatum
- Markdig in HTML konvertieren
- Alles im Gedächtnis speichern
Hier ist ', wie es funktioniert.
Beiträge werden geladen
Der Dienst scannt ein konfiguriertes Verzeichnis für .md Dateien und lädt sie alle in den Speicher
private List<BlogPost> LoadAllPosts()
{
if (!Directory.Exists(_markdownPath)) return [];
return Directory.GetFiles(_markdownPath, "*.md", SearchOption.TopDirectoryOnly)
.Where(f => Path.GetFileName(f).Count(c => c == '.') == 1) // Only base .md files
.Select(ParseFile)
.Where(p => p is { IsHidden: false })
.OrderByDescending(p => p!.PublishedDate)
.ToList()!;
}
Beachten Sie die clevere Filterung Count(c => c == '.') == 1 stellt sicher, dass wir nur Basis bekommen .md Dateien, die nicht übersetzte Versionen wie post.ar.md oder post.de.md Falls Sie Übersetzungen später hinzufügen möchten
Analyse von Metadaten
Jede Markdown-Datei folgt einer einfachen Konvention.
# Post Title
Your content here...
Der Parser extrahiert diese Metadaten mit regulären Ausdrücken und dem Markdig AST-:
private BlogPost? ParseFile(string filePath)
{
var markdown = File.ReadAllText(filePath);
var slug = Path.GetFileNameWithoutExtension(filePath);
var document = Markdown.Parse(markdown, _pipeline);
// Extract title from first H1
var title = document.Descendants<HeadingBlock>()
.FirstOrDefault(h => h.Level == 1)?
.Inline?.FirstChild?.ToString() ?? slug;
// Extract categories:
var categoryMatch = CategoryRegex().Match(markdown);
var categories = categoryMatch.Success
? categoryMatch.Groups[1].Value.Split(',', StringSplitOptions.TrimEntries)
: [];
// Extract date:
var dateMatch = DateTimeRegex().Match(markdown);
var publishedDate = dateMatch.Success && DateTime.TryParse(dateMatch.Groups[1].Value, out var dt)
? dt : File.GetCreationTimeUtc(filePath);
return new BlogPost
{
Slug = slug,
Title = title,
Categories = categories,
PublishedDate = publishedDate,
HtmlContent = Markdown.ToHtml(markdown, _pipeline),
IsHidden = markdown.Contains("<hidden")
};
}
Caching-Strategie
Jede Methode im Service verwendet IMemoryCache um zu vermeiden, dass Dateien auf jeder Anfrage neu gelesen und wieder geparsiert werden
public IReadOnlyList<BlogPost> GetAllPosts()
{
return cache.GetOrCreate("all_posts", entry =>
{
entry.SetOptions(CacheOptions);
return LoadAllPosts();
}) ?? [];
}
Cache-Einträge haben einen gleitenden Ablauf in Minuten und einen absoluten Ablauf in Stunden
Programm-Einrichtung des Programms.cs
Das gesamte Programm-Setup ist nur 43-Linien, :, Razor Pages, ,, Memory Cache, MSC3, Ausgabecache, MSV4, zwei Singleton-Dienste,,, statische Datei mit , und einem MetaWeblog XML-, RPC-Endpunkt, MKS8, Alles wurde als Einzelton zwischengespeichert, da sich nichts ändert, es sei denn die Dateien werden geändert..
Die einfachen Razor-Seiten
Die Benutzeroberfläche ist reiner Server.-.rendered HTML... Nein JavaScript.,.no HTMX.MSC3.no Alpine.....js...The homepage listet Beiträge auf. @Html.Raw(post.HtmlContent) mit einem [OutputCache] Attribut für Stunden--lang HTML Caching-.- vier Seiten gesamt,-jede unter Linien30-.
Styling-:MSC1-Linien von CSS
Das gesamte visuelle Design wird durch eine einzige CSS-Datei mit nur behandelt.55 lines.Es verwendet CSS benutzerdefinierte Eigenschaften für die Themengestaltung und erzeugt einen sauberen, dunklen GitHub.MS K3 Inspired Look.
:root {
--bg: #0d1117;
--bg-card: #161b22;
--text: #c9d1d9;
--text-muted: #8b949e;
--accent: #58a6ff;
--border: #30363d;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
max-width: 48rem;
margin: 0 auto;
padding: 2rem 1rem;
}
/* ... more styles ... */
Kein Vorprozessor, kein Build Step, keine Tausende von Dienstprogramm-Klassen, nur sauber und lesbar CSS, die funktioniert
Bonus-Feature-MetaWeblog API
Für Autoren, die dedizierte Markdown-Editoren bevorzugen wie MarkierungsmonsterDas Projekt enthält eine vollständige MetaWeblog API-Implementierung. Diese XML-API ermöglicht externe Editoren, um :...
- Liste der Stellen
- Neue Beiträge erstellen
- Bestehende Beiträge bearbeiten
- Stellen löschen
- Bilder hochladen
- Kategorien abrufen
Die Umsetzung ist in MetaWeblogService.cs und behandelt das komplette XML-Protokoll ,- ,RPC , , , um Anfragen zu analysieren und Antworten zu generieren Dies bedeutet, dass Sie Ihre Blogposts in Ihrem Lieblingseditor schreiben können und sie direkt in Ihrem Blog veröffentlichen können .. ,
Einrichtung
Die gesamte Konfigurationsdatei ist nur für die Zeile :.
{
"MarkdownPath": "../Mostlylucid/Markdown",
"ImagesPath": "wwwroot/images",
"MetaWeblog": {
"Username": "admin",
"Password": "changeme",
"BlogUrl": "http://localhost:5000"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
}
}
MarkdownPathWo Ihre Markdown-Dateien lebenImagesPathbei dem Bilder gespeichert werdenMetaWeblogAnmeldeinformationen für externen Editor-Zugriff
Als NuGet-Paket verwenden
Wie oben erwähnt wird es SOON verfügbar sein, aber noch nicht
Der Blog ist jetzt als NuGet-Paket verfügbar., , so dass es trivial zu jedem ASP-. ,NET Core Anwendung hinzufügen.
dotnet add package mostlylucid.MinimalBlog
Dann in Ihrem Program.cs:
builder.Services.AddRazorPages();
builder.Services.AddMinimalBlog(options =>
{
options.MarkdownPath = "Markdown";
options.ImagesPath = "wwwroot/images";
options.EnableMetaWeblog = false; // Optional, defaults to true
});
var app = builder.Build();
app.UseStaticFiles();
app.UseMinimalBlog();
app.MapRazorPages();
app.Run();
Dass es ' ist nur zwei Methode ruft MS K2AddMinimalBlog und UseMinimalBlogUnd du hast einen funktionierenden Blog.
Das Beispielprojekt ausführen
Um das mitgelieferte Beispielprojekt auszuführen
cd Mostlylucid.MinimalBlog
dotnet run
Besuch http://localhost:5000 und Sie sehen den Blog mit Markdown-Dateien aus dem konfigurierten Pfad.
Inhalt erstellen
So erstellen Sie einen neuen Blog-Post
- Erstellen einer neuen
.mdDatei in Ihrem konfiguriertenMarkdownPath - Fügen Sie die Standard-Metadaten hinzu
# Your Post Title Your content here... - Datei speichern
- Der Cache läuft innerhalb von Minuten ab.
Um Bilder hinzuzufügen, legen Sie sie einfach in Ihr konfiguriertes ImagesPath Verzeichnis und referenzieren Sie sie in Ihrem Markdown

Was fehlt an (?
Dieses minimale Blog absichtlich doesn ́'.t enthalten
- Bemerkungen Verwenden Sie bei Bedarf einen Drittanbieter-Dienst
- Suchen Halten Sie Ihre Inhalte mit Kategorien organisiert
- Stichworte Kategorien sind ausreichend für kleine Blogs
- RSS-/-Atom Einfach hinzuzufügen, wenn Sie es brauchen
- Authentifizierung MetaWeblog API verwendet nur grundlegende Auth
- Analyse Snippet mit JavaScript hinzufügen, falls gewünscht
- Optimierung der SEO Funktioniert gut mit grundlegenden Meta-Tags
- Reaktionsfähige Bilder Browser behandelt es
- Dark-/-Licht-Thema umschalten Ein Thema ist genug
Diese Merkmale sind alle möglich um hinzuzufügen: ,, aber sie sind nicht standardmäßig enthalten, weil die meisten kleinen Blogs sie brauchen:
Leistungsmerkmale
Trotz seiner Einfachheit ist dieser Blog schnell:
- Speichercaching bedeutet, keine Datei I/-O nach dem ersten Laden
- Ausgabe-Caching bedeutet keine Razor-Rendering nach erster Anfrage
- Keine Datenbank bedeutet keine Abfrage Overhead
- Kein JavaScript bedeutet schnelleres Laden der Seite
- Einfaches CSS bedeutet minimales Stylesheet Parsing
Für ein kleines bis mittleres Blog-Archiv unter 1000. posts.),. Diese Architektur wird die meisten Datenbanken übertreffen.-.backed blog platforms.
Wann dieses vs.. , das vollständige Mostlylucid Blog verwenden
Verwendung Meistlylucid-.-MinimalBlog wenn ,:'
- Sie starten ein persönliches Blog
- Sie haben weniger als Posts
- Du brauchst mehrere Sprachen
- Sie wollen die Dinge einfach halten
- Sie sind komfortabel mit Markdown-Dateien
- Sie wollen nur schreiben und veröffentlichen
Verwenden Sie die Volle Mostlylucid Plattform wenn ,:'
- Sie verwenden Ihren Blog als Lernlabor für neue Technologien
- Sie wollen mit Einsatzstrategien experimentieren - Monitoring und Leistungsoptimierung
- Sie benötigen spezifische Funktionen wie mehrsprachige Unterstützung ., , voll ?- , Textsuche . , , Kommentare
- Sie bauen Pakete und benötigen ein echtes Testbed
- Sie dokumentieren komplexe technische Implementierungen
- Die Reise des Bauens der Plattform ist so wertvoll wie die Inhalte, die sie beherbergt
Schlussfolgerung: Einfachheit als Merkmal
In der modernen Web-Entwicklungswelt erreichen wir häufig standardmäßig komplexe Lösungen.. Benötigen Sie einen Blog.?.Bessere Einrichtung einer Datenbank.,.Konfigurieren Sie eine ORM,,.Einrichten von Migrationen.,.Fügen Sie Caching hinzu.MSC6. Implementieren Sie die Suche.
Aber manchmal ist die einfache Lösung die Recht Lösung: .-Mostlylucid.-MinimalBlog beweist, dass Sie eine funktionale ,-fast-,- und aufbewahrbare Blog-Plattform mit : aufbauen können
- Die Linien der Linie C.# (-MarkdownBlogService MetaWeblogService +-Programm
- Linien des Razor-Markups Seiten
- Zeilen von CSS
- Abhängigkeit von NuGet (-Markdig-)-Markig
Dass weniger als die Zeilen des Codes insgesamt für eine komplette Blogging-Plattform
Das Projekt dient sowohl als funktionale Blog-Plattform als auch als Erinnerung, bevor Sie Komplexität hinzufügen – Fragen Sie sich selbst, ob Sie es wirklich brauchen – . Manchmal ist ein Ordner voller Markdown-Dateien alles, was Sie benötigen.
Den kompletten Quellcode finden Sie in der Mostlylucid-.-MinimalBlog-Verzeichnis des Hauptrepositorys ,. , I' , das Nuget-Paket freigeben, sobald IM' ,m glücklich mit dem Code ,. ,
Fröhliches Bloggen – !