Before I throw my chicken soup in my slow cooker, and before I take advantage of this holiday from work to release a package of minor improvements and fixes for bugs I discovered using the new Daily Parker blog engine for a week, I need to mention the latest clear and convincing evidence that the OAFPOTUS has lost his mind and needs to be removed from power.

This morning, the government of Norway and some of our own embassies abroad released a letter the head of our government sent to the head of theirs. Schoolchildren will read about this letter centuries from now:

Dear Jonas [Gahr Støre, prime minister of Norway]:

Considering your Country decided not to give me the Nobel Peace Prize for having stopped 8 Wars PLUS, I no longer feel an obligation to think purely of Peace, although it will always be predominant, but can now think about what is good and proper for the United States of America. Denmark cannot protect that land from Russia or China, and why do they have a “right of ownership” anyway? There are no written documents, it’s only a boat that landed there hundreds of years ago, but we had boats landing there, also. I have done more for NATO than any person since its founding, and now, NATO should do something for the United States. The World is not secure unless we have Complete and Total Control of Greenland. Thank you! President DJT

If an assistant manager at a Wendy's had written this letter, he'd be fired on the spot. You wouldn't tolerate this from an 8th grader. As Adam Kinzinger said, it's time to put him in a home:

This is not parody. This is not a meme. This is not a joke taken out of context. This is the sitting president of the United States explaining how he thinks.

That is not strength. That is not realism. That is not America First.

It is grievance-driven governance, powered by ego and resentment, with nuclear consequences.

This isn’t diplomacy. It’s a warning.

Anne Applebaum:

Donald Trump now genuinely lives in a different reality, one in which neither grammar nor history nor the normal rules of human interaction now affect him.

Years of careful diplomacy, billions of dollars in trade, are now at risk because senators and representatives who know better have refused to use the powers they have to block him. Now is the time.

James Fallows tries to make sense of "what the hell is this about?" and shrugs:

Does the Trump-era obsession with Greenland seem completely irrational? That’s because it is—as no less an authority than Trump himself has told us.

Because the feeling of ownership is “psychologically important” for this one damaged man, the US is throwing alliances and interests built over centuries into a bonfire. Great. But not what Hamilton, Madison, and Jefferson had in mind.

This showdown has gone from idiotic to actually dangerous.

As a child I was afraid during the Cuban Missile Crisis of 1962. In retrospect, it was in fact the closest the world has come to nuclear devastation, in the 80+ years since the first use of atomic weapons, by the US on Hiroshima and Nagasaki.

I am afraid now when I think that one un-informed, gut-driven man is breaking up alliances, imposing tariffs by decree, and putting our collective fate in his bandaged, shaky, undersized hands.

I think we all need to remember the words of Jane Goodall: "What you do makes a difference, and you have to decide what kind of difference you want to make."

Cassie will not get a lot of walks today. Just now at O'Hare the temperature hit -18°C (-1°F) with a wind chill of -29°C (-20°F); here at Inner Drive Technology World HQ it's -15°C (5°F). Of course, this is nowhere near a record: on 19 January 1985 it was -31°C (-23°F), and the next day, 20 January 1985, Chicago hit its all-time coldest temperature of -33°C (-27°F).

I wondered how cold it would have to get for Cassie to notice. I have my answer. I let her off leash when we got back to our complex after a 4-minute speed-walk around the block, and she beelined for the front door. But now I have a Weimaraner mix who usually gets a full hour of walks every day who will get, if the wind dies down, 30 minutes today.

The forecast predicts a normal-ish -5°C (21°F) tomorrow.

The first problem of developing a new software application is to determine what it does. The second problem is to decide the fundamental abstractions that will govern the system. If you don't figure this out early, you'll either write a hideous pile of rotting spaghetti that no one will want to maintain, or you'll do that and change careers entirely.

Sorting the "what it does" problem often makes the "what represents it" question easier to answer. If you want to build a building, for example, having a clear idea of what it does ("it provides living space for lots of people") should give you a good idea of its fundamental abstraction ("people live in apartments" or "people live in houses"). If you get the fundamental abstraction wrong, it just won't work ("people live in cubicles"). This is why airports with huge shopping centers don't feel right, and condos carved out of de-sanctified churches look weird.

