Adventures in AI  

By Paul Withers | 5/2/24 9:23 AM | Development - Notes / Domino | Added by Roberto Boccadoro

Those who were at Engage will have seen some of the experimentation I’ve been doing with AI in the context of VoltScript. In the OGS Jason demoed how I used it to provide code for a loop, correcting it with information about APIs specific to VoltScript. Before my VoltScript session, I showed two videos demonstrating how I’ve used AI to add value to the VoltScript coding experience, firstly by checking unit tests for code coverage and then by checking code complexity of functions in VoltScript Collections.

Engage 2024  

By Paul Withers | 4/10/24 1:00 PM | Business - Events / People | Added by Oliver Busse

Later this month I will be attending Engage 2024. It will be a bittersweet experience. Engage was the first conference at which I spoke, a session that was way ahead of its time, highlighting the power of repeat controls in XPages and advocating against using View Panels. Ironically, at Engage this year, one of the sessions I’ll be delivering has some similarities. But I’ll cover the sessions I’m involved in chronologically.

Eclipse Java Debugging  

By Paul Withers | 3/22/24 4:24 AM | Development - Notes / Domino | Added by Roberto Boccadoro

When XPages came to Domino it introduced many Domino developers to Java. Because the IDE was based on Eclipse, it also introduced Domino developers to standard elements of Java development on Eclipse.

Domino and JavaScript Development MasterClass Redux  

By Paul Withers | 10/4/23 5:21 AM | Development - Notes / Domino | Added by Roberto Boccadoro

Nearly six years ago I delivered a session at IBM Think with John Jardin called “Domino and JavaScript Development MasterClass”, a session I also delivered at Engage in May 2018. The session was delivered at the request of Andrew Manby, product manager for Domino. It was shortly after the first Domino Jams when JavaScript development against Domino was a key point of focus and it pre-dated any specific developments to expose Domino for JavaScript development. Now seemed a good point to revisit and review, not only in the context of Domino REST API and Volt MX Go, but also with the future of VoltScript in Volt Foundry.

XPages Elements Beyond the NSF  

By Paul Withers | 9/19/23 4:02 AM | Development - Notes / Domino | Added by Roberto Boccadoro

I do very little XPages these days, I have one application for personal usage that rarely gets updated. But it’s when applications rarely get touched that changes elsewhere on the server can have a big impact. I’m going to cover two here, the first raised by a discussion on Discord last week.

Postman: The Crucial Tool for Any Microservice Developer  

By Paul Withers | 7/17/23 2:32 AM | Development - Notes / Domino | Added by Roberto Boccadoro

My history with REST development is long. In 2018, before I joined HCL, I delivered a session “Domino and JavaScript Development Masterclass” at IBM Think. When I posted about my development tools in 2017, Postman - then just a Chrome plugin - was key amongst them. Then in 2020 I posted an overview of Postman. And just as both John and I used Postman as a crucial tool when building the application we showed at our session at IBM Think, it’s the tool that should be used by anyone doing anything with microservices - which is what every scope your create for Domino REST API is.

Bali Unit Testing Framework Videos  

By Paul Withers | 3/1/23 4:58 PM | Development - Notes / Domino | Added by Oliver Busse

Two weeks ago four videos were posted on OpenNTF’s YouTube channel walking through the functionality of the Bali Unit testing framework.These are intended to give you all the information you need to use the test suite, although full documentation is available in the repo, at

Introducing Bali Unit Testing Framework  

By Paul Withers | 2/2/23 2:18 AM | Development - Notes / Domino | Added by Roberto Boccadoro

Today we’ve released two projects, one on HCL’s GitHub and a fork on OpenNTF’s GitHub. It will be useful to give a bit of background, as well as an introduction the the project. The version on HCL’s GitHub is the original, Bali Unit Testing Framework, a unit testing framework written in and for VoltScript, the evolution of LotusScript currently in development for Volt MX Go. The documentation, as usual, is available on GitHub. There are a number of places where the code leverages new language functionality from VoltScript. As a result, although the code will be usable from VoltScript, the code cannot be used as-is by Domino developers. Therefore a fork has also been created on OpenNTF’s GitHub and adapted for LotusScript, Bali Unit Testing Framework. The documentation is available also on GitHub. This can be used by Domino developers. The documetation has also been slightly modified, to be relevant to LotusScript developers.

