Project Document  ·  AS-001

Blueprint ofAshley Sum

Computer Science · Software Engineering
San Francisco State University

Revision3.0
Scale1:1
TypePortfolio
AuthorAshley Sum
Updated2026-08-13
Sheets6
Document begins
Drawing A-001  Identity
Sheet 1 of 6  ·  Rev 3.0  ·  Scale 1:1  ·  Active

Identity

01 Background Malaysia · INTI · San Francisco A-002
02 Now Computer Science · aquatics A-003
03 Engineering Systems · software · physical operations A-004
04 Athletics Competitive swimming · aquatics A-003

Component Specification

Now

I am studying Computer Science at San Francisco State and working as a Student Lead in Aquatics, with software engineering experience across systems, interfaces and physical operations.

Studying
B.S. Computer Science
Current
Student Lead, Aquatics
Seeking
Summer 2027 software engineering internship

The fullest example is cad-to-map, which turns a CAD site plan into a wayfinding map that runs with no network connection. Six kiosk sites were built from it, and its public repository carries 80 tests and 21 routing checks.

From
Malaysia · INTI International College Subang
Location
San Francisco, CA · relocatable
Availability
Summer 2027
Contact
ashleysumtzele04@gmail.com · GitHub · LinkedIn · Résumé
Drawing A-002  Education
Sheet 2 of 6  ·  Rev 3.0  ·  Active

Education

From a degree-transfer program in Malaysia to a Computer Science degree in San Francisco.

EDU-01 · PreviousAug 2023–Dec 2024

INTI International College Subang

Subang Jaya, Malaysia

American Degree Transfer Program, Applied Science

Completed before transferring to San Francisco State University.

TransferredDec 2024 Jan 2025
EDU-02 · CurrentJan 2025–Present

San Francisco State University

San Francisco, California

Bachelor of Science, Computer Science
Fig. A-002.1 — Academic transition Professional experience → A-003
Drawing A-003  Experience
Sheet 3 of 6  ·  Rev 3.0  ·  Active

Experience

Professional experience developing software systems and coordinating safety-critical facility operations.

Software / Systems

Builder track
  1. EXP-01 · PreviousJun–Sep 2024

    IT Support

    Zengo Corporation · Malaysia

    Developed an inventory application that automated stock calculations, and supported internal users and enterprise systems.

    Inventory tracking · Support + troubleshooting

    Scope & output
    • Developed an inventory tracking application that automated stock calculations.
    • Diagnosed technical issues affecting internal users and enterprise systems.
  2. EXP-02 · InternshipJun–Aug 2026

    Software Engineering Intern

    OSPIT Mobility · Technical / R&D · Malaysia

    Researched and developed a highway digitalization ecosystem, alongside offline mapping, point-of-sale integration and mobile applications.

    5 workstreams · Drawings 05.1–05.3
    Project evidence → A-005

    Scope & results
    • Researched live highway systems, APIs, source code and operational records to document the existing architecture and identify integration gaps.
    • Designed end-to-end workflows for equipment registration, monitoring, fault detection, human approval, maintenance, repair and closure.
    • Developed a unified identity model across the maintenance register, the control system and the network monitor for hundreds of roadside devices.
    • Implemented synchronization and validation services with dry-run defaults, idempotent execution and explicit partial-read detection.
    • Developed fault-correlation logic that reduced 248 monitoring outages to 24 actionable findings.
    • Developed and validated a report-to-repair workflow in staging with duplicate prevention and human authorization.
    • Developed an Asset Console consolidating equipment identity, system availability, data quality, active faults and maintenance status.
    • Produced technical architecture, flowcharts, system-boundary documentation and operational procedures.
    • Developed a CAD-to-map pipeline deployed across six touchscreen kiosk sites.
    • Designed a printer-integration service that lets a cloud point-of-sale reach multiple thermal-printer models through its one supported protocol.
    • Implemented a consent flow and resolved production defects in a live Android application.
    • Migrated a native mobile application to a different backend, then to a WebView interface.

Operations / Aquatics