Fortunately, the first fundamental abstraction of this project was obvious, even before I decided to make a blog engine its first realization. Everything in the Inner Drive Journal is an Event.

Now, I'm an old Object Oriented guy. So when describing software concepts, I think of classes that have is-a and has-a characteristics. So an Event is a thing that has or will happen, and has a start time, type, and name, and maybe other characteristics like an end time, a location, comments, and text. (Because the Event lives inside a software system, it also is a DataItem that has an ID, created time, modified time, and control bits to determine whether it's published, deleted, or test data.)

This means that everything that everything you see on The Daily Parker is, fundamentally, an Event. A BlogPost is an event that has additional characteristics specific to blogging. In time, I'll add other event types with other characteristics, for example to represent when I read a book or took a hike with Cassie.

The blog post's class hierarchy looks like this:

public class BlogPost : Event { }

public class Event : DataItem, IEvent, IGeoLocatable { }

public abstract class DataItem : IDataItem, IAuthorizable { }

The I prefix indicates an interface, which simply defines what a thing has to have without specifying how any of those characteristics work. That lets developers care only about the minimum characteristics of a thing without caring about what the thing actually is. For example, the authorization system only cares that things implement the IAuthorizable interface, and doesn't care if the thing is a blog post, a book review, or a squirrel.

The other principal abstraction is a Project, which is a collection of Events. There are two reserved projects, Public and Administration, but otherwise what goes in a Project is completely arbitrary. The Daily Parker is a Project containing Events, and most (but not all) of those Events are Blog Posts.

The application has two other things that people interact with, Users and Comments. But altogether, the application has (as of this morning) about 50 other classes that are and have specific characteristics that make the application work. For example, the View page is a class that includes the Blazor page definition, the code behind the page, and a list of text items like field names and tooltips.

As always, use the comments to ask questions or ask for specific topics of these explainers.

Next time: the authorization architecture, which is how the application decides who can see and do what.

In Friday's explainer, I gave a 10,000-meter view of the application and its basic components. Today I'm going to show you the software's basic features; I'll go deeper on some of them in later posts.

(Since I'm actively developing this software, some of the details that follow could change, so they're accurate only as of the date of this post.)

The most obvious feature is that you can read blog posts. You're doing it now, in fact. If you just landed on https://www.thedailyparker.com, you're seeing this post in the reverse-chronological feed, which shows you posts from the past 7 days. If you went to the permalink https://www.thedailyparker.com/2026/01/17/how-all-this-works-what-the-blog-engine-does, you're seeing the single post page. You might also see any comments that people have left.

Before you can see the post, I have to write it on the edit post page, which looks like this:

The editing page

The edit post page has a bunch of features that give me precise control over what you see:

  • An indication that the post is a draft next to controls that allow me to save and pin the post
  • The title, used to build the permalink
  • Tags, which provide a quick way to find posts related to a common topic
  • The body text, which is what you're reading
  • A preview button, which generates the HTML that you see, so that I can make sure I'm formatting everything correctly
  • An author box, pre-populated with the name of whoever is editing if it's a new post
  • The project selector, which I'll get into later
  • The encoding selector, which defaults to Markdown for new posts but also has settings for HTML (any post before January 2026) and plain text
  • A control to set the start date of the post, which allows me to post something in the future (like this post)
  • Location controls, to populate the little globe icon you see in the header above
  • A selector to open or close comments, which defaults to closing them after 60 days
  • Checkboxes that determine whether the post is published and whether the editor auto-saves what I'm working on
  • Buttons to save, publish or re-publish, view, or delete the post
  • A readout of the metadata about the post, including its permalink, unique ID, owner (the person who created it), and last modified time and editor
  • A separate history tab, showing all the changes to the post's metadata (but not to the post text, for reasons I'll get into later)

As you can see above, all these controls are just stacked on one big page. I've put the most frequently used controls at the top and the less-frequently used at the bottom, and a lot of them start off with default values that don't change very often.

Other major features of the UI include:

  • Full-text search, which will find any word or set of words in any post
  • User profiles, which you can set up if you log in using a Microsoft account (including Outlook, XBox, etc.)
  • Administrative tools that let me read the event log, audit log, diagnostic information, the user list, and the project list

