Objo Studio v26.9.3 Released

I’m very happy to announce the immediate availability of Objo Studio 26.9.3.

This one arrives only a few days after 26.9.2, but there are still 50 completed items in the release tracker, spanning new features, improvements and bug fixes. The headline change is a much more guided Web publishing experience, and there are new Web controls and native browser notifications alongside the usual sweep of editor and designer improvements.

Download Objo Studio 26.9.3

Easier Web publishing: from Studio to your own server

Studio was able to publish a Web app as a self-contained server executable but everything after that (e.g. HTTPS, reverse proxies, keeping the app running after a reboot) was left as an exercise for the reader. Now, 26.9.3 closes that gap.

Choosing Solution > Publish in a Web project now starts by asking what you want to do: Test on this computer or Deploy to my server. Studio explains up front that publishing produces a server application and that creating the executable doesn’t put it online. Your destination and platform choices are remembered for next time, and if you’re developing on a Mac or Windows machine you’re guided to the Linux target that matches the documented server setup.

Test on this computer gives the actual published executable a simple start, open and stop experience, so you can exercise exactly what you’ll deploy. Test data lives in a separate local folder and is never copied to production.

Deploy to my server is where it gets interesting. Alongside the executable, Studio now generates a deployment kit containing everything the supported server configuration needs:

  • A systemd service file that runs the app as a dedicated unprivileged user, starts it on boot and restarts it if it stops.
  • A Caddy configuration that handles HTTPS and proxies the WebSocket traffic Web apps rely on.
  • An environment template for secrets, so things like API keys stay out of your project source and published artifacts.
  • Copy-and-paste instructions for installing, verifying, updating and rolling back the app, with releases stored in versioned folders so application data such as a SQLite database survives an update.

To go with it, there’s a new step-by-step tutorial that takes the greeting app from Build Your First Web App all the way to a live HTTPS address on a DigitalOcean Droplet, with Caddy and systemd looking after TLS and uptime. It covers DNS, firewalls, backups, deploying updates without losing data, and recovering from a failed update. If you’ve ever wanted to put an Objo Web app on the internet but didn’t know where to start, this is the path.

The server doesn’t need the .NET runtime installed either; the published executable remains fully self-contained.

A FileUploader control for Web projects

Web projects gain a FileUploader control. A visitor can either click it to open the browser’s native file picker or drop files straight onto it, and the upload arrives in your application’s private server session.

You control the whole transfer. AcceptedFileTypes, AllowMultiple and the MaximumFileCount, MaximumFileSize and MaximumTotalSize properties bound what a visitor can select, and the effective limits are reflected to the browser so an invalid selection is refused before a single byte is sent. The server re-validates everything regardless of what the browser claims.

Three events cover the lifecycle. UploadRequested fires before any content is transferred and lets you reject a file outright by returning True, UploadProgressed reports coalesced progress, and UploadFinished fires exactly once per file whether it completed, was cancelled or failed:

Sub AvatarUploader_UploadFinished(upload As FileUpload)
  If upload.State = FileUploadState.Completed Then
    Var destination As FileSystemItem = SpecialFolder.ApplicationData.Child(upload.FileName)
    upload.TemporaryFile.CopyAs(destination)
  End If
End Sub

Completed uploads are stored under a generated name in a session-private server folder, and you move them wherever they should live with ordinary FileSystemItem operations. Bear in mind that FileName and ContentType are browser claims rather than proof of content, so validate the actual bytes if you care about what you store. The bundled Web File Upload example demonstrates both practices.

Native browser notifications

Web applications can now show real browser notifications - the kind that appear even when the tab is hidden and end up in the platform’s notification centre.

The new BrowserNotifications service is reached through the application (App.BrowserNotifications) and handles the awkward parts of the permission model for you. RequestPermission() presents the user with an in-page Enable notifications button, so the browser’s own permission prompt always follows a genuine user interaction as browsers require. Once permission is granted, showing a notification is a couple of lines:

Var notification As New BrowserNotification("Export complete")
notification.Message = "The report is ready to download."
Self.Application.BrowserNotifications.Show(notification)

Show() never faults the application: every outcome (shown, permission denied, unsupported, not connected) comes back as a return value. Notifications carry click, close and failure events that run on your application’s execution thread like every other Web event, and they’re rate-limited per session so a bug can’t flood someone’s notification centre.

Lots of smaller improvements

Plenty else made it into 26.9.3. Web projects get a server-side Timer that ticks within the visitor’s session and pushes updates to the browser automatically, GroupBox can enumerate and find its child controls with Controls(), FindControl() and FindControlByTag(), the message shown when a session ends is customisable through SessionEndedMessage, and new Web projects start life sensibly named WebApp. The Web ListBox has had a thorough cleanup: field backgrounds, grid lines, hover highlighting and column widths now render consistently at runtime, in the Inspector and in designer previews, and Web runs no longer end when the browser visits a custom HTTP endpoint.

The Web page designer is nicer to use as well. Right-clicking the surface offers a context menu, dragging a control somewhere it isn’t allowed shows where it will land rather than leaving it overlapping another control, each page remembers the layout you were editing, the grid position fields in the Inspector are editable, and empty ImageViewer and Label controls are visible while designing.

On the Desktop side, Window exposes KeyDown and KeyUp events, Canvas gains Graphics.Clear(colour), individual PopupMenu rows can be disabled, and the system symbol catalogue has grown by 199 new symbols. HTMLViewer on Windows now honours BaseURL for HTML strings, loads HTML larger than 2 MB, and restores local assets correctly when navigating through history.

Elsewhere, the editor’s context menu gains a command to find the selected code, localisation string files are stored as readable Unicode text, diagnostics for runs of double quotes at string boundaries are much clearer, and a debug run that rejects a second browser tab now says so instead of failing mysteriously. Online documentation searches now require all search terms to match, and the documented Objo Agent Skill for AI assistants is versioned alongside releases.

As always, the complete list is available in the changelog.

Download Objo Studio 26.9.3

Enjoy!

4 Likes