Operator track
  1. EXP-03 · PreviousAug 2025–Mar 2026

    Lifeguard

    Mashouf Wellness Center · San Francisco, California

    Protected patron safety through active surveillance, facility checks, and emergency readiness on the pool deck.

    Lifeguarding · CPR · AED · First Aid

    Operational responsibility
    • Maintained surveillance and incident readiness on an active pool deck.
    • Completed facility checks and opened or closed the aquatics area.
  2. EXP-04 · CurrentApr 2026–Present

    Student Lead, Aquatics

    SFSU Campus Recreation · San Francisco, California

    Coordinates student staff and daily aquatics operations while supporting facility management and enforcing safety standards.

    Staff · Safety · Facility operations

    Leadership & operations
    • Opens and closes the facility and coordinates student staff on shift.
    • Responds to incidents and keeps the pool deck to safety standards.
Concurrent responsibilityStudent Lead + OSPIT · Jun–Aug 2026
Fig. A-003.1 — Builder + operator tracks Engineering → A-004 · Projects → A-005
Drawing A-004  Engineering
Sheet 4 of 6  ·  Rev 3.0  ·  Active

Engineering

Four things I do consistently, and the drawings where each one is on the record. This sheet is the claim; the next one is the evidence.

04.1 I work inside constraints I do not control

Each of these started with something fixed that I could not negotiate with. A kiosk with no network connection at runtime. A cloud point-of-sale that could not be modified. Several hundred devices whose codes were printed on cabinet labels and buried in saved procedures, so renaming them was rejected outright.

Ruling out a tile server forced the whole map, routing included, to ship as one self-contained file. Being unable to touch the point-of-sale is what turned a driver problem into a protocol one.

04.2 I put the rule where it cannot be skipped

Asking a language model to be careful about accuracy did not hold, so it now only ever sees what a tool returned and cannot cite a number nobody gave it. Access rules live in the database rather than in the application that calls it. A work order from an unrecognised source stops rather than dispatching, and nothing is ever dispatched unattended.

Row-level security was harder to get right than the features it protects: a policy that queried the table it guarded recursed forever, and the fix was moving the lookup into a definer-rights function.

04.3 If I will not be there to watch it, it has to prove itself

80 Python tests and 21 routing checks guard a converter running unattended at 6 sites. A separate 73 cover the sports assistant, every external call fixtured so the suite runs with no network at all. A throw-injection test raises deliberately at 12 points inside one function, because that is how a graph corruption was found: the snap step wrote a node into the shared graph before registering it for cleanup, and left it welded in at 10 of those 12 points.

04.4 What the thing actually is comes before what it looks like

I swim competitively, so I already knew which numbers mattered — and deciding what a race is actually made of took far longer than building the charts. Equipment identity split the same way: position and role are known at procurement, before a device physically exists, while its address and credentials only exist once it is commissioned, so no single system could own the whole record.

Built with
Languages
Python · JavaScript · Java · Kotlin · SQL · HTML · CSS
Frameworks
Flask · Android · Bootstrap · Chart.js · ezdxf · Shapely · MapLibre GL
Systems
REST · MQTT · ESC/POS · ePOS-Print · TLS · GeoJSON
Data
PostgreSQL · SQLite · Supabase

I work with coding agents daily, and design around what they get wrong — see 04.2, on putting the rule where it cannot be skipped.

Every drawing on the next sheet carries at least one of these.

A-005 Projects →
Drawing A-005  Projects
Sheet 5 of 6  ·  Rev 3.0  ·  Active

Projects

Six entries. Select any to open its detail drawing. Client work is drawn rather than screenshotted.

Start here · most complete public project
05.1

cad-to-map

Open Source Tool
Personal
Public

Turns a CAD site plan into a self-contained interactive map with search, category filters and walking directions, working with no tile server and no network connection. Built to drive touchscreen wayfinding kiosks at highway rest stops, then generalised and published so it runs against anyone’s drawings.

3D map viewer built by cad-to-map from a DXF site plan, showing the tool’s own demo site rather than client work. Extruded building volumes sit above marked parking bays threaded with directional arrows and pedestrian crossings. Category pins mark parking, toilets, food, fuel, prayer facilities, accessible routes, first aid, bicycles and electric-vehicle charging. A red “You Are Here” marker sits beside the buildings, and a red dotted line traces the walking route from it to a destination across the site.
Fig. 05.1 — Demo site viewer, capturedcad-to-map demo — not client work
Problem

CAD site plans are the authoritative geometry for kiosk wayfinding, but real exports from a drafting office are broken in specific, repeatable ways: outlines that don’t close, labels sitting on the wrong layer or trapped inside hidden blocks, blocks nested inside other blocks, and facilities that are labeled on the plan but never actually drawn. A converter that assumes clean CAD fails differently on every one of these.

Constraints