Andre's Directories Challenge  

By Paul Withers | 12/14/22 2:14 AM | Development - Notes / Domino | Added by Roberto Boccadoro

I am sure that anyone who uses LotusScript has been following the excellent blog posts of Andre Guirard. Recent blog posts on large arrays and queues have been particularly interesting for those of us working on VoltScript. His blog post on a Queue data structure ended with a challenge. The root of the problem is that the LotusScript Dir() function is not recursive. Without a parameter it gives the next file or directory relative to its last call. So you can’t have one loop using Dir() and an inner loop that also uses Dir(). Andre uses a Queue class to perform FIFO (First In First Out), which achieves what’s needed, but not as required For this task, if you care about the order of the returned results, this probably isn’t what you want. You’d prefer all the files in a given folder to be grouped together with the files from its subfolders, so those last two should be switched. Exercise for the reader: what data structure could be used instead of a queue to track the work and give the result in the desired order?

LotusScript Variants: EMPTY, NULL, Nothing  

By Paul Withers | 12/7/22 2:07 AM | Development - Notes / Domino | Added by Roberto Boccadoro

One of the great things about working on VoltScript with our team are the regular discussions about the inner workings of the language. Of course it’s also nice how easy it is to write and run a test script with the language, to quickly test various scenarios. Recently, because of two separate initiatives we’ve been working on, the topic of conversation has been Variants, and the potential values that denote a variant without a value.

Understanding Parentheses in LotusScript Method Calls  

By Paul Withers | 11/7/22 4:28 AM | Development - Notes / Domino | Added by Roberto Boccadoro

Look at the following code and guess the error message. Class Person Public firstName as String End Class Sub Initialize Dim p as New Person Call outerPrint(p) End Sub Sub outerPrint(msg as Variant) innerPrint(msg) End Sub Sub innerPrint(msg as Variant) If (TypeName(msg) = "PERSON") Then Print msg.firstName Else Print msg End If End Sub The error message received will be a Type Mismatch, on the line innerPrint(msg). But the cause might be harder to work out - although the title of this blog post might point you in the direction.

MKDocs Sites on Domino  

By Paul Withers | 10/31/22 4:48 AM | Development - Notes / Domino | Added by Roberto Boccadoro

In the last blog posts I covered using a Jekyll-based site on Domino. Jekyll is a popular documentation option based on Markdown, but another is MKDocs. MKDocs also has a number of themes - a default Bootstrap-based theme, one used by the Read The Docs service, and the one I’ve used, Material for MKDocs.

Negotiating Enhancements  

By Paul Withers | 9/26/22 2:23 AM | Business - News | Added by Roberto Boccadoro

No IT solution is delivered using code written solely by the solution provider. There is always dependent code written by a third party. Dependency management tooling has proliferated in every technology sector to support this. And every solution includes an implicit assumption that the dependent code will continue to work as it does and provide whatever the consumer requires. And the brutal truth for consumers is that the authors of your dependencies did not write their code knowing your requirements up front. Whether or not it fits your implementation falls in the realm of “caveat emptor”. If it doesn’t, if you need an enhancement or you find a bug, your priorities may or may not align with the priorities of the owners of that dependency. With a product, you’re just one paying customer. With open source, you’re just one consumer - not even a customer.

The Importance of Reproducers  

By Paul Withers | 7/4/22 4:57 AM | Development - Notes / Domino | Added by Roberto Boccadoro

So you think you’ve found a bug. What next? Create a support ticket, right? Wrong! First off, let’s point out something critical in that first line - “you think you’ve found a bug”. You may be a consumer for the code you think you’ve found a bug in. But you’re also a committer to other code. How many times has someone raised a problem where the code is actually working correctly? How many times has someone raised a problem but given insufficient evidence to know what’s going on, resulting in the famous “works for me”? And how many times was it PEBKAC (problem exists between keyboard and chair)?