Plus a couple of features that you won't necessarily see:

  • A flexible permissions architecture, which I will discuss in depth later on
  • reCAPTCHA verification for comments

It's a lot, I know! And I'm constantly developing more features, one of which I plan to deploy on Monday.

Let me know in the comments which features you want to know more about.

I have a list of 6 or 7 short plumbing tasks that I hope will take less than an hour, which is 1/8th the time window the plumbing service provided for the plumber's arrival. We all know how that goes. And at my real job, I'm coordinating a bunch of processes for a biweekly release that, so far, is pretty boring—just how we like it.

Meanwhile, the rest of the world persists in not boring anyone:

  • In a moment that should make all patriotic Americans vomit from embarrassment and which Paul Krugman called "the inanity of evil," exiled Venezuelan opposition leader María Corina Machado presented the OAFPOTUS with her Nobel medal, which he promptly stuck in his mouth while making happy little squealy noises. No report yet on whether he actually peed his pants or just drooled onto them.
  • The US has admitted it obtained a directed-energy weapon that could cause brain injuries similar to the so-called "Havana Syndrome," despite years of Pentagon denials that such a thing could exist.
  • Local public transport officials have drawn up plans for a long-overdue regional transit police force. One hopes they will have the authority to stop people smoking, pissing, and shitting on CTA trains. It's a little thing, I know, but it's important to some of us.
  • Bruce Schneier looks back on Aaron Swartz's JSTOR dump and subsequent suicide, arguing that private hoarding of taxpayer-funded knowledge abetted by pro-corporate public policies has gotten worse since then.
  • Jeff Maurer nails it: "In Fairness, “Reconstitute ICE So That Internal Border Enforcement Can Be Done in a Professional Manner by an Agency That Has the Public’s Trust” Is a Bad Slogan."

Finally, a story on NPR this morning had me yelling at my radio. The Heritage Foundation, who in saner times brought us Romney-slash-Obamacare, now fret about "what happens to a nation when its citizens largely stop having children and eschew marriage," as a section of their latest report has it. The report argues that marriage is the foundation of society, and therefore the government should make marriage more attractive. Nowhere do they argue for things that could make having children more attractive, like free day care, free pre-school and pre-K, free lunches in primary schools, and free health care for kids under 10. Or, you know, immigration, which has been proven to increase the population of every country that has tried it.

It's almost as if Heritage is raising the alarm over declining birth rates but not being particularly honest about whose birthrate they mean. Not to mention, the policies they do propose also create incentives for women to leave the workforce and return to the idyllic lifestyle they led in the 1950s and 1960s.

Is it possible that the organization that brought us Project 2025 and all the wonderous things we've experienced over past year has some other agenda? Hmm.

In my last post about the Daily Parker's new blog engine, I explained why I built this and what it's for. This post will give you an overview of the app's basic structure; that is, the physical building blocks that make the blog happen.

When you point your browser at https://www.thedailyparker.com, the request goes to the front door of a Microsoft Azure App Service, which runs on a server in Microsoft's US East data center, located outside the tiny town of Boydton, Va, on the Virginia-North Carolina border about halfway between Richmond, Va., and Raleigh, N.C. I put this app there because lots of Inner Drive apps live there, including Weather Now.

Once the request hits the server, it goes to a Microsoft Blazor WebAssembly application called InnerDrive.Journal.UI, which sends and receives messages to a stack of other components:

  • A Microsoft Cosmos DB NoSQL database that stores all of the blog posts as fully-indexed JSON documents.
  • Multiple Microsoft Azure Tables, which are high-speed flat structures that store simple rows of data with only two indices. The tables store information that needs to be written and read very quickly but doesn't have a lot of overhead. The blog engine uses tables for:
    • Audit logs
    • Event logs
    • Indexes
    • Comments
    • Tags
  • An Azure Key Vault that stores keys and secrets, so that the source code never does. For example, to read from the database, the application needs the database's secret connection information, so it knows where to look and what password to use. That "connection string" goes in Key Vault.
  • Microsoft Azure Blob storage to keep the photos and other files that you see.

Unlike Weather Now, the Daily Parker runs entirely in a single Blazor WebAssembly app. Weather Now uses two: a user interface app, which shows all the data, and a separate API, which stores and processes all the data. That makes it easy for Weather Now to serve its data to other apps. But the way I expect people will use the blog engine is entirely different, so I chose the simpler, one-app approach.

