This repository contains the source code for mostlylucid.net β the personal site and blog of Scott Galloway, a consulting web developer and systems architect with over 30 years of experience building web applications.
π Visit the live site: mostlylucid.net
Self-contained, portable executables β no runtime install required.
Fast, local, privacy-first data profiling with DuckDB + optional LLM narration. Profile any CSV, Excel, Parquet, JSON, SQLite, or log file in seconds.
# Quick profile (pure stats, no LLM)
datasummarizer -f data.csv --no-llm --fast
# Q&A mode with LLM insights
datasummarizer -f data.csv --query "what drives churn?" --model qwen2.5-coder:7b
# Profile Apache/IIS log files
datasummarizer -f /var/log/apache2/error.log --no-llm --fastFeatures:
- 52K+ rows profiled in ~1 second
- Privacy-safe PII detection (hidden by default)
- Drift detection and constraint validation
- Natural language Q&A with SQL generation
- Log file support (Apache error/access, IIS W3C)
- ONNX embeddings for semantic caching
π Full Documentation
Turn documents or URLs into evidence-grounded summaries β every claim cites its source. Runs entirely on your machine.
# Fast extractive summary (no LLM, ~3s)
docsummarizer -f document.pdf -m Bert
# With LLM synthesis (~10s)
docsummarizer -f report.pdf -m BertRag
# Summarize a URL
docsummarizer -u https://example.com/articleFeatures:
- PDF, DOCX, PPTX, XLSX, Markdown, HTML support
- Bert mode: pure ONNX, no LLM, ~1-3 seconds
- BertRag mode: LLM synthesis with citations
- Multiple output formats (executive, bullets, bookreport)
- MCP server for AI agent integration
π Full Documentation
Enhances Mermaid diagrams with export, panning, zoom, expanding lightbox, and theme switching.
npm install @mostlylucid/mermaid-enhancementsπ npm package
A minimal, file-based markdown blog for ASP.NET Core. Just point to a folder of markdown files and go.
builder.Services.AddMinimalBlog(options =>
{
options.MarkdownPath = "Markdown";
});
app.UseMinimalBlog();Features:
- ~500 lines of code total
- Memory and output caching built-in
- MetaWeblog API support for external editors
- GitHub-inspired dark theme
π Full Documentation
A complete solution for fetching and caching remote markdown content with multiple storage backends, automatic polling, and stale-while-revalidate caching.
π NuGet Package
Lightweight ASP.NET Core middleware for generating realistic mock API responses using local LLMs (via Ollama). Add intelligent mock endpoints with 2 lines of code.
π NuGet Package
HTMX-enabled ASP.NET Core Tag Helpers for paging tasks.
π NuGet Package
A .NET client for Umami Web Analytics β privacy-focused analytics integration.
π NuGet Package
HIGHLY EXPERIMENTAL .NET client library for controlling Eufy Security devices via cloud and P2P connections.
π NuGet Package
| Project | Description |
|---|---|
| TinyLLM | Windows WPF app for local AI chat with RAG memory. Supports Ollama and direct GGUF loading. |
| Chat.Server | SignalR hub for real-time chat between website visitors and administrators. |
| Chat.Widget | Embeddable JavaScript chat widget for any website. |
| SemanticSearch | CPU-friendly semantic search using ONNX embeddings and Qdrant. |
| BlogLLM | RAG knowledge base builder for markdown documents. |
| SemanticGallery.Demo | Image gallery with semantic search capabilities. |
| SentimentAnalysis | Local sentiment analysis using ONNX models. |
| Workflow.Engine | Simple workflow execution engine. |
Clarifier sentinel (tiny LLM) is enabled by default. Configure via
DataSummarizerSettings:
EnableClarifierSentinel(default: true)ClarifierSentinelModel(default:qwen2.5:1.5b; falls back to heuristics if unavailable)
File: Rotten Tomatoes Movies.csv
Session: 21380e65cf9d4db18305d7950aee1b2f
> What is the average?
Average over which dimension? Pick one:
- overall (no grouping)
- by rating
- by tomatometer_status
- by runtime_in_minutes quartiles
SQL: /* clarification required: average dimension not specified (no SQL executed) */
> overall
The average runtime of the movies is 102.39 minutes, with an average
Tomatometer score of 60.47 and an average audience rating of 60.47.
SQL:
SELECT AVG("runtime_in_minutes") AS avg_runtime,
AVG("tomatometer_rating") AS avg_tomatometer,
AVG("audience_rating") AS avg_audience
FROM read_csv_auto('sampledata/Rotten+Tomatoes+Movies.csv/Rotten Tomatoes Movies.csv');
Dive into some of the technical deep-dives and experiments from the blog:
- Building a Remote Markdown Fetcher for Markdig - A complete guide to building a Markdig extension with caching, remote content fetching, and TOC generation
- Creating an LLM Mock API with Ollama - Add intelligent mock endpoints to any project with just 2 lines of code
- Umami.Net: Analytics Made Simple - Building a .NET client for privacy-focused web analytics
- HTMX & Alpine.js Integration Patterns - Building dynamic UIs without heavy JavaScript frameworks
- Mermaid Diagrams with Interactive Controls - Pan, zoom, and fullscreen diagram support
- Docker Multi-Stage Builds for .NET - Optimizing container images and deployment workflows
- Monitoring with Prometheus & Grafana - Setting up observability for ASP.NET Core applications
- Automated Blog Translation with EasyNMT - Building a multilingual blog with automated translation to 12 languages
mostlylucid is a living lab: part portfolio, part blog, part playground. It's where I share:
- Technical deep dives into ASP.NET Core, JavaScript frameworks (HTMX, Alpine.js), Docker, cloud, and search technologies
- Experiments with modern frontend stacks (Tailwind, DaisyUI, Markdown tooling, Mermaid diagrams)
- Open-source contributions like NuGet packages, tag helpers, and utilities
- Reflections on freelancing, remote work, and the craft of building resilient systems
The site is intentionally a work in progress β things may break, evolve, or get rebuilt entirely. That's part of the ethos: showing how things are built, not just the polished result.
- Dual-mode blog system: File-based markdown or PostgreSQL database storage
- Multilingual support: Automated translation to 12 languages via EasyNMT
- Full-text search: PostgreSQL-powered search with tsvector/GIN indexes
- Comments system: Nested comments with closure table pattern
- Analytics: Integrated Umami analytics with custom .NET client
- Observability: Comprehensive logging (Serilog + Seq), metrics (Prometheus), and tracing
- .NET 10 - ASP.NET Core MVC for server-side rendering
- PostgreSQL 16 - Primary database with full-text search
- Entity Framework Core - ORM with code-first migrations
- Hangfire - Background job processing for newsletters
- DuckDB - In-process analytics for data profiling
- HTMX 2.0 - Server-driven interactions without heavy JavaScript
- Alpine.js - Lightweight reactive components
- Tailwind CSS + DaisyUI - Utility-first styling with component library
- Highlight.js - Syntax highlighting with custom Razor support
- Mermaid - Interactive diagram rendering
- EasyMDE - Markdown editor
- Ollama - Local LLM inference
- ONNX Runtime - CPU-optimized embeddings and inference
- Qdrant - Vector database for semantic search
- DuckDB VSS - Vector similarity search extension
- Docker - Containerized deployment with Docker Compose
- Caddy - Reverse proxy and automatic HTTPS
- Prometheus + Grafana - Metrics and visualization
- Seq - Structured log aggregation
- Umami - Privacy-focused web analytics
- Cloudflare Tunnel - Secure remote access
- .NET 10 SDK (for building from source)
- Node.js (for frontend builds)
- Docker (optional, for full stack)
# Clone the repository
git clone https://github.com/scottgal/mostlylucidweb.git
cd mostlylucidweb
# Install dependencies
npm install
dotnet restore
# Build frontend assets
npm run build
# Run the development server
dotnet run --project Mostlylucid/Mostlylucid.csprojThe site will be available at https://localhost:5001
For the full stack including database, analytics, and monitoring:
# Start all services
docker-compose up -d
# View logs
docker-compose logs -f mostlylucidSee CLAUDE.md for detailed development documentation.
Scott Galloway is a consulting web developer and systems architect with over 30 years of experience building web applications. As a former Microsoft ASP.NET Program Manager, he has deep expertise in the .NET ecosystem and has worked with everyone from Fortune 500 companies to early-stage startups.
- Full-stack development across .NET and JavaScript ecosystems
- Systems architecture and rapid prototyping for complex web applications
- Open-source development - Building and maintaining NuGet packages, libraries, and tools
- Remote team leadership and startup bootstrapping
- Technical writing - Sharing knowledge through detailed technical articles
- Building developer tools and libraries for the .NET community
- Exploring modern web patterns with HTMX and Alpine.js
- Experimenting with AI/LLM integration in web applications
- Creating privacy-focused analytics and monitoring solutions
- Contributing to the Markdig ecosystem with custom extensions
With a career spanning from the early days of ASP.NET to modern cloud-native architectures, I've been fortunate to work on:
- Large-scale enterprise applications serving millions of users
- Developer tools and frameworks used by thousands of developers
- Startup MVPs that needed to scale quickly and reliably
- Open-source projects that solve real-world problems
I believe in building in public - sharing both successes and failures, showing the messy middle of development, not just the polished result.
Interested in collaborating, consulting, or just chatting about building things?
- Email: [email protected]
- Blog: mostlylucid.net
- GitHub: @scottgal
This repo is primarily Scott's personal playground, but feedback, issues, and suggestions are welcome. Feel free to open a PR or drop a note.
Unlicense β This is free and unencumbered software released into the public domain. See LICENSE for details.