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
Monday, 01 December 2025
Якщо ви стежите за цим блогом, ви, можливо, помітили, що моя основна платформа... назвемо її "спроектованою" "з ентузіазмом." Бази даних PostgreSQL і векторні бази даних, семантичний і повнотекстовий пошук з індексами GIN, автоматичним перекладом на 14 мов, багатьма серфінговими службами, плануванням роботи Hangfire, метричними стандартами Promeus, серілогічним слідкуванням, взаємодією HTMX, усування власних пакунків з noget, і достатньо контейнерів Docker, щоб змусити корабель заздрити.
Це цілком навмисно. Цей сайт - це моя жива лабораторія, де я експериментую з технологіями, тестовими стратегіями, вимірюю характеристики швидкодії та будую придатні пакунки. гадана бути переінструктаженим, тому що саме так я вчуся: вирішенням проблем, яких більшість блогів насправді не мають, а потім пакувати ці рішення як бібліотеки з відкритим кодом, які можуть використовувати інші.
Але ось в чому справа: Вам, мабуть, нічого з цього не потрібно для ведення блогу.
Ось чому я створив threelucid. MinimalBlog - щоб побачити, що відбувається, коли ви позбуваєтеся всіх експериментів і зосередитесь на абсолютно важливих програмах. Немає бази даних. Без складності. Просто позначте файли у теці, що з' являються у мережі. Ось так виглядає блог, якщо ви не використовуєте його як лабораторію.
ЗАУВАЖЕННЯ: ви можете прочитати в кінці статті посилання на джерело, я планую видати його як Пакунок nuget як тільки я отримаю час, щоб переконатися, що він на 100% надійний, і він не є TOO жахливою (так що пошукайте статті для тестування k6 найближчим часом!).
Весь проект розроблено навколо одного принципу: зробити це просто. Без бази даних, без трубопроводу для збирання, без оболонки JavaScript. Тільки ASP. NET 9. 0, Markdig для обробки з міткою і близько 500 рядків коду загалом.
ЗАУВАЖЕННЯ: Ви навіть можете зробити цей клієнт поруч, використовуючи подібні типи markdown- it а потім просто залишити статичну карту сайта сервера .md files і make it even SIMPLER but... well this is a ASP.NET blog (cana shose a ⇩).
Погляньмо, як організовано цей проект:
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
Основою блогу є MarkdownBlogService Клас. Це на диво прості 120 рядків коду, які працюють над:
Ось як це працює:
Служба сканує налаштований каталог для .md файли і завантаження їх всіх у пам' ять:
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()!;
}
Зверніть увагу на кмітливу фільтрацію: Count(c => c == '.') == 1 що ми отримаємо лише основу. .md файли, не перекладені версії на зразок post.ar.md або post.de.md (якщо ви хочете додати переклади пізніше).
Кожен файл з міткою має просту конвенцію:
# Post Title
Your content here...
Обробник видобуває ці метадані за допомогою формальних виразів і AST Markdig:
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")
};
}
Кожен спосіб використання IMemoryCache щоб уникнути повторного читання і перевпорядкування файлів з кожного запиту:
public IReadOnlyList<BlogPost> GetAllPosts()
{
return cache.GetOrCreate("all_posts", entry =>
{
entry.SetOptions(CacheOptions);
return LoadAllPosts();
}) ?? [];
}
Записи кешу мають 30- хвилинний просковзання і 2- годинний абсолютний термін. Просте, ефективне.
Все налаштування програми складається лише з 43 рядків: Сторінок Razor, кешу пам' яті, кешу виводу, двох служб однотонів, статичних файлів і кінцевої точки XML- RPC. Все кешовано як однотони, оскільки нічого не змінюється, якщо не буде змінено файли.
UI - це чистий HTML, що виконується сервером. Немає JavaScript, немає HTMX, немає альпійських. js. Домівки - це дописи на домашній сторінці @Html.Raw(post.HtmlContent) з an [OutputCache] attribute для годинного кешування HTML. Загалом чотири сторінки, кожна з яких менша за 30 рядків.
У всьому візуальному дизайні працює лише один файл CSS з 55 рядками. Програма використовує нетипові властивості CSS для того, щоб створювати чистий, темний вигляд GitHub- натхнений:
: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 ... */
Без препроцесора. Без кроку збирання. Немає тисяч класів допоміжних програм. Просто чистий, придатний для читання CSS, який працює.
Для авторів, які надають перевагу призначеному редакторам з маркуванням, на зразок Markdown Monster, Проект складається з повнофункціональної реалізації API MetaWeblog. Цей API XML- RPC дозволяє зовнішні редактори:
Реалізація в MetaWeblogService.cs і керує повним протоколом XML- RPC, аналізу запитів і створення відповідей. Це означає, що ви можете писати дописи вашого блогу у вашому улюбленому редакторі і оприлюднювати їх безпосередньо до вашого блогу.
Увесь файл налаштувань складається лише з 14 рядків:
{
"MarkdownPath": "../Mostlylucid/Markdown",
"ImagesPath": "wwwroot/images",
"MetaWeblog": {
"Username": "admin",
"Password": "changeme",
"BlogUrl": "http://localhost:5000"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
}
}
MarkdownPath - там, де живуть ваші файли markdownImagesPath - де зберігаються зображенняMetaWeblog - реєстраційні дані для доступу до зовнішнього редактораЯк згадувалося вище, SOON буде доступний, але ще не:)
Тепер блог доступний як пакунок NuGet, що робить тривіальним додавання до будь- якої програми ASP. NET:
dotnet add package mostlylucid.MinimalBlog
Потім у Вашій 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();
Ось так - тільки два методи називаютьAddMinimalBlog і UseMinimalBlog) і ви маєте робочий блог.
Щоб запустити включений проект прикладу, виконайте команду:
cd Mostlylucid.MinimalBlog
dotnet run
Відвідати http://localhost:5000 і ви побачите блог з позначенням файлів за вказаним шляхом.
Для створення допису блогу:
.md файл у налаштованому вами файлі MarkdownPath# Your Post Title
Your content here...
Щоб додати зображення, просто розташуйте їх у налаштованих вами зображеннях ImagesPath каталог і посилання на них у вашому markdown:

Цей мінімальний блог навмисно не включає:
Всі ці можливості можливе щоб додати, але вони типово не включені, тому що більшість маленьких блогів їх не потребують.
Незважаючи на простоту, цей блог швидкий:
Для невеличкого блогу середньостатистичного (до 1000 дописів) ця архітектура перевищитиме більшість платформ блогів з базою даних.
Користування В основному, minimalBlog коли:
Використовувати платформа з великими значеннями коли:
У сучасному світі для веб- розробки, типово, ми часто досягаємо складних рішень. Вам потрібен блог? Краще налаштувати базу даних, налаштуйте ORM, налаштуйте міграцію, додайте кешування, реалізацію пошуку, налаштування фонових завдань...
Але іноді простим рішенням є праворуч розв' язання проблеми. Більшість з них. МінімалBlog доводить, що ви можете будувати функціональну, швидку і придатну для збереження платформу блогів за допомогою:
Це менше ніж 520 рядків коду загалом для повної платформи для ведення блогів.
Проект слугує як функціональною платформою блогу, так і нагадуванням: перед додаванням складності запитайте себе, чи вона вам справді потрібна. Іноді у теці, де є багато файлів, є все, що вам потрібно.
Ви можете знайти повний код у Каталог здебільшого minimalBlog Я випущу пакунок nuget, як тільки я буду задоволений кодом.
Счастливого блога!
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.