That doesn't mean everything is stuffed into one big executable file, though. The application architecture of the blog splits responsibilities into a collection of small-ish assemblies:

  • Core contains the most basic components that every other part of the system uses, like the definitions for Privacy and Accuracy.
  • Data defines how the application uses the database and other data structures like indexes. The basic abstraction for the app, the Event, lives here, as do the definitions for Factory and Repository, which represent different ways of dealing with certain kinds of data.
  • Blog holds the bits that are specific to blogs and not generally used by other kinds of events. The BlogPost class lives here, as does the BlogPostFactory; both of those things extend their Data counterparts (Event and EventFactory).
  • Services orchestrates how those other parts interact with each other. For example, the BlogService has a method to find a blog post by its ID. That code in turn calls the EventFactory.Find method to get the post, but then it calls a several other pieces of code to determine if the person trying to find the post has permission to see it, as well as code to log information to the event log (things that the software does) and the audit log (things that the user does).
  • UI uses Services to generate the pages that you see in your browser.

All of this currently runs on .NET 10 and was written in the C# language. Plus, there are a bunch of 3rd-party components, including the Inner Drive Extensible Architecture™ (which I also wrote) that do specific tasks, like time zone calculations and translating the Markdown I'm typing right now into the HTML you see in your browser.

Over the next few weeks, I'll go into much more detail about all of this. But my next post will be about the features I developed for this new blog engine, and why I think they're cool.

This is the first in a series of posts I've planned to explain what the Daily Parker blog engine actually is, how it works, and what's coming. I'll start with the most basic question: what the heck is a blog engine and why did I write one from scratch?

Simply put, a blog engine is software that handles all the plumbing for a blog. Substack is a blog, and it runs on a blog engine. WordPress is also a blog engine.

The Daily Parker has existed in some form or another since July 1997 and as something identifiable as a blog since May 1998. When I started posting things online, I manually edited HTML files and copied them to my company's web server. Version 1.0 of an identifiable blog engine read posts from an Access database and served them up using a scripting language called Active Server Pages. (The Wayback Machine's earliest capture of the braverman.org proto-blog was on 8 October 1999.)

I started calling this a "blog" when I deployed, with some frustration, a DasBlog site to my own web server in November 2005. That was version 3.0; I rolled out version 4.0 almost exactly 10 years later, this time running on BlogEngine.NET, which I forked (split off my own version) from the open source version available back then.

That's the context. Now the rationale.

Between DasBlog and BlogEngine.NET, I've had to make do with other people's design choices and coding styles, requiring hours of digging through code to make even simple changes. I could never get either of them to do everything I wanted, nor could I make them even work sometimes. You have no idea how many times I had to reboot BlogEngine.NET because its synchronous architecture got bogged down and crashed. The magic number was around 200 simultaneous users, whereupon the blog engine would spend so much time trying to handle its request queue that it could never get to new requests.

I finally got so sick of it that I decided to build the first iteration of a journaling application as a blog engine. It had to work, be easy to change, and provide at least the basic features people expect on blogs:

  • Reverse-chronological browsing of posts
  • WYSIWYG editing in both Markdown and HTML
  • Tags for classifying posts
  • Comments with approvals
  • An attractive, modern look and feel
  • Works on mobile devices and tablets
  • Basic permissions to restrict who can post and what posts anonymous users can see
  • Sign-on using external accounts, like Microsoft and Google

It also had to work in the modern software-development universe:

So, welcome to the public face of the Inner Drive Journal! At this writing, it's just the minimum-viable product, but the JIRA backlog is long and very cool. But because of how I designed and built it, it's easy to change, and the roadmap is pretty clear to me. And I'm proud of my work so far.

Next time: basic site architecture.

Even though I wrote this thing, the new editor interface is so radically different from the old one that it will take getting used to. Also, the new blog engine uses Markdown instead of HTML, which makes writing quicker with a lot less formatting.

And because I wrote it to the simplest standard of good software that I know ("it does what it's supposed to and it's easy to change"), if when I find something clunky, I file a bug on Jira and then I fix it.

