Skip to content

manticore-projects/webswing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,135 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WebSwing Lite 26.1

Enterprise Java Swing Applications — Delivered Through Your Browser

Build Version JDK 17+ Node.js 24 License: AGPL v3 Build GitHub

Known Vulnerabilities Semgrep Semgrep


Run any Java Swing application inside a modern web browser — pure HTML5, zero plugins, zero client-side installation.


Getting Started · Build · What's New · Architecture


Overview

WebSwing Lite is a modernized, open-source edition of WebSwing — the web server that renders Java Swing applications in HTML5 Canvas and delivers them to any browser via WebSocket.

This edition is based on the last open-source release (v20.2.5) of WebSwing, updated and maintained by Manticore Projects with a focus on modern JDK compatibility, security, and build toolchain modernization.

Looking for the full-featured commercial edition? WebSwing Lite does not include advanced capabilities such as cluster session pooling, load balancing, recording/playback, advanced admin console, and commercial support. For production deployments at scale, we encourage you to explore the Commercial Edition at webswing.org


✦ What's New

JDK Compatibility

Recommended standard OpenJDK distributions: Eclipse Temurin, BellSoft Liberica, or Amazon Corretto.

JDK Status Temurin Support Notes
17 (LTS) 🔶 Supported Oct 2027 Toolchain of the build
21 (LTS) ✅ Supported Dec 2029
23 ✅ Supported ⛔ EOL (Mar 2025) Non-LTS, 6-month lifecycle
25 (LTS) ✅ Supported Sep 2031 Current LTS
26 ✅ Supported Sep 2026 Non-LTS; requires --sun-misc-unsafe-memory-access=allow

All internal APIs adapted for the post-JDK-11 module system — no --illegal-access=permit, no -noverify required.

Beware: JetBrains Runtime modifies AWT's internal keyboard focus dispatch, which breaks when Webswing replaces the toolkit. Mouse events are unaffected because they bypass the patched focus path.

Demo

Try the Online JSQLFormatter using Webswing Lite JSQLFormatter Screenshot

Features

  • Shiro Security Plugin with hot configuration reloading provides authorization via AD/LDAP/Database/Text Files with or without 2FA (Second Factory authorization)
  • SVG Application Icons
  • better server start scripts supporting SSL certificate registration and WAR version numbers
  • Deduplication of the java libraries in the WAR file, reducing the size drastically

Build & Runtime Modernization

  • Node.js 24 LTS — migrated from Node 10; Webpack 5, TypeScript 5, Dart Sass
  • Gradle build system — fast, incremental builds
  • All dependencies updated — Jetty12, Jackson3, Guava, Log4j2, SLF4J 2.0, Apache Commons, Protocol Buffers, LZ4, and more
  • Active monitoring via SNYK and Semgrep

Performance

  • SSE/AVX-optimized PNG encoding via fpng-java — hardware-accelerated image compression in the DirectDraw rendering pipeline
  • Browser-side font rendering — text is rendered as font names + coordinates instead of server-side glyph bitmaps, reducing WebSocket bandwidth by up to 80%
  • GZIP/Brotli pre-compression for all static assets (reducing the JS size from 5 MB to less than 1 MB), GZIP compression for all content (JSON)

🚀 Getting Started

Prerequisites

Component Version
JDK 17 or later (21+ recommended; Eclipse Temurin)
Xvfb Required on headless Linux servers

Quick Start

# Download the latest release
curl -LO https://github.com/manticore-projects/webswing/releases/latest/download/webswing-26.1.zip
unzip webswing-26.1.zip
cd webswing-26.1

# Start the server
./run.sh start

# Open in your browser
open http://localhost:8080

Management

./run.sh start      # Start the server (background, with log tailing)
./run.sh stop       # Graceful shutdown (30s timeout, then SIGKILL)
./run.sh restart    # Stop + Start
./run.sh status     # Check if the server is running

🔨 Build Instructions

Prerequisites

Tool Version
JDK 21+
Gradle 8.12
Git 2.x

Node.js and npm are automatically downloaded during the build — no manual installation needed.

Build with Gradle

# Clone the repository
git clone https://github.com/manticore-projects/webswing.git
cd webswing

# Full build
./gradlew clean build

# Build specific modules
./gradlew :webswing-directdraw:webswing-directdraw-javascript:build
./gradlew :webswing-server:webswing-server-frontend:build

Deploy

# Extract to your deployment directory
unzip build/dist/webswing-26.1.zip -d /opt/webswing

# Configure your Swing application in webswing.config
vim /opt/webswing/webswing.config

# Start
cd /opt/webswing && ./run.sh start

🏗 Architecture

┌─────────────────────────────────────────────────────────────┐
│                        Browser                              │
│  ┌───────────────────────────────────────────────────────┐  │
│  │  HTML5 Canvas  ◄──── WebSocket ────►  Event Capture   │  │
│  └───────────────────────────────────────────────────────┘  │
└─────────────────────────────────┬───────────────────────────┘
                                  │
                    ┌─────────────▼──────────-───┐
                    │     WebSwing Server        │
                    │    (Jetty 12 / Servlet)    │
                    │                            │
                    │  ┌──────────────────────┐  │
                    │  │  Session Manager     │  │
                    │  │  Security (Shiro)    │  │
                    │  │  WebSocket Handler   │  │
                    │  └──────────┬───────────┘  │
                    └─────────────┼──────────────┘
                                  │ spawns
                    ┌─────────────▼─────────-────┐
                    │     Child JVM Process      │
                    │                            │
                    │  ┌──────────────────────┐  │
                    │  │  WebToolkit (AWT)    │  │
                    │  │  DirectDraw Pipeline │  │
                    │  │  Font Renderer       │  │
                    │  │  ──────────────────  │  │
                    │  │  Your Swing App      │  │
                    │  └──────────────────────┘  │
                    └────────────────────────────┘

How it works: The server intercepts Java2D Graphics2D paint operations in the child JVM, serializes them via Protocol Buffers, and streams them over WebSocket to the browser. The browser's JavaScript engine deserializes and replays the draw commands on an HTML5 Canvas. User input (mouse, keyboard) flows back over the same WebSocket.


📦 Dependency Overview

Component Version Purpose
Jetty 12.1.7 Embedded HTTP/WebSocket server
Jackson 3.1.1 JSON serialization
Protocol Buffers 3.25.5 Binary wire format (DirectDraw)
Apache Shiro 1.13.0 Authentication & authorization
Guava 33.5.0 Core utilities
Log4j 2 2.25.3 Logging framework
SLF4J 2.0.17 Logging facade
Webpack 5.x JavaScript bundling
TypeScript 5.x Type-safe frontend code

Attribution

This project is based on WebSwing v20.2.5, the last open-source release under the AGPL v3 license. All credit for the original WebSwing architecture and implementation goes to the WebSwing team.

If you use WebSwing Lite to deliver your product, please provide attribution and a link to webswing.org.

License

This project is licensed under the GNU Affero General Public License v3.0.


Maintained by Manticore Projects

Building enterprise financial software for banks and insurances since 2011.