ASPPY 1.0 · MIT License · Python ≥ 3.9

Run Classic ASP on modern Python - no IIS required.

ASPPY is a lightweight Python runtime that executes your existing .asp / VBScript pages on Windows, Linux and macOS. Full object model, broad built-in coverage, zero third-party dependencies - most legacy ASP applications just work.

pip install asppy[all] --upgrade
< 900 KB
Human-readable runtime
60 locales
Verified against IIS
3 platforms
Windows · Linux · macOS
0 dependencies
Pure Python standard library
Quick start

Up and running in three steps

No build step, no configuration files, no restarts. Install Python, install ASPPY, serve your folder.

Install Python

Python 3.9 or newer on any OS - Windows, Linux or macOS. ASPPY is a Python application, so Python is required on every machine that runs it, including your production server.

python.org/downloads

Install ASPPY

One command from PyPI. The core runtime has zero third-party dependencies - it runs on nothing but the Python standard library, and SQLite works out of the box.

pip install asppy[all] --upgrade

Serve your .asp folder

Put your .asp files in a folder - say www - and serve it. Point your browser at http://localhost:8080 and your pages are live.

asppy 0.0.0.0 8080 www
Why ASPPY?

Decades of business logic, zero rewrites

Classic ASP applications represent decades of hard-won business logic. Rewriting them is expensive and risky. ASPPY lets you keep your existing .asp files exactly as they are and serve them through a lightweight Python HTTP server.

  • No COM, no Windows dependency, no IIS license - the same codebase runs on Linux, macOS or Windows.
  • The full Classic ASP object model: Request, Response, Session, Application, Server.
  • Broad VBScript built-in coverage - strings, dates, math, arrays, RegExp and more.
  • Deployment is a file copy. Edit an .asp file, hit refresh, it's live.

Performance comparable to IIS

Real-world throughput on par with Classic ASP under IIS - and on Linux, where Python typically runs 10–30% faster than on Windows, ASPPY pulls ahead. Without the Windows Server license.

+10–30%
faster on Linux vs Windows
€ single-digit
monthly hosting on a nano VPS
Features

Radically simple. By design.

While other frameworks pile on tooling, ASPPY strips it away. That's what sets it apart.

No build step. Ever.

No npm install, no bundlers, no transpilers, no setup scripts, no dependency hell. You edit an .asp file, you hit refresh, it's live. Deployment is a file copy.

< 900 KB, human-readable

Not MBs - KB. About 40 plain Python files plus one generated locale table (~195 KB zipped). No black box, no vendor magic: read all of it, it fits in your head.

Compiled, not interpreted

ASPPY runs on Python, which compiles code to bytecode before execution. Your ASP pages aren't re-scanned as raw text on every hit.

Cached & auto-invalidating

Each page is parsed and compiled once, then served from an in-memory cache. Edit any file - includes too - and ASPPY recompiles automatically. No restart, no cache-busting.

IIS-class performance

Real-world throughput on par with Classic ASP under IIS - and ahead of it on Linux, without the Windows Server license.

No giant executables

No multi-hundred-MB installers, no self-contained EXE blobs, no Docker images to babysit. Python + a folder of source files - that's the whole deployment story.

Runs on a nano VPS

512 MB RAM and 1 vCPU is enough to serve production traffic. No JVM warm-up, no node_modules eating your disk - hosting costs measured in single-digit euros per month.

Built for the AI era

A readable codebase small enough that any modern LLM can understand in minutes. The perfect match for vibe coding - see below.

Vibe coding

Built for the AI era - the perfect match

ASPPY is newer than every model's training cut-off, so no LLM knows anything about it out of the box - and installing a package cannot change that. Knowledge only reaches a model as text in its context window. So the docs travel inside the package, and one command hands them over. Skip this step and the model will invent an API that doesn't exist. It's the single highest-leverage thing you can do.

terminal - feeding your AI agent
$ asppy-guide                 # prints developers.md - conventions, object model, gotchas
$ asppy-guide --list          # every bundled document
$ asppy-guide --open prompt-builder  # opens a prompt builder in your browser

Agentic tools

Claude Code, OpenCode, Codex, Cursor, Copilot: run asppy-guide and give the agent its output before asking for any ASP. Everything is on disk after pip install - nothing to download.

Chat assistants

Gemini or ChatGPT in a browser can't read your disk. Pipe the brief into your clipboard with asppy-guide | clip and paste it - or use a prompt builder to generate a complete ready-to-send prompt.

Point your AI agent at developers.md before any development - it cuts development time and cost by 30–40% and significantly improves code quality, even when using free AI coding agents. Legacy modernization, rapid prototyping, full production apps: what used to take weeks of budget now happens in an afternoon.
Showcase

Built with ASPPY - real websites, real users

ASPPY isn't a proof of concept. It runs production websites in the wild - from SaaS products to healthcare tooling to e-learning - built, deployed and used by real people every day.

Screenshot placeholder of the LifeAdmin team and personal organization SaaS dashboard
SaaS

LifeAdmin

lifeadmin.be

A multilingual SaaS platform for organizing life and work: shared workspaces, task management, project tracking and real-time collaboration - all served by ASPPY.

Screenshot placeholder of the FlowDent dental practice management suite
Healthcare

FlowDent

flowdent.be

A complete, GDPR-compliant management suite for dental practices: waiting lists, inventory, digital signatures and tasks - trilingual with 8+ modules, running on ASPPY.

Screenshot placeholder of the FlowDent Nomenclature RIZIV code browser with search and filters
Data

FlowDent Nomenclature

nomenclatuur.flowdent.be

A searchable database of 31,000+ Belgian RIZIV/INAMI nomenclature codes with filters, tariffs and cumulation rules - data-heavy pages served fast by ASPPY.