If only we could apply the rule to the current administration, which does not do what it's supposed to, and is not easy to change:

  • Yesterday, some flunky in Health & Human Services cut $2 billion—basically all the funding—from 2,000 substance-abuse and mental health programs, and quietly restored fundng this morning.
  • Amanda Nelson says we should stop thinking about ICE as the American Gestapo because, really, it's more like the slave patrols of the antebellum South.
  • Paul Krugman credits the impatience and incompetence of the OAFPOTUS and his droogs with giving us the best chance to resist authoritarianism in the US.

Also, today is the 25th birthday of Wikipedia. The free online encyclopedia has a special birthday mode that will remain available through mid-February. Today is also the 45th anniversary of Hill Street Blues, which you should watch if you haven't already seen it. I think it holds up, as a snapshot of life in 1980s Chicago.

I woke this morning to the sound of snow and ice slamming into my bedroom window when this cold front came through:

Cold front

Cassie enjoyed this a lot more than I did:

Winter came back

The forecast predicts that the snow will stop in a couple of hours, and it doesn't look like we're going to get too much of it. Yay.

I'm David Braverman, this is my blog, and Cassie is my 7½-year-old mutt. I last updated this About... page in March 2021. Quite a lot has changed since then, most notably I wrote a whole new blog engine. (More on that in a moment.)

Cassie in repose

About the blog

The Daily Parker is about:

  • Cassie, whom I adopted on 16 March 2021. (The blog is named after my previous dog, Parker, whom I adopted in 2006 and who died in 2020.)
  • Politics. I'm a moderate-lefty by international standards, which makes me a radical left-winger in today's United States. And I'm looking forward to the day, whether 20 January 2029 or earlier, when we can start repairing all the damage caused by this rogue administration.
  • The weather. I've operated a weather website for more than 27 years. That site deals with raw data and objective observations. Many weather posts also touch politics, given the political implications of addressing climate change, especially given the OAFPOTUS's hostility to science.
  • Chicago (the greatest city in North America), and sometimes London, San Francisco, and the rest of the world.
  • Photography. I took tens of thousands of photos as a kid, then drifted away from making art until early 2011 when I finally got the first digital camera I've ever had whose photos were as good as film. That got me reading more, practicing more, and throwing more photos on the blog. In my initial burst of enthusiasm I posted a photo every day. That frequency is incompatible with having a life, so I don't update this category very often.

I also write a lot of software, and will occasionally post about technology as well. I've got more than 45 years experience writing the stuff, 30 as a professional. I own Inner Drive Technology, a microscopic software development company in Chicago, which has some interesting packages available on NuGet. I see a lot of code, and since I often get called in to projects in crisis, I see a lot of bad code, some of which may appear here.

I strive to write about these and other things with fluency and concision. "Fast, good, cheap: pick two" applies to writing as much as to any other creative process (cf: software). I hope to find an appropriate balance between the three, as streams of consciousness and literacy have always struggled against each other since the first time someone put chisel to tablet 5,500 years ago.

Finally, given that I started this blog almost 23 years ago, it has old and crappy examples of my writing and of my opinions. I have evolved quite a bit. Author John Scalzi put it perfectly: the guy I was in 1998, the guy I am now, and the guy I'll be in 2036 are three different people.

About the blog engine

Now let's talk about the software the blog runs on. In 2016, I had an idea for software that would allow users to put together a timeline of events. The software needed to have seriously strong privacy protections, because I envisioned it as something people could use as a personal journal, or as a way to organize a legal case, or as a cache of sources and notes for a journalist.

I started writing the software in 2020, but put it aside until I had a burst of inspiration about a year ago. From that point I made slow but steady progress, until the BlogEngine.NET platform that The Daily Parker had run on since 2015 basically wouldn't run anymore without frequent reboots and cursing. That got me thinking, wouldn't the minimum viable product for a timeline application be, in fact, a blog engine?

Over the next few days and weeks, I'll have a series of technical posts about how I developed it and how it works. Check back on this post for links, or just watch them come up on the new posts page. You can also bookmark the Release Notes page.

Deeper dives

I've started a series of posts explaining how all this works and why I did it. Read in any order; more posts coming frequently:

Thanks for reading, and I hope you continue to enjoy The Daily Parker.

Earlier posts

Copyright ©2026 Inner Drive Technology. Donate!