DevLog 9: Flow 2 In the previous post I talked about replatforming my editors on a custom stack, including a custom incremental Markdown parser and a custom HTML editor, which I open sourced as markoffset and scribeframe . Since then, I released Flow 2 , the next major release, which ditches Electron for Tauri and ProseMirror for scribeframe. Flow 2 is now available on both the MacOS App Store and…
DevLog 8: Replat I had a couple of alternative titles for this post. Side-quests. Or Hold my beer⦠Iâll explain. I recently shipped the first version of Longhand on the MacOS App Store . Itâs a solid minimum viable product. I already have a couple of bug fixes and a handful of new features queued up for the next minor release. I also have a couple of larger features planned. For example, I…
DevLog 7: Longhand I talked a bunch about Flow, the focused text editor I built during the past couple of years. I released Flow on the MacOS App Store and on the Windows Store and I'm pretty happy with the editing experience. One thing I was still missing was a solution for long form writing. I used Obsidian to organize my last novel, but Obsidian is a note taking/PKB tool, not a manuscript…
DevLog 6: Extending Markdown Markdown is ubiquitous nowadays. LLMs speak Markdown. Text editors embrace Markdown. I've been working with it both on my text editor side-project and on my main job. Markdown is great as a lightweight, easy-to-read markup syntax but it has its limitations. Everyone ends up working around those limitations in one way or another, which makes it difficult to have good…
Jazz: An Exploration For the music theory part, I included several interactive components. Here's musical notation that can be played: Here's an interactive piano (multi-touch supported) for playing scales: Here's a chord player: And a drum pattern to explain rhythm: The main theme here is to seamlessly transition between reading and listening. Implementation I used AI both to implement this and…
Notes on Advent of Code 2025 These are my notes on the 2025 Advent of Code . All my solutions are on my GitHub here . And here is the disclaimer I've been using with each post: Disclaimer on my solutions I use Python because I find it easiest for this type of coding. I treat solving these as a write-only exercise. I do it for the problem-solving bit, so I don't comment the code & once I find the…
10 Years This post marks the tenth year of my technical blog. I started in 2016, ended up writing exactly 9 posts during that year, and made it a point to consistently stick to that number. You are reading post #90. This will be a self-indulgent look back at the past decade. Why 9 posts per year? While sometimes I have plenty of things to write about, other times I get busy and donât have the…
Agent Integration Patterns A couple of years ago, when LLMs started taking off, I wrote a whole book about how to integrate models into larger applications. I knew going in that the book will get outdated very fast due to the speed at which the industry is moving. In fact, a few months after I finished it, the model I used throughout the book for code examples was deprecated by OpenAI. This broke…
DevLog 5: Markdown and WYSIWYG In this post I want to cover one of the foundational features of Flow : its Markdown handling. I will not show a lot of code, because most of it is boring parsing code and special-case handling. Different editors tackle Markdown in different ways. Some support a subset of Markdown formatting on insertion, but don't preserve any markup. For example, typing a * would…
DevLog 4: Theming and Footguns This is going to be a fun post! First, I want to show how I implemented theming for Flow. With its focus on providing an inspiring environment, theming was min-bar for the app. Fortunately, implementing theming is fairly straight-foward. Until it isn't. In the first part I'll go over how I gave the Electron app its unique look and feel. In the second part, I'll cover…
Digital Horology I started getting ads for Klydoclock on Instagram. The product looks really neat: I love the idea of a digital pendulum clock. I figured it would make for a cool DIY project: implement the clock display, then run it on a cheap tablet I can stick in a box. Of course, the Klydo folks build a cool product, working with multiple artists for the various clock faces, and, from what I…
DevLog 3: Commanding This article is going to be the part 2 of the formatting and commanding I built for Flow . In the previous post I covered formatting and the various corner cases we need to keep in mind when implementing something as simple as toggle bold on the current selection . Last post dealt with what we need to do to update the document when such a command comes in. Now that thatâs…
DevLog 2: Formatting One of the more interesting (and generally applicable) things I had to build for Flow is the commanding infrastructure, especially as it pertains to formatting. This entails going from the app UI all the way down to the editor and vice-versa. What I mean by this is, the user can apply a command like toggle bold on the current selection in multiple ways: using the Cmd+B…
DevLog 1: Flow I wrote about authoring tools last year and my side project of building an editor. I am now happy to announce the preview release of Flow , a creative writing app. MVP Flow is at MVP state currently, with a bunch of features that I am planning to add later on. The public roadmap is here . It does have the basics though: Markdown support with markup hiding when not under the cursor,…
Notes on Advent of Code 2024 I'm making this a tradition, as I wrote about Advent of Code during the past couple of years. This is the 10th year of Advent of Code! All my solutions are on my GitHub here . And the standard disclaimer: Disclaimer on my solutions I use Python because I find it easiest for this type of coding. I treat solving these as a write-only exercise. I do it for the…
Notes on Authoring Tools I always enjoyed coding, and I always enjoyed writing. Over time, I made a bunch of tools for authors, which I used myself. I believe there's still a lot of room to improve the authoring experience. Here is a short history of some of these past projects. Tinkerer About 12 years ago, I built Tinkerer , a now retired static website generator for blogs. This was back when…
Mental Poker Part 10: Conclusions This blog post will wrap up the Mental Poker series . I started thinking about this in 2021, and worked on a Mental Poker Toolkit library as a side-project. The blog posts in the series were written as I was exploring the tech. Here I aim to bring all the pieces together in a final recap. Inception This all started with Fluid Framework . As the team was building…
Mental Poker Part 9: Discard Game For an overview on Mental Poker, see Mental Poker Part 0: An Overview . Other articles in this series:Â https://vladris.com/writings/index.html#mental-poker . In the previous post in the series we looked at building a simple game of rock-paper-scissors. In this post we'll look at implementing a card game. Overview We'll build a discard game - players take turns…
Mental Poker Part 8: Rock-Paper-Scissors For an overview on Mental Poker, see Mental Poker Part 0: An Overview . Other articles in this series: https://vladris.com/writings/index.html#mental-poker . In the previous post in the series  we looked at some low-level building blocks. It this post, weâll finally see how to implement a game end-to-end using the toolkit. Weâll start with a simple…
Mental Poker Part 7: Primitives For an overview on Mental Poker, see Mental Poker Part 0: An Overview . Other articles in this series here . In the previous post in the series  we saw how to implement shuffling on top of our primitives. It this post, weâll look at a few other primitives useful for implementing a game on top of this toolkit. Creating a transport We talked about Fluid…
Mental Poker Part 6: Shuffling Implementation For an overview on Mental Poker, see Mental Poker Part 0: An Overview . Other articles in this series: https://vladris.com/writings/index.html#mental-poker . In the previous post in the series we covered the state machine we use to implement game logic. We now have all the pieces in place to look at a card shuffling algorithm. Shuffling cards in a game…
Mental Poker Part 5: State Machine For an overview on Mental Poker, see Mental Poker Part 0: An Overview . Other articles in this series: https://vladris.com/writings/index.html#mental-poker . In the previous post in the series we covered actions and an async queue implementation. In this post, we'll finally look at the infrastructure on top of which we'll model games. The type of games we're…
Mental Poker Part 4: Actions and Async Queue For an overview on Mental Poker, see Mental Poker Part 0: An Overview . Other articles in this series: https://vladris.com/writings/index.html#mental-poker . In the previous post in the series we covered the transport. As I was building up the library and looking at state machines that would run turns in a game, I realized an async queue would come in…
Notes on Advent of Code 2023 I always have fun with Advent of Code every December, and last year I did write a blog post covering some of the more interesting problems I worked through. I'll continue the tradition this year. I'll repeat my disclaimer from last time: Disclaimer on my solutions I use Python because I find it easiest for this type of coding. I treat solving these as a write-only…
Notes on Platform Development I spent the past few years building a platform for Loop components within the Microsoft 365 ecosystem. While some of the learnings might only apply to our particular scenario, I think some observations apply broadly. Weâve been using 1P/2P/3P to mean our team (1P), other teams within Microsoft (2P), and external developers (3P). Loop started with a set of 1P…
Mental Poker Part 3: Transport Now that my LLM book is done , I can get back to the Mental Poker series. A high-level overview can be found here . In the previous posts we covered cryptography and a Fluid append-only list data structure . Weâll be using the append-only list (we called this fluid-ledger ) to model games. An append-only list should be all that is needed to model turn-based games:…
Large Language Models at Work RTM Keeping with tradition , I'm writing the RTM post for Large Language Models at Work. The book is done. Now available on Kindle . Self-publishing I decided not to contact a publisher this time around, for a couple of reasons: First, I didn't want the pressure of a contract and timelines (though looking back, I did finish this book faster than the previous two);…
Large Language Models at Work I recently announced I'm working on a new book about large language models and how to integrate them in software systems. As I'm writing this, the first 3 chapters are live at https://vladris.com/llm-book . The remaining chapters are in the works and I will upload them as I work through the manuscript. In the meantime, since I announced my previous books with a blog…
Mental Poker Part 2: Fluid Ledger In the previous post I covered the cryptography part of implementing Mental Poker. In this post, I'll cover the append-only list data structure used to model games. As I mentioned before, we rely on Fluid Framework . The code is available in my GitHub fluid-ledger repo . Fluid Framework I touched on Fluid Framework before so I won't describe in detail what the…
Notes on Documentation I spent a bunch of time lately revamping some documentation and this got me thinking. In terms of tooling, even state-of-the-art documentation pipelines are missing some key features. This is also an area where we can directly apply LLMs. In this post, I'll jot down some thoughts of how things could look like in a more perfect world. Of course, here I'm referring to…
Mental Poker Part 1: Cryptography In the previous post I outlined some of the interesting bits of putting together a Mental Poker toolkit. In this post I will talk about cryptography. The golden rule when it comes to cryptography code is to not roll your own, rather use something that's been battle-tested. That said, I could not find what I needed so had to implement some stuff. I urge you not to…
Mental Poker Part 0: An Overview I wrote previously about Mental Poker , how one can set up a game in a zero trust environment, and how this could be implemented using Fluid Framework . Since the previous post, I spent some more time prototyping an implementation with a colleague and did a tech talk about it. If you haven't read the previous post and are not familiar with Mental Poker, the…
Notes on Advent of Code 2022 I've been having fun solving Advent of Code problems every December for a few years now. Advent of Code is an advent calendar of programming puzzles. All my solutions are on my GitHub here . First, a quick disclaimer: Disclaimer on my solutions I use Python because I find it easiest for this type of coding. I treat solving these as a write-only exercise. I do it for…
Computability Part 9: LISP In the previous post , we covered lambda calculus, a computational model underpinning functional programming . In this blog post, we'll continue down the functional programming road and cover one of the oldest programming languages still in use: LISP. LISP was originally specified in 1958 by John McCarthy and the paper describing the language was published in 1960 1 . It…
Computability Part 8: Lambda Calculus In the previous posts, we dug deeper into one particular model of computation, starting with Turing Machines in part 2 , to the von Neumann computer architecture in part 6 , to some of the implementation practicalities of machines - physical or virtual - in part 7 . We'll switch gears and cover another computational model this time around: lambda calculus .…
Computability Part 7: Machine Implementation Practicalities In the previous post we covered the von Neumann architecture and even built a small VM implementing the different components. Such naïve implementation does make for a very inefficient machine though. In this post, we'll dive a bit deeper into machine architectures (virtual and physical) and discuss some of the implementation details.…
Computability Part 6: Von Neumann Architecture During the previous posts, we covered Turing machines , tag systems , and cellular automata . All of these are equivalent in terms of what they can compute, but some are more practical than others. In this post, we'll look at the von Neumann architecture of physical computers and implement an extremely inefficient machine, write a few programs…
Computability Part 5: Elementary Cellular Automata In the previous post we talked about Conway's Game of Life as a well-known cellular automaton. In this post we will cover even simpler automata - the elementary cellular automata . Stephen Wolfram covers them extensively in his book, A New Kind of Science . To recap, we defined a cellular automaton as a discrete n-dimensional lattice of cells, a…
Computability Part 4: Conway's Game of Life Formal definition: A cellular automaton consists of a discrete n-dimensional lattice of cells, a set of states (for each cell), a notion of neighborhood for each cell, and a transition function mapping the neighborhood of each cell to a new cell state. The system evolves over time, where at each step, the transformation function is applied over the…
Computability Part 3: Tag Systems In the previous post we talked about universal Turing machines and looked at some very small machines that are still capable of computing anything that can be computed (the Turing-completeness property). In this post, we'll look at another model for computation: tag systems. A tag system operates on a string of symbols by reading the symbol from the head of the…
Computability Part 2: Turing Machines In the previous post , we looked at a history of what would become computer science. In this post, we'll focus on Turing machines and Turing completeness. The informal definition we gave to a Turing machine in the previous post is: An abstract computer consisting of an infinite tape of cells, a head that can read from a cell, write to a cell, and move left or…
Computability Part 1: A Short History An algorithm (/ËælÉ¡ÉrɪðÉm/ ) is a finite sequence of well-defined instructions, typically used to solve a class of specific problems or to perform a computation. Ancient computers The first computer (we know of) is the Antikythera mechanism. It was found in 1901 in a shipwreck. The device was built sometime between 100 BC and 150 BC and uses gears to…
Timsort I wrote before about the inherent complexity of the real world and how software that behaves well in the real world must necessarily take on some complexity ( Time and Complexity ). A lot of the software engineering best practices try to reduce or eliminate the accidental complexity of large systems (making things more complicated than they should be). But we don't live in a perfect world,…
Mental Poker For the past year or so, I've been on the Fluid Framework team. I won't go deeply into the details of the framework, rather I'll quote a few paragraphs from the Overview page : What is Fluid Framework? Fluid Framework is a collection of client libraries for distributing and synchronizing shared state. These libraries allow multiple clients to simultaneously create and operate on…
Notes on Software Lifecycle I spent a lot of time lately looking at how our team can improve our product's reliability and capability to respond to production incidents. This got me thinking about the lifecycle of a contemporary software project. The model I've been using for this looks like the following: At a high level, the cycle starts with engineers writing code . The code gets merged and at…
Machine Learning on Azure - Part 3 This is an excerpt from chapter 7 of my book, Data Engineering on Azure , which deals with machine learning workloads. This is part 3 in a 3 part series. In this post, we'll run the model we created in part 1 on the Azure Machine Learning (AML) infrastructure we set up in part 2 . Running ML in the cloud We use the Python Azure Machine Learning SDK for this, so…
Machine Learning on Azure - Part 2 This is an excerpt from chapter 7 of my book, Data Engineering on Azure , which deals with machine learning workloads. This is part 2 in a 3 part series. In this post, we'll explore the Azure Machine Learning (AML) service and set it up in preparation of running our model in the cloud. In this post, like throughout the book, we'll be using PowerShell Core and…
Machine Learning on Azure - Part 1 This is an excerpt from chapter 7 of my book, Data Engineering on Azure , which deals with machine learning workloads. This will be a series of 3 posts. In this post, we'll create a simple ML model in Python. In the next post, we'll go over Azure Machine Learning. In the final post, we'll run this model in Azure Machine Learning. Let's start with the simple ML…
Shipping a Feature I recently did a small presentation for my team talking about what it takes to ship a feature to customers in a product like Office. This includes much more than getting the functionality implemented and tested. In fact, figuring out the design and implementing it accounts for about 20% of the work (from prototype to implementation, including tests). The remaining 80% is taking…
Data Engineering on Azure RTM My book, Data Engineering on Azure , which I announced in this blog post , is going to print soon. As I did with my previous book, Programming with Types , I'm writing another RTM post to talk about a few aspects of the process. Title evolution When I pitched the book to Manning, I used the title Production Data Engineering with Azure . The title was supposed to…