Portrait of Shawn Evans

Shawn Evans

Software Engineer

I build practical software systems: tools that keep their data straight, take repetitive work off people, and are tested the way people actually use them.

Recent work ranges from a full-featured Discord application for tabletop communities to a multi-step loan application tested for accessibility and across browsers.

Role
Software Engineer
Builds
Discord applications, multi-step web applications, automation and data tooling
Emphasis
Systems thinking, reliability, automation, testing, accessibility
Open to
Software engineering, automation, product tooling, and technical problem-solving roles

01

Selected work

Case 01

DatteBotYo

Discord application for Naruto 5e communities

Stack
  • Python
  • discord.py
  • MySQL
  • Google Sheets API

A full-featured Discord application that runs Naruto 5e play inside the server where it happens: character data, dice and combat, initiative, missions, resources, and rules reference in one bot.

Context

A campaign run over Discord keeps its state in several places at once: character spreadsheets, chat history, and whoever is tracking the fight. Rolls, turn order, and rules questions all depend on finding the right number somewhere else.

Inputs

Discord commandsFrom players and GMs
Google SheetsCharacter sheets to import

DatteBotYo · Python, discord.py

  • Sheet import
  • Dice engine
  • Attacks, saves, checks
  • Initiative tracking
  • Missions
  • Resource tracking
  • Jutsu & feat lookup

Results posted back to the channel

Persistence

MySQLCharacters, stats, resources
Jutsu & feat databaseRules reference data
Fig. 1. Functional overview of DatteBotYo, simplified from its feature set.

Engineering decisions

Import instead of re-entry
Characters are imported from Google Sheets (stats, saves, skills, attack bonuses, chakra, and HP) and stored in MySQL, so players can switch characters and carry data across sessions.
Guard shared state
Resource commands for Ryo and downtime validate every change, so a balance can never drop below zero.
A dice engine, not a random number
Supports exploding dice, conditional rerolls, minimum values, arithmetic expressions such as (2d6+1d4)*2, advantage and disadvantage, and repeated rolls with summaries.
Tolerate imperfect input
Slightly mistyped stat or skill names resolve to the closest match. Jutsu and feat searches accept partial names and ask the user to choose when a result is ambiguous.
Keep the session in one place
Attack rolls use bonuses from the imported sheet, and initiative tracking and mission tools keep the flow of play inside Discord.

Case 02

LendSwift loan application

Multi-step web application

Stack
  • React
  • React Hook Form
  • Zod
  • Cypress
  • Playwright
Links
Not public

A multi-step React loan application built on schema-backed validation and document workflows, with complete applicant journeys tested for accessibility and across browsers.

ConfidentialDescribed at a high level only; code, screens, and implementation details are intentionally not shown.

Context

Multi-step applications fail in the gaps: between steps, between browsers, and for people who don’t use a mouse. Correctness has to be checked across the whole journey, not one field at a time.

Engineering decisions

Validation as a schema
Form rules are declared as schemas with Zod and enforced through React Hook Form.
Documents inside the journey
Document workflows are part of the applicant journey and are tested with it.
Test complete journeys
Cypress and Playwright exercise complete applicant journeys end to end, across browsers.
Accessibility as coverage
Accessibility is part of the test coverage, alongside functional behavior.

Also built

  • Daymark

    Local-first daily planning dashboard for priorities, habits, reflection, and weekly patterns.

    React · Local-first storage

  • Crumbling Whispers

    Foundry VTT v12 module for private player prompts, built around message privacy and version compatibility.

    JavaScript · Foundry VTT

  • Egoist combat tracker

    Standalone browser tool and formula-driven reference workbook for a dense tabletop combat system.

    HTML · CSS · JavaScript · Excel · Playwright

  • Palworld metadata pipeline

    Extracts and normalizes game metadata into readable passive-skill catalogs and optimizer-ready data.

    Python

02

How I work

Principles

  • Make state explicit

    Decide where data lives, how it gets in, and what is allowed to change it before building the interface on top.

    Seen in: DatteBotYo, LendSwift

  • Automate the repetitive path

    If people copy numbers between places or do the arithmetic by hand, that is work the software should be doing.

    Seen in: DatteBotYo

  • Design for imperfect input

    People mistype, abbreviate, and guess. Close matching and clear prompts beat a failed command.

    Seen in: DatteBotYo

  • Test complete journeys

    Multi-step software breaks between the steps. End-to-end tests should follow the path a real user takes, in more than one browser.

    Seen in: LendSwift

  • Treat accessibility as correctness

    Keyboard access, labels, and clear feedback are part of whether software works, so they belong in test coverage.

    Seen in: LendSwift, shawnevans.dev

Tools in this work

Languages
Python, JavaScript, SQL, HTML, CSS
Application
discord.py, React, React Hook Form, Zod
Data & integration
MySQL, Google Sheets API
Testing
Cypress, Playwright

03

Contact

Availability

Open to software engineering, automation, product-tooling, and technical problem-solving roles. Email is the best way to reach me.

work@shawnevans.dev