Screenshot placeholder of the Learn ASPPY e-learning platform course page
E-learning

Learn ASPPY

learnasppy.quickersite.com

A full e-learning platform - courses, lessons, enrollments and user accounts - built with Classic ASP and SQLite on ASPPY. And it teaches you ASPPY itself.

Running your own site on ASPPY? Open an issue or PR to get it featured here.

Installation

One command from PyPI

Prerequisite: Python 3.9 or higher on any machine that runs ASPPY - including your production hosting server.

terminal
# core runtime - zero third-party dependencies
pip install asppy
terminal - from source
git clone https://github.com/PieterCooreman/ASPPY.git
cd ASPPY
pip install -e ".[all]"

Optional extras

Some features reach for a third-party library. Each one is imported lazily and only by the feature that needs it, so you install just what your application actually uses. Skip an extra and the matching feature raises a clear error naming the package to install - nothing else breaks.

ExtraCommandEnables
pdfpip install "asppy[pdf]"PDF generation (fpdf2)
imagepip install "asppy[image]"Image resize / crop / filter / watermark (pillow)
cryptopip install "asppy[crypto]"bcrypt password hashing (bcrypt)
odbcpip install "asppy[odbc]"ADODB via ODBC: Access, Excel, SQL Server, PostgreSQL, MySQL (pyodbc)
xmlpip install "asppy[xml]"MSXML full XPath 1.0, XSLT and CDATA (lxml, certifi)
allpip install "asppy[all]"All of the above
CLI

The five commands

Everything you need to create, serve, render and health-check an ASPPY application.

CommandWhat it does
asppy-new myappCreate a new app from the MVC starter template - routing, SQLite, views and layout already wired up. Start here.
asppy [host] [port] [docroot]Serve a folder of .asp pages over HTTP. Defaults: 0.0.0.0 8080 web. Pass :: as host for IPv6.
asppy-render PAGE.aspRender one page to stdout or a file - no socket, no browser. Great for diffing output and CI.
asppy-check FOLDERRecursively render every .asp page in a folder and report the ones that fail, with file and line number.
asppy-guidePrint the developer/agent brief. --list shows every bundled document; --open opens a prompt builder in your browser.
terminal - zero to running app
$ asppy-new myapp
$ asppy 127.0.0.1 8080 myapp

# render a single page, with a query string and response headers
$ asppy-render www/default.asp --query "id=42" --show-headers

# health-check the whole app - exit code 1 if anything fails (CI friendly)
$ asppy-check www

Also works as a module

Handy in .bat files, systemd units and Docker CMD lines:

terminal - python -m
python -m ASPPY 0.0.0.0 8080 www
python -m ASPPY.server 0.0.0.0 8080 www
python -m ASPPY.cli www/default.asp
python -m ASPPY.check www
Compatibility

What's supported

Practical app-level compatibility, not byte-for-byte IIS parity. If you're migrating a critical application, run your own regression tests against ASPPY alongside IIS before cutting over.

AreaCoverage
VBScript built-ins (strings, dates, math, arrays)Near-complete
Request / Response / Session / Application / ServerNear-complete
Scripting.Dictionary / Scripting.FileSystemObjectSupported
ADODB.Connection / Recordset / Command / StreamPartial
Database backends - SQLite, Access, Excel (read-only), ODBC, PostgreSQLSupported
VBScript.RegExpSupported
MSXML HTTP & DOM (security-sandboxed)Partial
CDO.Message (SMTP) · POP3 / IMAPPartial
Global.asa eventsSupported

Beyond classic ASP

ASPPY ships extended helpers accessible from VBScript via the global ASPPY object: JSON encode/decode, ZIP, PDF generation, image processing and bcrypt password hashing.

Platform support

Windows Linux macOS
Localization & encoding

Locale-aware by default - UTF-8 everywhere

60 locales, verified against IIS

ASPPY implements the Classic ASP locale model - Session.LCID, Response.LCID, <%@ LCID %>, GetLocale/SetLocale. Formatting, parsing and collation are all locale-aware: FormatNumber/FormatCurrency/FormatPercent, FormatDateTime, MonthName/WeekdayName, CDbl/CDate/IsNumeric/IsDate, Weekday and StrComp with vbTextCompare.

en-USnl-BEfr-FRde-DEes-ESit-ITpt-PTja-JPzh-CN+51 more
  • Default locale is 1033 (en-US) when nothing is set - deterministic across hosts.
  • CStr(date) stays ISO until a locale is selected, so apps that concatenate dates into SQL keep working.

UTF-8 by default - an intentional break from IIS

IIS defaults to the host's ANSI codepage (1252, 932…). ASPPY instead defaults to UTF-8 everywhere: Linux and macOS have no meaningful "system ANSI codepage", every modern consumer assumes UTF-8, and VBScript strings are Unicode internally - UTF-8 is the only encoding that round-trips them losslessly. Legacy windows-1252 files need no conversion; ASPPY detects and decodes them automatically.

SurfaceASPPYIIS
Session/Response.CodePage65001 (UTF-8)system ANSI (e.g. 1252)
Response.Charsetutf-8unset - header omits charset
.asp source filesUTF-8, BOM-tolerant, cp1252 fallbackBOM, else @CODEPAGE, else metabase
Request.Form / QueryStringdecoded as UTF-8per Session.CodePage
Server.URLEncodepercent-encoded UTF-8per current codepage

Only intervene where a non-browser consumer expects legacy bytes (CSV for Excel, banking/EDI files): set Response.Charset = "windows-1252" on those responses.

Get started

Zero to running app

From a bare pip install, in under a minute:

terminal
$ asppy-new myapp
$ asppy 127.0.0.1 8080 myapp