VoltScript - A Unique Opportunity (Paul Withers and Jason Roy Gary)  

By Paul Withers | 6/10/22 4:06 AM | Development - Notes / Domino | Added by Roberto Boccadoro

At Engage 2022 Volt MX Go was announced including features like Volt Formula, a JavaScript-based fusion of Notes formula syntax and Open Formula, and VoltScript, a derivative from LotusScript, and inspired by many modern implementations of BASIC, which will run in Foundry, Volt MX Go’s middleware layer. Already at Engage we demonstrated live running code of VoltScript with Try/Catch/Finally, an alternative declaration keyword “Def” for “Dim” and deprecation of GoSub; which let’s be honest is Satan’s spawn. These are the first changes to the core LotusScript language keywords in over 30 years. In addition, we showed live demos of code running triggered from Foundry as well as standalone VoltScript outside of HCL Notes or Domino, for the first time since the end of life of Lotus 1-2-3. We also showed a number of new extensions (LSXs / VSXs) that will obviously be required, as well as developer productivity tooling like unit testing, mocking and a POC of dependency management.

LotusScript Profiling  

By Paul Withers | 3/11/22 1:25 AM | Development - Notes / Domino | Added by Roberto Boccadoro

LotusScript agent profiling is not new, but there are still some developers who are not aware of it. It’s something I blogged about more than ten years ago. At that time talking about the relative performance of specific API calls, in that case the relative performance of checking .count was greater than zero vs getting the first entry and checking if it was nothing. On other occasions it’s also identified mistakes in my code, because it demonstrated more API calls than I expected or needed.

Rancher Desktop, A New Dev Tool  

By Paul Withers | 2/7/22 2:23 AM | Infrastructure - Notes / Domino | Added by Roberto Boccadoro

Docker has been a significant development tool for me for some time. The ease of spinning up a clean, standalone development environment for applications is a great benefit. The ability to switch seamlessly between different versions is a big benefit when testing. But when Docker announced new licensing terms last year, it shook up the dekstop development landscape. Rancher, who have a long history of expertise with Kubernetes, stepped into the desktop game by announcing Rancher Desktop. I was aware of the open source project last year, but when Daniel Nashed pointed out to me that 1.0 had recently been released, I decided it was time to give it a try.

Docker, Java and Processes  

By Paul Withers | 12/13/21 2:08 AM | Development - Notes / Domino | Added by Roberto Boccadoro

Docker, Java and Processes Whether it’s Docker or Kubernetes (or some flavour thereof), running microaservices in containers is a powerful option. It can make it easy to deploy development or test systems, ensuring consistency across your devlopment team. But when you move from consuming to building, particularly when you’re building less out-of-the-box containers, there are some deeper elements that you need to be aware of.

REST API Gateways  

By Paul Withers | 6/14/21 1:07 AM | Development - Notes / Domino | Added by Andi Kress

Three years ago I presented at IBM Think I presented a session called Domino and JavaScript Development Masterclass with John Jardin. In that session I talked about the various REST options for Domino and used the term “API gateway”. Particularly at this time it makes sense to expand more on what was in the slides.

LotusScript Declarations  

By Paul Withers | 4/14/21 5:10 AM | Development - Notes / Domino | Added by Andi Kress

How can you get a “Type Mismatch” error in a Forall loop in LotusScript? This was the question a few of us hit with a recent bit of coding. You can’t declare the forall variable, and if you’re iterating over a variant containing only strings, surely this shouldn’t happen.

Goodbye Nathan  

By Paul Withers | 4/12/21 5:01 AM | Business - Events / People | Added by Oliver Busse

Over the weekend we lost another long-standing member of the Domino community, Nathan T Freeman. Nathan was outgoing, often controversial, but passionate about open source and helping others. Everyone who met him will have stories about him. But I know he is one of the individuals I have to thank for being where I am today.

Adventures in CacheLand 2  

