As the title suggests, this evening I had a major breakthrough with Velocity Web Server, introducing TLS support. This was one of the biggest barriers to the development of VWS back in 2023, but now it's back on track, and the server is getting better and better.
I am now looking into virtual hosts and adding automatic Let's Encrypt certificate issuance.
VWS performance, particularly for static files, is exceptional and very, very fast. In addition, if you end up going with ZPE and YASS Web Pages, you'll see the huge performance gains you can get from a solid web server built on modularity.
As the title says, I'm now actively working to improve Velocity Web Server and make it better than before. And over the last few weeks of development, I can happily say that it's already on track for massive improvements.
This week's updates include the addition of cookies, session variables (which run in memory, not storage), post and query string parameters, built-in Python web handling, TLS, and much tighter integration with ZPE/YASS through the YASS Web Page (YWP) standard.
Not only that, but VWS is fast, portable and very easy to use.
A simple java -jar vws.jar --install command installs VWS, similar to the command in ZPE 1.14.4, so you can then just run VWS with vws. And running VWS is as simple as vws -p portNumber. Simple. TLS will be improved further in the next few versions, but you can already enjoy it in version 1.1.
VWS can now also be embedded as a server in a Java project, handling all the heavy lifting of a web server.
Future versions aim to have a JavaScript and TypeScript runtime to support running JavaScript backends, new routing support, virtual addresses and so much more, it's on route to being a really powerful web server.
ZPE 1.14.3 is another big update, and it's coming at the end of this week.
x509_pem_fingerprint
There is a new predefined function in ZPE, x509_pem_fingerprint, previously available only through the new zpe.lib.security library.
In addition, the direct inclusion of X.509 fingerprinting means that ZPE now supports different types of plugins and libraries. Some libraries are what are called trusted libraries - they are signed by me. Then there are untrusted libraries. ZPE will soon block these on their first load, but they can still be used after approval. These untrusted libraries will also not have the same access in sandbox mode, with restrictions on system files and being limited to the sandbox folder. In addition, certain activities, such as reflection, executing commands, and networking, will be banned. If the sandbox is disabled, they are free to do what they want. Sandbox is now enabled by default in ZPE 1.14 and later.
Stricter lockdown procedures
Lockdown is a feature added in July 2025 that allows ZPE to run in a safe mode, ensuring that certain features cannot be run or loaded. Lockdown is stricter than before in ZPE 1.14.3, as plugins will not load at all during lockdown.
Further module improvements
Modules also received a major update. When modules were first introduced, they worked fine with a main function, unless the code was compiled using the YASS Compiler in ZPE and saved to an executable file. Now that's all changed. During compilation, the main function is identified and referenced, thus ensuring that main functions within a module load correctly.
Plugin and library updates
With all the work I've been doing on plugin and library security over the last few versions, this update further improves how libraries are integrated into ZPE.
Libraries have deep access to ZPE, and they are core to expanding its possibilities even further. However, in recent versions, due to the number of plugins and libraries available to ZPE on the rise, and the inclusion of trust checks within them, plugin loading has become a burden on startup times. As a result, I realised that plugins and libraries should be loaded asynchronously on startup. This, however, causes another issue: if a library is loaded after a program is run in ZPE, it will throw an error. To combat this, I've added an additional form of loading - using the already included import command:
import "zpe.lib.sqlite"
This means you can force the loading of a plugin right there and then, and if it's already been loaded asynchronously, the import statement does nothing. Nice!
Check out the new plugins
Several new plugins are under development. These new plugins, which are currently mostly libraries, are designed to extend ZPE's functionality and were one of the key goals when ZPE was first conceptualised. A couple of the new libraries are:
libMSAccess, libSQLite, libUI, libSerial, libSystemInfo, libMQTT, libMySQL
Plugins can now be added via ZULE (ZPE Uploads, Libraries and Extensions) package manager (which is getting an update in the next version) using the --plugins option:
--zule install --plugins
You can find out more about the libraries and plugins available on my GitHub page, where I share all the source code and the latest trusted builds.
New compiler feature
Previous versions of ZPE did not support using the arrow operator (->) to access an object after a function call, such as print(get_wikipedia_reference("USB")->title). This has been a problem for a while, but after a five-minute look at the compiler, it was an easy fix. So you can now probe the result of a function with an arrow operator.
ZPE 1.14.2 has been released this weekend. The new version brings a ton of new enhancements including the ability to view variables at certain points in the program through proper debugging tools that offer step over and execution pausing - not just termination.
ZIDE v.0.1.0-alpha has also been released, and this is the first version to be properly released. You can download the JAR from my GitHub and the individual binaries from my website (Linux coming soon).
ZIDE is not like ZPE in the sense that ZIDE is still in very early days. Each time a new binary is built, it will automatically be uploaded to my website for downloading. GitHub also will continue to feature release tags for each version. You can see the full source code for ZIDE on my GitHub as well.
ZPE 1.14.2 brings three major features.
Universal template parsing
Template parsing was introduced some time ago, but was released only in January 2026 with ZPE version 1.14.1. In the latest release, version 1.14.2, template parsing is available anywhere, including in parameters and return values.
Scope blocks
Many languages have scope blocks, and now YASS does too. They are nice and easy to use as well. Simply using the double brace syntax ({{ }} or the block syntax (block . . . end block), you can create an isolated scope block:
// Everything here runs inside the implicit GLOBAL function $total = 100 print("Start total: " & $total) block // This variable exists ONLY inside the block $total = 25 print("Inside block: " & $total) // Blocks can still see outer variables $discount = 10 $total = $total - $discount print("After discount: " & $total) end block // Block variables are discarded print("End total: " & $total)
Variable scoping
Additionally, variables declared as private in a function are scoped to the containing function and no longer modify parent or global variables, allowing safer encapsulation while preserving YASS’s simple scoping model.
As the title suggests, ZPE 1.14.1 is just about ready. This version is more of a bug-fix version, but it does bring some nice new changes.
For a start, ZPE no longer relies on native access for the command-line interface jLine. It also introduces tabbing in the command line via jLine. This is a really welcome addition. Changes to ZPEX mean that the -g and -q modes are no longer included in those builds. Minor performance improvements have also been brought to ZPE and, best of all, the JAR is more than 4MB smaller than before.
Happy New Year, everyone! Welcome 2026!
My New Year's resolutions are as follows:
- Become more environmentally friendly and sustainable - although I do a lot, there's more I can do, I want to try and inspire those around me to do more as well
- Attempt to find a new career

As we get toward the end of 2025, I thought it would be a good idea to look back on 2025 before welcoming 2026. The end of the year is always emotional, either in a good way or a bad way. For me, this year has been mixed.
2025 has not been an awful year like 2010, 2016, or 2021, but it has had some serious downs for me. I'm going to try to go through the months of the year to describe the year as best I can in a couple of sentences, rather than by month.
Firstly, ZPE hit a significant milestone this year when the parser became up to 24% faster, resulting in a much more performant ZPE. This was a substantial improvement for ZPE. Additionally, ZPE also hit 10 years this year in May - something I cannot believe. ZPE also got a new file sandbox security within plugins, and it's really powerful. And the YASS language got labels and goto statements (again), and the editor saw a massive change with the introduction of BalfLaf (a new project of mine that's now applied to all my UIs).
I reintroduced BalfComment as the primary commenting system on my website. As time goes on, I'm going to continue improving this to ensure that comments are automatically moderateable (through AI) to avoid users seeing unsavoury comments.
DragonDocs introduced AI marking last year, but this year it improved considerably. You see, the marking was done on each script individually, whereas now it is done in one, so the marking is consistent. Additionally, the context is retained so that future tests are marked using the same marking strategy as before.
Technology-wise, I did quite a few reviews and got some really cool new tech, including my new Nintendo Switch 2, GPD Pocket 4, iPhone 17 Pro, Apple Watch Ultra 3, my Unfolded Circle Remote 3 and my Zettlab AI NAS D6.
I also moved into my house four years ago, in February. I also got myself a nice little upgrade on the house with my understairs drawers. Speaking of upgrades, I've made a lot of progress on the smart home, with things like my smart front door that locks and unlocks via my watch and my new LED light strip along the back of my house, and I've finally developed a powerful, handy dashboard for my home control tablet at the door.

