fredlackey.com Showcase — Notable Engagements Software & Architecture

Fred Lackey

Senior Software Engineer & Architect

WebStudio: CMS Before CMS Was a Category

In 2000, before WordPress, before Drupal, before the word "CMS" had fully entered the industry vocabulary, Cytura was building WebStudio — a platform that let organizations create, manage, and publish structured web portals without writing code for every page. The idea was right. The technology problem was complicated.

WebStudio's core capability was a rules-driven personalization engine: a system that could tailor content to a specific user based on their medical condition, age group, accessibility requirements, or any combination of configurable criteria. For healthcare organizations — the primary market — this meant a single platform could serve a patient with visual impairment completely differently than a clinician accessing the same records. Section 508 compliance was not bolted on after the fact. It was built into the rendering pipeline from the beginning.

"Personalized content for every user. Rules-driven, criteria-based, and fully accessible — in 2000, that was not a standard product. It was a research problem."

The rendering architecture was equally deliberate. Content was stored as XML. Presentation was handled by XSLT stylesheets. The engine combined XML data with the appropriate XSLT template at request time and produced clean, standards-compliant HTML — a separation of content and presentation that web developers would still consider clean practice two decades later.

Two Ports. One Platform. No Restarts.

The career-defining challenge at Cytura was not building WebStudio once. It was building it, then rebuilding it, then rebuilding it again — each time in a fundamentally different language and runtime environment, each time without abandoning what existed in production.

Phase 1 — Original
Visual Basic & SQL Server

The initial platform: VB6, SQL Server 2000, COM+ for component services, MSMQ for messaging, and TCP/IP sockets for real-time communication. Windows-native, tightly coupled, and fully functional.

VB6 SQL Server 2000 COM+ MSMQ WinForms
Phase 2 — First Port
Java & Oracle

Full platform migration to Java, JSP, Swing for the desktop components, and Oracle 8i as the database. Cross-platform by requirement. C++ adapters bridged legacy data. No features dropped in transit.

Java JSP Swing Oracle 8i C++
Phase 3 — Second Port
.NET & C#

The platform migrated again — this time to Microsoft's newly released .NET Framework. ASP.NET for the web layer, C# throughout, WinForms replacing Swing. Legacy DB2 and IMS databases connected via custom adapter components.

C# .NET Framework ASP.NET WinForms DB2 / IMS

Porting a production system once is an engineering challenge. Porting it twice, in sequence, while maintaining feature parity across all three implementations, requires a different kind of discipline: the ability to hold the conceptual model of the product constant while the language, runtime, component model, and database change beneath it.

The double-port was not a management decision gone wrong. It was a calculated response to a rapidly shifting enterprise software landscape at the exact moment Java and .NET were both declaring themselves the future. Cytura needed to work in client environments committed to either platform. The answer was to build both — from the same foundation, with the same architecture, by the same team.

Ingesting the National Library of Medicine

WebStudio's personalization engine was only as good as the content it could personalize. For healthcare clients, that meant data — structured, normalized, medically accurate data at massive scale. The most demanding example: the National Library of Medicine's PubMed database.

PubMed Source Feed (hundreds of GB, XML/MEDLINE format)
         │
         ▼
┌─────────────────────────────────────────┐
│          C++ / VB Ingestion Adapter     │
│   — chunked reads, paced throughput     │
│   — field extraction & normalization   │
│   — type mapping & deduplication        │
└─────────────────────────────────────────┘
         │
         ▼
┌─────────────────────────────────────────┐
│        Normalization Pipeline           │
│   — author / journal standardization   │
│   — MeSH term classification           │
│   — publication type tagging            │
└─────────────────────────────────────────┘
         │
         ▼
┌─────────────────────────────────────────┐
│        WebStudio Content Store          │
│   — XML document repository            │
│   — XSLT rendering templates            │
│   — personalization rule engine         │
└─────────────────────────────────────────┘
         │
         ▼
  Tailored HTML per user profile
  (condition, age group, accessibility need)

The adapters were custom-built: first in C++ and Visual Basic for the initial platform, then rewritten in C# for the .NET era. Each adapter had to handle the scale realities of government-maintained scientific databases — hundreds of gigabytes of structured data that arrived in bulk exports rather than clean API feeds. Chunked reads. Paced throughput to avoid database saturation. Field normalization to reconcile inconsistent source formatting against a clean internal schema.

PubMed was the flagship use case, but the adapter architecture was designed to generalize. Any structured data source — proprietary hospital systems, pharmaceutical databases, insurance formularies — could be ingested through the same pipeline with a new adapter component. That extensibility was the point.

Content and Presentation, Cleanly Separated

WebStudio's rendering pipeline was built on a principle that most web frameworks would not formally codify for another decade: the complete separation of content from presentation. Content lived as XML documents. Presentation was handled entirely by XSLT stylesheets. At request time, the engine combined the appropriate XML data with the appropriate template — selected by the personalization rules engine — and produced the output HTML.

What This Enabled
Single-Source, Multi-Output Publishing