By Paul Withers | 4/1/21 12:46 AM | Development - Notes / Domino | Added by Roberto Boccadoro

In my last blog post I talked about challenges we had to overcome as a team with regard to caching of constants. But a bigger challenge we hit was caching of design elements. Part of the solution we built required copying design elements from one database to another. Part of the beauty of Domino is that everything is a Note - including design elements. Design elements are just Notes with a special flag. So just as you can copy a document from one database to another by getting a handle on the note, you can also copy a design element from one database to another by getting a handle on the design note.

Adventures in CacheLand 1  

By Paul Withers | 3/24/21 9:03 AM | Development - Notes / Domino | Added by Roberto Boccadoro

Recently I’ve been involved in a project with a lot of LotusScript. As a team our approach has been to structure the code according to best practices and leveraging what we’ve learned from other languages. Standards are always good, but there are always peculiarities that impact what you do. The crucial skill is to be able to work out what is happening when the standard ways don’t produce expected results. And most importantly, work out how to work around them.

Domino Timezones  

By Paul Withers | 1/4/21 2:27 AM | Development - Notes / Domino | Added by Andi Kress

There are a number of challenges when it comes to two-way REST and Domino. But one of the biggest challenges for manipulation between NotesDateTime objects and JSON is timezone handling.

Volt MS LotusScript Toolkit  

By Paul Withers | 11/13/20 5:35 AM | Development - Notes / Domino | Added by Oliver Busse

Earlier this week Jason Roy Gary announced the Volt MX LotusScript Toolkit. It’s important to put some background to manage expectations. There will be an OpenNTF webinar on December 17th where we will explain more about our aims for the project and provide a call-to-arms to the community to join us driving this forward. I encourage everyone to attend if you’re interested in using Agents outside the Notes Client or a Form’s WebQueryOpen and WebQuerySave methods. But in advance, let’s cover some questions I expect people to have.

October Webinar - XPages Flexible View Control with Michael G. Smith  

By Paul Withers | 10/9/20 11:15 AM | Development - Notes / Domino | Added by Roberto Boccadoro

If you’ve been building XPages applications for any amount of time then you probably have struggled integrating view data into your apps and thought to yourself “it shouldn’t be this hard”. The Flexible View Control for XPages can simplify this process for you. The FVC is a re-usable XPages custom control built on jQuery and DataTables that sources data from Domino REST Services and xAgents.

Application Development Musings  

By Paul Withers | 6/9/20 2:08 AM | Development - Notes / Domino | Added by Oliver Busse

Since joining HCL Labs my focus for Domino development has been Domino APIs, with Project Keep. Obviously there is little point using a REST API against a Domino database in an XPages application or LotusScript agent. Consequently, application development has been almost exclusively outside of XPages. This has reinforced key differences between Domino development and other application development frameworks.

Developing RunJava Addins for Domino  

By Paul Withers | 3/1/20 6:46 AM | Development - Notes / Domino | Added by Oliver Busse

Most Domino developers use Windows because that’s the only platform Domino Designer runs on. For most of my application development life, my main device has been a Dell laptop of some variety for this reason. For almost a decade now I’ve also been running a Windows Domino server because Domino Designer local preview is not an effective test environment for a Domino web application.

DQL Explorer and Domino  

By Paul Withers | 2/4/20 5:38 PM | Development - Notes / Domino | Added by Oliver Busse

A couple of weeks ago I explained that, even though the UI of DQL Explorer is a React app, the use of DQL is in agents. The two key agents, found within the NSF itself are runDQLExplain and runDQLQuery - the purpose of each should be apparent from the name. But the purpose of this blog post is to outline the interaction points between DQL Explorer and Domino.

DQL: What Is It Good For?  

By Paul Withers | 1/22/20 12:55 AM | Infrastructure - Notes / Domino | Added by John Oldenburger

DQL has been at the forefront of my radar since Domino V10 over a year ago. If I remember correctly, documentation wasn’t immediately available in Domino Designer’s Help, but was soon published online. It’s been at the heart of sessions and advances ever since.