The kiosk has no network connection at runtime, so the whole map, routing included, had to ship as one self-contained file with no server and no tile fetches. That ruled out any framework or bundler beyond a build script that inlines everything ahead of time.

Approach

The pipeline walks the CAD file honouring the layer panel’s actual visibility, closes and repairs broken outlines, resolves nested blocks, then binds labels to structures in two passes, first by containment, then by a distance-and-size score. Where a facility is labeled but never drawn, a sibling structure of the same type is cloned to its label position and logged loudly as synthesised, never silently.

Architecture

Routing runs Dijkstra over an undirected graph built by welding nearby path vertices onto a snap grid, with edges split for points that start or end off the network. The graph and the map geometry are inlined into a single HTML file at build time, so the kiosk needs nothing at runtime beyond a browser.

Technical challenge

The snap step wrote a new node into the shared graph before registering it for cleanup, so an exception partway through could weld a bad node in permanently with nothing to signal it. A throw-injection test that deliberately raises at twelve points in that function caught it: before the fix it left the graph corrupted at ten of them, and the same test now guards against a regression.

Result

Six kiosk sites were built from it, one with a complete handover package. The public repository carries 80 Python tests and 21 routing checks, and it also ships as an installable agent skill, so the same converter runs inside a coding agent as well as from the command line.

Key takeaway

Almost none of the difficulty was in the conversion logic itself. Nearly all of it was in absorbing what real architectural drawings actually do in practice, which no file format specification tells you.

05.2

Highway Digitalization Ecosystem

Enterprise Systems Architecture & Operations
OSPIT
Professional

Researched and developed a highway digitalization ecosystem integrating roadside equipment, network monitoring, traffic operations and enterprise maintenance. Defined the operating workflows and system architecture, implemented the integration foundation, validated fault and maintenance processes, and developed a unified Asset Console.

THREE LAYERS · ONE OPERATIONAL PLANE Layer 1 · Field & monitoring Roadside equipment · IoT telemetry · network monitor Measurements, reachability, device health Layer 2 · Traffic operations Control system reads device events in road context Verified incidents, operational actions Layer 3 · Enterprise operations Maintenance register · reports, work orders, parts, costs Human approval before dispatch Asset Hub & console Cross-system plane Shared equipment identity Record reconciliation Fault correlation System-health visibility Data-quality reporting One operational view DELIVERED IN SEQUENCE Research Process flows Architecture Identity Correlation Maintenance Asset Console IN PRODUCTION STAGING READS LIVE IDENTITY AND CORRELATION IN PRODUCTION · CONSOLE NOT YET DEPLOYED
Fig. 05.2 — Ecosystem layers and delivery sequenceClient work — systems shown by role
Problem

Roadside equipment was distributed across multiple platforms that identified, monitored and operated the same physical devices differently — an enterprise maintenance register, a traffic control system, an IoT telemetry platform and a network monitor. Equipment records, network alarms, traffic events and maintenance activity could not be correlated reliably, producing duplicate identities, unactionable alarm volumes and fragmented operational workflows.

Research & discovery

Analyzed live systems, source code, APIs, operational records and existing architecture documents to distinguish implemented capabilities from proposed designs. Identified gaps in equipment identity, network topology, maintenance data, credential management and system ownership.

Workflow design

Developed end-to-end process flows covering device registration, commissioning, monitoring, fault detection, human verification, work-order creation, repair and closure. Defined system responsibilities and designed the maintenance workflow to require human approval before dispatch.

Architecture

Designed a layered architecture connecting roadside telemetry, network monitoring, traffic operations and enterprise maintenance. Developed an Asset Hub that correlates system-specific identifiers and synchronizes equipment records into one operational view of each physical device. Implemented field-ownership and device-lifecycle rules, idempotent synchronization, dry-run defaults and validation that rejects an incomplete read rather than treating it as complete.

Technical challenge

Diagnosed identity and data-quality defects across live systems, including duplicate identifiers, incomplete API responses and conflicting device states. Identified that reconciliation never read activation status, so devices switched off in the control system still counted as live in the register. Added the missing comparison and implemented explicit failure states for partial or conflicting data.

Result

Deployed identity and fault correlation to production. 386 of 391 roadside devices carry one identity across the register, the control system and the network monitor, with no conflicts, gaps or duplicate codes, and 248 monitoring outages reduce to 24 actionable findings. The report-to-repair workflow is validated in staging and the Asset Console reads live systems; neither is deployed. Counts verified August 2026.

