Project

Minside Admin

A small native Windows shell for clients with SaaS products. It embeds Chromium, loads the live client portal, and feels like a desktop app - without copying the website into the installer. The product catalogue is still a showcase, but the Analytics SaaS is fully working.

← Back to projects Contact about the desktop client

What it is

Minside Admin is an Electron app: a locked window that opens the real login and product portal on simonringwelski.dk. There is no address bar and no general browsing - just a desktop icon, persistent session, and recovery when the network or renderer misbehaves.

Only the shell is packaged (main process, preload bridge, icon). The website always comes from the server, so clients get the same PHP backend, auth, and SaaS products they would in a browser - with a desktop-first frame around them.

Think of it as Chrome with no chrome: same site, same accounts, forced onto the domain, with a desktop shortcut and crash/network recovery.

  • Native Windows shell around the live client portal
  • SaaS product launcher with account and licence checks
  • Analytics SaaS is production-ready; the broader catalogue is still a showcase
  • Installer and portable builds via electron-builder

Secure login

Launch opens a focused admin login inside the Electron window. Users sign in with their account credentials before any products appear - the same auth stack as the web portal, surfaced in a distraction-free desktop frame.

Secure authentication interface with a clean, distraction-free design. Users authenticate using their account credentials before accessing their available SaaS products.

The entry URL includes client=desktop-app so the site can detect the wrapper and tweak the UI for the locked window (theme toggle, layout, and desktop-specific cues).

  • Loads auth/login.php inside a locked Electron window
  • Clean, distraction-free authentication UI
  • Desktop client query lets PHP/JS adapt the experience

Two-factor authentication

When an account has 2FA enabled, the desktop client continues the same authenticator flow as the web: a six-digit app code, or one of the ten-digit backup recovery codes if the phone is unavailable.

Built-in support for Two-Factor Authentication (2FA) using authenticator applications and backup recovery codes, providing an additional layer of account security.

Nothing about MFA is reimplemented in Electron - the shell simply hosts the hardened login pages, so security policy stays centralised on the server.

  • Authenticator app codes (6 digits)
  • Backup recovery codes (10 digits)
  • Cancel and return to password login when needed

Products dashboard

After login, clients land on a product home that lists subscriptions and purchased SaaS apps available on their account. Active products show status and an open action that launches the app inside the same shell.

A centralized dashboard displaying all active subscriptions and purchased products. Users can launch applications directly from the client while the system automatically verifies account access and licensing.

Access and licensing are verified by the server when a product opens - the desktop client is the launcher, not a separate licence store.

  • Central list of active subscriptions and products
  • One-click open into the selected SaaS UI
  • Account access and licensing checked on the server

Analytics SaaS (live)

Analytics is not a mock screen. Clients open a working analytics product from the desktop: traffic, visitor behaviour, content performance, audience, events, usage, and Core Web Vitals for their property.

A desktop interface for the Analytics platform, providing access to website traffic, visitor behavior, content performance, Core Web Vitals, and other website insights through a dedicated native client.

Date ranges, property management, and consent-aware collection stay on the same backend as the web experience - the native client is simply the preferred way to run it day to day.

  • Traffic, content, audience, performance, events, and usage
  • Core Web Vitals and related website insights
  • Fully working product - not a showcase placeholder

Architecture

Minside Admin.exe starts an Electron main process. That process owns the BrowserWindow, navigation guards, persistent cookie partition, and auto-reload on errors. Chromium then loads the live site on simonringwelski.dk.

Architecture overview of the desktop client. Built with Electron, the application acts as a secure wrapper around the web platform. It provides persistent authentication, navigation control, automatic recovery from connection errors, and a desktop-optimized experience while loading the web application through Chromium.

main.js holds window creation, domain lock, recovery backoff, and session persistence. preload.js is the bridge between Electron and the page and is kept empty or minimal on purpose. package.json drives scripts and electron-builder output.

Dev uses npm start against local main.js. Release runs npm run dist: convert the logo to .ico, then produce Minside Admin Setup (installer + shortcut) and a portable .exe. The website itself is never packed into the binary.

  • Electron main process + Chromium renderer
  • Navigation guards limited to simonringwelski.dk (and subdomains)
  • persist:minside partition for cookies and site storage
  • Auto-reload with backoff when load/crash/hang occurs
  • electron-builder installer and portable Windows builds

Shell behaviour & security

On launch the window title is “Minside Admin” and the first URL is the live login with client=desktop-app. External links and off-domain redirects are blocked inside the app and opened in the user’s normal browser instead.

Sessions survive restarts because cookies and storage live under Electron’s user data folder and flush to disk on quit. If the main page fails, the renderer crashes, or the page hangs, reload is scheduled with backoff from 1s toward a 30s cap; a successful load resets the counter.

Security defaults stay strict: nodeIntegration off, contextIsolation on, sandbox on - so the website cannot reach Node or file APIs through the shell.

  • No address bar; domain-locked navigation
  • Persistent login across app restarts
  • Backoff reload on load failure, crash, or hang
  • nodeIntegration: false, contextIsolation: true, sandbox: true