Sunday, August 16, 2026

Custom Excel file format using SpreadsheetML in an AL codeunit

 By Steve Endow

[This blog post was 100% human written. None of this post was drafted, written, or edited by an AI.]

I recently worked on a very complex Business Central Per Tenant Extension for a customer.

I had to reproduce a "report" that was based on a 1,600 line SQL stored procedure that performed tens of thousands of calculations on GL data and custom configuration data, that was rendered in Power BI.

After weeks of work, I got the PTE developed, and after a few weeks of testing and reconciling, my report finally matched the customer's historical reports.  To the penny.

Except for the formatting.

The customer was used to reconciling an Excel version of the report with 50 rows and over 230 columns.  Both the rows and columns were shaded, and the report had a title and dates.  And given the scrolling involved in a report that large, the customer used the Excel "freeze panes" feature.

The Excel report my PTE was exporting from BC was black and white, no color, no shading, no title, and no frozen panes.  Every time they opened my Excel file, they had to do some basic formatting just to review it.

So I asked my buddy Claude:  "Is it possible to have formatting in the Excel file?"  I didn't know if AL could do that.

Is it possible? 

Setting up a globally accessible development workstation for under $400

 by Steve Endow

[This blog post was 100% human written. None of this post was drafted, written, or edited by an AI.]

In September 2020, I bought a Lenovo ThinkPad P1 Gen3 laptop.  For $3,271.

It was a massive waste of money.  Huge mistake.