Key takeaway

Established explicit ownership across operational, monitoring and enterprise systems. Integration alone could not resolve conflicting identities, incomplete records or authority boundaries.

Client work — not published
05.3

ePOS Simulator

Point-of-Sale Integration
OSPIT
Professional

A cloud point-of-sale could only print to one manufacturer’s network printer. Rather than write a driver or tunnel a VPN, this service impersonates that printer: it presents the interface the point-of-sale already speaks, then forwards each job to whatever thermal printers the restaurant actually owns.

ONE INTERFACE · MANY REAL PRINTERS Point-of-Sale renders a bitmap posts it, unauthenticated BELIEVED: ONE NETWORK PRINTER Shim answers as that printer routed by URL path Queue Queue Front desk Kitchen one queue per printer — a stuck printer blocks only itself SAME BITMAP END TO END NOTHING RE-RENDERS THE RECEIPT · SCREEN AND PAPER CANNOT DRIFT
Fig. 05.3 — Print pathClient work — drawn, no capture available
Problem

A cloud point-of-sale system could talk to exactly one printer protocol, a single manufacturer’s dialect, and a printer that didn’t speak it failed badly rather than cleanly: it printed raw markup as receipt text instead of an actual receipt. The printers already mounted on site were not going to be replaced to fix that.

Constraints

The manufacturer’s own compatible printer box wasn’t available to this deployment, and upgrading wasn’t on the table. A custom server-side module was ruled out because the hosting platform’s own installer refuses that kind of code with no file access to the server, and a VPN tunnel was rejected too, since it meant managing encryption keys and an always-on connection for something this narrow.

Approach

The point-of-sale software already renders every receipt to a bitmap in the browser and posts it, unauthenticated, to whatever address is configured for its one supported printer. The service impersonates that printer: it takes the address, decodes the bitmap it receives, and forwards it to whichever real thermal printers the site actually has, routed by a path in the destination URL since the platform hardcodes one printer identity for every destination.

Architecture

Because the point-of-sale never re-draws the receipt for this path, whatever comes out of a printer is the same bitmap the screen showed, so drift between what a cashier sees and what prints is designed out of the path rather than merely tested against. Each destination printer gets its own delivery queue, so one stuck printer can never block deliveries to a healthy one.

Result

It ran production print traffic on the store’s own machine, confirmed on paper by a manager who added a printer and watched a job route live. One issue remains open rather than fixed: a connection-handling edge case that is mitigated for now rather than properly resolved.

Key takeaway

Comparing printer models directly got me nowhere. Once I stopped treating the hardware as the problem and targeted the shared protocol instead, picking a printer became a purchasing decision, not an engineering one.

Client work — not published
05.4

ScoutMini

AI Analysis CLI
Personal
Public

An assistant for someone new to a sport, who wants to know who a player is or why a result mattered and has no way to tell a real answer from an invented one. It answers only from real data and prints its sources. Built against Formula 1 timing data.

ONE QUESTION IN ENGLISH · ONE COMMAND $ python -m scoutmini pace Leclerc Monaco --season 2024 Charles Leclerc — Monaco Grand Prix 2024 (R) LEC — fastest 1:15.162, median race pace 1:18.500 over 76 accurate laps. Tyre strategy: MEDIUM (L1-1, 1 laps), HARD (L2-78, 77 laps) Source: FastF1 (official F1 timing data) EVERY REPORT PRINTS ITS SOURCES $ F1 IS THE FIRST SPORT · THE ENGINE IS NOT F1-SPECIFIC
Fig. 05.4 — Real CLI output, verbatimFastF1 timing data
Inspiration

Getting into a sport means asking questions with obvious answers to everyone but you: who drives for which team, who is number 11, why that lap mattered. Ask a chatbot and you get a fluent answer that may be entirely invented, which is worse than no answer when you have no way to check it. The idea was an assistant a newcomer could actually check.

Approach

Fetch the numbers first, then let the model write only from what a tool returned. An agent mode lets it choose which data tools to call across several steps. It is built against Formula 1 timing data, and the shape is deliberately sport-agnostic: the model never touches the data source directly, so another sport is another set of tools rather than a rewrite.

Result

73 tests, all offline, with every external call fixtured, so the suite runs anywhere without a network or an API key.

Key takeaway

Prompting the model to be careful did not hold. Only the structure did — it cannot cite a number it was never handed.

Technology

