Classic ASP · VBScript

Good afternoon, friend!

This whole page is one file. No build step, no package manager, no framework to learn - just HTML with a bit of <% ... %> mixed in wherever you need logic. That was the whole pitch back in 1999, and it's still true today on a server that still runs it.

Live stats (via Scripting.Dictionary)

Session hits1
Application hits (all visitors)2
Server time2026-08-16 12:48:07
10 / 0n/a (divide-by-zero caught gracefully)
Squares of 1 to 5 (via Function)1, 4, 9, 16, 25
Visit log (via FileSystemObject)logged this visit to visits.log

Why this stack was fun to learn

What each new trick bought you

RegExp
Real regular expressions with zero setup - New RegExp, set a pattern, call .Test. No hand-rolled validation loops.
On Error Resume Next
The whole error-handling model in one line: keep going, then check Err.Number whenever you cared. No Try/Catch ceremony.
Select Case
Cleaner than a chain of ElseIfs the moment you have three or more branches - reads like a real switch statement.
Application object
Application("x") is shared by every visitor, forever - a global variable for the whole site, with Lock/Unlock for safety, no server config needed.
Scripting.Dictionary
An associative array out of the box - .Add, .Keys, .Exists - without writing a hash map yourself.
Arrays + UBound
Declare, fill by index, loop to UBound(). Plain, predictable, and built into the language.
FileSystemObject
File I/O in a few lines - open, write, close - enough for a visit log without reaching for a database.
#include
Server-side includes pasted another file's contents in at compile time - the footer below came from footer.inc.asp. No templating engine needed.
With
Saved re-typing an object's name for every member access - .SayHello instead of g.SayHello inside the block.

Try it with a name: add ?name=YourName to the URL (try one with a digit in it and watch the RegExp catch it).

rendered by hello-1999.asp on Sunday, August 16, 2026 · footer pulled in via <!--#include-->