Although I began planning my move out of teaching and back into my previous career in 2024, 2025 was the year I started putting those plans into action. My aim is that by the end of 2026, the remaining pieces will be in place to allow me to change careers fully. This year also saw me move from my previous school — one I genuinely loved — to a new school. While I do enjoy working there, it doesn’t resonate with me in the same way. A significant positive, however, has been gaining a wonderful colleague who makes day-to-day work far easier and more enjoyable. In a broader sense, not being as emotionally attached to my current school has given me clarity. It reinforces that I’m ready for change, and makes the decision to eventually step away from the profession feel both practical and achievable.
April was a good month overall, though it did include one of the year's most challenging episodes. Following an incident in March, my mum—despite my reassurance that everything was fine—contacted an ambulance. The crew attended, carried out their checks, and confirmed there were no concerns. In April, the hospital requested a follow-up. Although there was no evidence to suggest anything serious, one doctor chose to pursue a possible seizure diagnosis—something that appeared to be based on little more than fatigue. This line of enquiry continued through to June. Thankfully, in July, a different doctor reviewed the original ambulance report, which explicitly stated that no seizure had occurred, and concluded that the earlier assessment was not supported by evidence and could not be substantiated. The drawn-out nature of this episode caused significant disruption to my life and was extremely distressing at the time. Still, it was ultimately resolved after a more thorough, evidence-based review. Ultimately, however, this plagued 2025 as it put so much pressure on me and left me feeling pretty broken.
As if to round off the year properly, my fridge/freezer decided to pack in at the very end of 2025.
So here's to 2026, but let's not forget all of the positives that came from 2025. Let's hope I can get myself sorted next year.
It's been a while since I uploaded a new version of ZPE, and it's not because I'm done with it or anything.
ZPE is mature, powerful and robust, and I'm not desperately in need of updating it right now. I am, however, working on adding code blocks to the YASS language but that's not due until the end of December.
As a result, I've released the version planned for the end of October, which has now been rebranded as ZPE 1.13.11 Walmgate.