Python · OpenAI function calling · Typer · Jolpica-F1 · FastF1 · pytest

05.5

Quorum

Meeting Software
Personal
Public

Meeting software where preparation, minutes and archive are one flow. Teams submit before the meeting, an admin reviews and records it, minutes are generated against a template, and everything is exported and kept searchable afterwards.

Quorum’s admin console, running, with links to meeting history and a member view. A “Record the meeting” panel selects a microphone and starts a recording, noting that an in-person meeting is captured from the mic while an online call is imported instead. Below it the “Meeting content” panel holds a pre-meeting submission, marked “Saved” and flagged as editable only by this admin: a Markdown pane on the left and its rendered preview on the right, both showing the same agenda headings. A submission status row at the foot is switched to “Submitted”.
Fig. 05.5 — Pre-meeting submission, capturedLive application
Problem

A company running recurring team meetings has its preparation scattered before and its notes scattered after. Each team keeps its own notes somewhere, the minutes are written from memory by whoever remembers to, and a month later nobody can find what was agreed.

Approach

One flow across three cooperating pieces: a web app where teams submit ahead and an admin reviews, records and presents; a local engine that turns the recording and the submitted notes into minutes against a chosen template; and an optional desktop recorder. Meeting status is derived from what has actually happened, never set by hand: collecting, recorded, draft, published.

Architecture

The AI generation is opt-in and runs locally. The web app health-checks a bridge on the local machine; if it is not running, generation is disabled with a message that says so, and the entire structured flow still works. The model is an enhancement to the product, not a dependency of it.

Technical challenge

Two row-level security failures, both fixed with definer-rights functions. The admin check queries the profiles table, and the policy guarding profiles calls the admin check, so without definer rights it recursed forever. Separately the signup trigger needed its search path pinned, or creating an account failed outright with a database error that said nothing useful about why.

Result

Eight pages and no framework, with the pure helpers split out and unit tested.

Key takeaway

Getting row-level security right was harder than building the features it protects. A policy that queried the same table it guarded recursed forever, and the fix was to move the lookup into a definer-rights function.

Technology

JavaScript · Supabase · PostgreSQL · row-level security · Python

05.6

SplitWise Swimming Analytics

Full Stack Web Application
Personal
Public

Swim analysis without a subscription or a sensor rig. It works from the numbers any swimmer can record at the pool, and turns them into the few that show whether a race went well.

SplitWise Swim analysing one real 50m freestyle swim. A breakdown table gives each of the four split distances — 15m, 25m, 35m and 50m — its cumulative time, split time, velocity, cumulative stroke count and stroke rate, finishing at 24.10 seconds and 40 strokes. Below it a velocity chart plots those four splits against a dashed average of 2.134 meters per second: 2.83 off the dive, down to 1.79, recovering to 2.17, then 1.74 into the finish.
Fig. 05.6 — Split analysis, capturedLive application
Inspiration

Swim analysis tools want a subscription and a level of detail most swimmers cannot easily produce: sensors, stroke telemetry, somebody entering all of it. I swim, so I knew which numbers actually matter and which ones anyone can get with a stopwatch and a lane. The question was how much useful insight you can reach from only the easily measurable ones.

Approach

The only numbers it needs are the times at 15m, 25m, 35m and 50m. Every 50m pool already marks those — the 15m line at each end and the midpoint — so anyone on the side can capture them with a stopwatch. No sensors, no telemetry, nobody entering data a swimmer cannot produce. From those four times it derives each split and the velocity between marks, and compares a swim against a target pace and against previous swims. Stroke rate needs a stroke count entered alongside them.

Result

Deployed and running, with a recorded demo. I use it on my own swims.

Key takeaway

I swim the sport, so I already knew which numbers mattered, and that turned out to be most of the design work. Deciding what a race is actually made of took far longer than building the charts.

Technology

Flask · SQLite · Bootstrap · Chart.js · Python

Drawing A-006  Contact
Sheet 6 of 6  ·  Rev 3.0  ·  Active

Contact

Document title
Blueprint ofAshley Sum
Computer Science · San Francisco State University
Issued for
Summer 2027 software engineering internship
Drawn by
Ashley Sum
Computer Science student · software engineering intern candidate ashleysumtzele04@gmail.com
Document no.
AS-001
Revision
3.0
Sheets
6
Scale
1:1
Status
Active
Issued
2026-08-13
Location
San Francisco, CA
Relocatable
Email me