This was back in the heyday of using Docker and BcContainerHelper for Business Central AL development.  The conversation at the time was that a powerful laptop would allow a BC AL developer to run Docker Desktop locally, allowing the dev to write code and test PTEs directly on the laptop.  And there was even a belief that "I can develop when I'm on the train, even if I don't have internet access!".  (I learned this last one wasn't really possible, because there were so many apps and services constantly calling for internet access.)

The laptop was absurdly expensive.  It was very heavy.  The 170W power adapter alone weighed a full pound.  It was very large and cumbersome, barely fitting in my backpack, and impractical to use on a flight.  And the battery life was terrible.  I hated using the laptop.

After that experience, I was on a mission to find a better solution.  A much cheaper solution.

Enter eBay.  Turns out there are truckloads of used Lenovo ThinkPads for sale on eBay.  

But isn't it risky to buy a computer on eBay?

Friday, July 31, 2026

Reducing the Risk of Business Central Web API Secrets Through Education

 by Steve Endow

[This blog post was 100% human written. None of this post was drafted or written by an AI.]

We received an email from a partner asking me to help someone with a BC Web API authentication issue.

"We are getting an authentication error with our API web access key when trying to connect to the customer's BC environment."

Say what?  This is in July 2026.  Business Central hasn't had web access keys since 2022.  Red flag #1.

I was busy, so I assumed someone else helped resolve the issue.

The next day, we get another email from the partner.  We learn that it is a third party ecommerce provider who is having the issue.  The partner provides a link to a video.

I hover over the link in the email.  It points to a Google Drive.  I click on it and a video opens in my browser.  Without any authentication.  Just keep this in mind for few moments...

The video shows the authentication screen in the Postman application.  There is no audio.  The person is apparently trying to configure an OAuth connection to the Business Central Web API.

The Postman URL shows "ODataV4".  In July 2026.  Red flag #2.

The video shows a mouse highlighting the elements of the URL, the auth endpoints, the client ID, etc.  The video then switches to Notepad++, showing the OAuth connection information.

Client ID

Secret Value

The file path in Notepad++ shows that this information is saved in a TXT file in the user's local Documents folder.  Red flag #3.

Thursday, June 18, 2026

Be careful setting up GitHub Enterprise for use with AL-Go

by Steve Endow

[This blog post was 100% human written. None of this post was drafted or written by an AI.]

A quick note for any Dynamics 365 Business Central developers looking to use AL-Go for GitHub.

Be very careful if you choose to upgrade to GitHub Enterprise.  There is a big catch.  (as of June 2026)

If you are an ISV or partner, or an organization that has multiple developers and multiple projects, you will likely want to use AL-Go, and also several features of GitHub to make your devops processes more efficient.  You will likely want to use templates and actions to streamline your project setup process and pipelines to streamline your builds.

We went down this rabbit hole and quickly found that in order to get the most out of GitHub, we would need to graduate from an Organization account to an Enterprise account.  The features we needed were not clearly listed on the GitHub subscription feature list, but when we dug into the settings in a repo, we found out that the features we wanted require the Enterprise subscription.  And we estimated that we would likely exceed the 3,000 CI/CD minutes per month under the Team subscription.

It was not obvious that we needed Enterprise 

Monday, June 8, 2026

Instructions for Claude

by Steve Endow

[This blog post was 100% human written. None of this post was drafted or written by an AI.]

If you use Claude--either through the claude[dot]ai web site, or the Claude desktop app, I recommend filling out the "Instructions for Claude" field under Settings => General => Instructions for Claude.

If you're new to Claude or AI agents, you may not know what to put in the Instructions for Claude box at first.  But after you use it for a while, you'll notice things you don't like, or inconsistencies in outputs, or common questions, or uncertainty from Claude about what you want or like.

This is where Instructions for Claude comes in.  

Instructions for Claude

Wednesday, May 27, 2026

Improving the Terrible English Used by Claude Code

  by Steve Endow

[This blog post was 100% human written. None of this post was drafted or written by an AI.]

========

UPDATE 8/6/2026:  This post by Kun Chen seems to explain the bizarre language that is being used by Claude, and perhaps other models.  Chen attributes the behavior to "Reinforcement Learning with Verifiable Rewards" (RLVR).

https://x.com/kunchenguid/status/2084004473408753833

========

I am hardly the grammar police, but I value linguistic precision.

The bizarre English language quirks baked into Claude Code cause it to use terrible words and phrases that make no sense (to a native US English speaker) and significantly weaken the precision of it's language when communicating with a developer.

What do you mean?

Here are some of the terrible phrases that Claude Code spat out while I was trying to develop software:

Load-bearing

Ground truth

Rung scaffold

First-class citizen

Territory

Cast a wide net

This is the smoking gun


Here are some eye rolling phrases I've seen in public PRs that were obviously fully AI generated and never read by a human:

review knowledge-article front-matter

post a non-blocking, feedback-instrumented advisory comment

Harvest + aggregation of acceptance/reactions

Front-matter validator

seed-free graceful degradation covered

Corrects both the naive belief and the folk rule 

a genuine before-image

silently no-ops

Friday, March 27, 2026

Automatically Capturing Business Central Screenshots Using Playwright

 by Steve Endow

[This blog post was 100% human written. None of this post was drafted or written by an AI.]

Playwright is a browser automation tool that can log into Business Central, navigate pages, enter data, click buttons, and save perfectly sized screenshots.

I recently developed a new AppSource app for Business Central.  I used GitHub Copilot (GHCP) to create a nice user guide for the app, and asked Copilot to insert placeholders for screenshots.  The resulting 23 page user guide looks nice, but I discovered that it called for 21 screen shots.

Now that we've entered the age of AI and "agentic engineering", where an agent can commit and push for me so that I don't have to type or click at all, I have become impressively lazy.  Naturally, it would be uncivilized for me to manually save 21 screen shots.  That is sooo 2025.

While chatting with BC MVP Brad Prendergast, he sent me a post about something called Playwright.  It sounded vaguely familiar to me, because it was mentioned in the book Vibe Coding by Steve Yegge and Gene Kim.  I looked it up and (re) learned that Playwright is a browser automation tool.

Playwright Test is an end-to-end test framework for modern web apps. It bundles test runner, assertions, isolation, parallelization and rich tooling. Playwright supports Chromium, WebKit and Firefox on Windows, Linux and macOS, locally or in CI, headless or headed, with native mobile emulation for Chrome (Android) and Mobile Safari.

Okay, interesting.

So I ask GHCP:  Can Playwright take screen shots?

GHCP:  Yup.

And that is how I started a journey to spend hours building automated BC screen shot capture scripts using Copilot and Playwright.

Exactly 1280 x 720, with a specific row selected

Custom Excel file format using SpreadsheetML in an AL codeunit

 By Steve Endow [This blog post was 100% human written. None of this post was drafted, written, or edited by an AI.] I recently worked on a ...