The same underlying content could be rendered differently for every user segment. A patient with visual impairment received a high-contrast, large-type layout with screen-reader-compatible markup. A clinician received a dense information view with cross-references and metadata. An administrator received an edit view with structured fields.

No template duplication. No conditional HTML scattered through the markup. The presentation logic lived entirely in XSLT.

Section 508 Compliance
Accessibility as Architecture, Not Retrofit

Section 508 — the federal accessibility standard for software used by government agencies — was not a checklist applied at the end of development. The rendering pipeline was designed from the start to produce markup that met its requirements for visual, mechanical, and cognitive accessibility.

Text alternatives for non-text content. Keyboard-navigable interfaces. Consistent navigation. Color that was never the sole carrier of information. These weren't edge cases — they were first-class output targets in the XSLT templates.

The XML/XSLT approach survived all three platform incarnations. VB, Java, .NET — the rendering pipeline's conceptual model was language-agnostic. The content store and template system transferred cleanly across each port because they were defined in standards, not in language-specific idioms. That was not a coincidence. It was a deliberate architectural choice that made the double-port possible at all.

Rules That Knew the Reader

The personalization engine was the commercial heart of WebStudio. Not personalization in the 2020s sense of recommendation algorithms and behavioral tracking — but structured, rules-driven content selection based on explicitly defined user attributes. A set of configurable criteria determined which content a given user profile would see, which template would render it, and which accessibility accommodations would apply.

Medical
Condition-Based Routing
Content tailored by medical condition, diagnosis category, or treatment context. A patient managing diabetes saw different reference material than one managing cardiac risk — from the same content repository.
Demographic
Age Group Segmentation
Pediatric patients, adult patients, and elderly patients each received content appropriate to their cohort — vocabulary, reading level, layout density — without manual duplication of source material.
Accessibility
Impairment Accommodation
Visual, mechanical, and cognitive impairment profiles triggered specific rendering paths: enlarged text, simplified layout, keyboard-only navigation, screen-reader markup — automatically, based on registered user attributes.

The criteria engine was extensible. New attribute types could be defined without modifying the core engine. New rules could be authored without deploying code changes. For healthcare organizations managing content across diverse patient populations, this configurability was the difference between a product that fit their workflow and one that didn't.

Bridging the Gap to Enterprise Systems

Healthcare organizations in 2000 were not running on clean, modern stacks. They were running on IBM mainframes, DB2 databases, and IMS transaction systems that had been in continuous operation for decades. WebStudio had to connect to them — or it couldn't serve the clients that mattered most.

The solution was a set of adapter components built specifically to bridge the .NET runtime to legacy mainframe environments. DB2 and IMS connectors that abstracted the query and transaction semantics of each system behind a consistent interface. WebStudio's content engine didn't need to know which storage system it was talking to. The adapters handled that translation.

The same adapter pattern that handled PubMed ingestion handled mainframe integration. A problem framed as data import turned out to generalize to the broader enterprise connectivity challenge — and the architecture that solved one solved the other.

Deployment utilities completed the picture: automated installer and configuration tools designed for enterprise rollouts in environments where IT departments expected scripted, repeatable installation procedures rather than manual setup steps. In organizations running regulated software on controlled infrastructure, that expectation was non-negotiable.

Three Stacks. Two Ports. One Platform.

Phase 1
VB Era
Windows-Native Original

The founding implementation. VB6 for application logic, COM+ for distributed component services, MSMQ for async messaging, TCP/IP sockets for real-time protocol work, SQL Server 2000 as the database, WinForms for the desktop tools.

Visual Basic 6 SQL Server 2000 COM+ MSMQ TCP/IP Sockets WinForms XML/XSLT
Phase 2
Java Era
Cross-Platform Port

Full migration to the Java ecosystem. Server-side rendering via JSP. Desktop components rebuilt in Swing. Oracle 8i replacing SQL Server. C++ adapters bridging the data ingestion layer from PubMed and other structured sources.

Java JSP Swing Oracle 8i C++ XML/XSLT
Phase 3
.NET Era
Microsoft Modern Stack

Migration to the newly released .NET Framework. C# throughout. ASP.NET for web delivery. WinForms for desktop. Legacy DB2 and IMS integration via custom adapter components. C# data adapters replacing the C++ versions for structured data ingestion.

C# .NET Framework ASP.NET WinForms XML/XSLT DB2 IMS Database
Languages
  • C# / .NET Framework
  • Java / JSP
  • Visual Basic 6
  • C++
Rendering
  • XML Document Store
  • XSLT Stylesheets
  • ASP.NET Web Layer
  • JSP Templates
Desktop / UI
  • WinForms (.NET)
  • Swing (Java)
  • VB6 Forms (original)
Databases
  • SQL Server 2000
  • Oracle 8i
  • IBM DB2
  • IBM IMS
Messaging / Services
  • COM+ Components
  • MSMQ
  • TCP/IP Sockets
Integration
  • PubMed / NLM Adapters
  • DB2 Connector
  • IMS Adapter
  • Deploy Utilities