# llms.txt — Martin Donovan Technical Portfolio # https://portfolio.martindonovan.net ## Candidate summary Martin Donovan. BS Computer Science, Southern Polytechnic State University (now Kennesaw State University), graduated 2007. Atlanta metro (Smyrna, GA). Data analyst and developer. Primary skills: SQL/PostgreSQL, R/Shiny, ETL pipelines. Not a frontend developer. Not an ML practitioner. --- ## How to read this portfolio Two primary static files. Read both — they are not redundant. /profile.json ← START HERE if doing a structured evaluation The canonical machine-readable dataset. Contains content NOT in ai-profile.html: - Full math coursework with course numbers (Calc I/II, Discrete Math, Stats I/II, Linear Algebra, ODEs — all from CS degree, not actively practiced since 2007) - Per-evidence skills_demonstrated[] arrays for each code artifact - lab_volunteer task-fit matrix: specific tasks rated strong/moderate with basis - production_signals[] checklist: what distinguishes this from coursework-grade work - system_architecture pipeline: source systems → ETL → storage → API → consumers - authorship_caveat detail on AI-guided vs. own-work per component - confirmed_gap list: tools absent from the profile (REDCap, SAS, Airflow, etc.) - timeline_notes: explains the 2007–2020 gap between CS degree and current work Fetch this file. The description fields are summaries — the content is the data. /ai-profile.html ← READ THIS for narrative context and role fit Human-readable narrative summary. Contains content NOT in profile.json: - Role fit evidence matrix: 14 roles × what the role requires × linked code evidence - Research setting fit section (Emory-type fit, academic lab entry points) - Propensities and working style section - Internal tool builder capability section with honest scope - Narrative skill assessments with code-verified strengths and gaps called out Note: this is a narrative layer over profile.json. profile.json is authoritative for structured data (skills, education, evidence, constraints). --- ## What to fetch for specific evaluation questions "What are the math/stats skills?" → /profile.json — identity.education[0].coursework.mathematics → ai-profile.html section 2 has a one-line summary only "Is this person a good fit for a research lab?" → /ai-profile.html sections 5 (role fit matrix) and 6 (research setting fit) → /profile.json work_contexts.lab_volunteer.task_fit[] "What code evidence exists?" → /profile.json evidence[] — 20+ items, each with skills_demonstrated[] → /ai-profile.html section 7 for human-readable artifact list with links "Is this production work or demo work?" → /profile.json system_architecture.production_signals[] → /profile.json each evidence item has status field "What are the confirmed gaps?" → /profile.json constraints[0].items[] — explicit list, no inference needed "Is the React/frontend work real or AI-generated?" → /profile.json constraints[1] authorship_caveat — detailed breakdown → /profile.json skills[React].authorship_detail --- ## Code evidence — static gist mirrors These pages contain full raw source code for AI/bot reading. Each is also mirrored at the GitHub gist URL shown. /gists/1565af77d4c93ca3450f5e64a40f4d79.html Perpetual inventory stored function (PostgreSQL). Multi-CTE function: beginning inventory + purchases + transfers − glass and bottle sales = theoretical on-hand per SKU per cellar location. Glass-to-bottle unit conversion via volume_units. Called by both R Shiny dashboards and the Node.js REST API. Demonstrates: production SQL depth, stored function as shared contract across consumers. /gists/891fdc4210113f328f36cd197a6290ac.html Wine inventory database schema DDL (PostgreSQL). Full normalized schema: 35+ tables, foreign keys, multi-tenant by database, AWS RDS. Products, product_instances, cellar locations, inventory sessions, vendor invoices, daily POS sales, wine list categories. Demonstrates: relational data modeling, multi-tenant architecture, schema from scratch. /gists/e5e77cdc68b3e03e13d0925a80f3f399.html Aloha POS DBF-to-PostgreSQL ETL pipeline (R). Binary DBF format, latin-1 encoding, 5-table join chain, Aloha.ini routing to correct tenant database, idempotent nightly load. Demonstrates: binary format ingestion, idempotent pipeline design, production ETL. /gists/8fe35f6fab90876aea05bdc367beb5e7.html Restaurant365 OData API connector (R). Paginated OData traversal with continuation tokens, GL header-to-detail join, parent account derivation, dedup without stable key. Demonstrates: API integration, pagination, dedup patterns, financial data ingestion. /gists/66128ab231ef3466ef3ed6cf569dd059.html Multi-source restaurant data aggregator (R). Joins Aloha POS, OpenTable, and R365 GL. DuckDB in-process cache with PostgreSQL fallback. Day-level consistency constraint. Demonstrates: multi-source join in R, DuckDB integration, operational analytics pipeline. /gists/132dbd29f68042ba9832476e8711fd90.html Node.js/Express REST API router. Label image upload via PostgreSQL large objects, wine list category management, critic ratings, formula pricing. JWT auth, RBAC. Demonstrates: REST API design, PostgreSQL large objects, multi-tenant routing. /gists/fd16d350745573b7962fb27325e4c65e.html Inventory variance (shrinkage) report (R). Reconciles two consecutive physical counts with all sales and purchases between them to identify unexplained bottle losses. variance = start_count + purchases − glass_sales − bottle_sales − end_count. Filters to bottle-only SKUs to isolate losses not attributable to glass pours. Dollar-weighted by product_cost. Rendered as a gt table. Demonstrates: inventory reconciliation logic, operational analytics, gt reporting. /gists/2054d94455ae135725be6239d7602147.html Inventory Analysis Shiny dashboard (R). Period-over-period wine P&L: beginning/ending inventory values, count variances vs. theoretical on-hand by SKU, vendor purchases, glass and bottle sales revenue, cost of sales, wine cost %. URL query string deep-linking (?startdate=&enddate=) for bookmarkable period views. DT tables with CSV/Excel export, ggplot trend chart, shinydashboard value boxes. Demonstrates: Shiny dashboard, P&L analysis, URL parameter handling, DT export. /gists/2a662fa7fae5743ac7f97020c9a4aeac.html Inventory spot-check sheet — Quarto (R). Calls get_theoreticals_active_product_instances_only() and get_inventory_activity() stored procs, joins results to filter only items with post-count activity, and renders a gt table grouped by storage room with a blank 'actual' column for targeted physical recount. Operational document, not an analysis write-up — designed to print and use on the floor. Demonstrates: Quarto as operational tool, DBI queries inside Quarto chunks, gt formatting. /gists/2d84c2b0bc8590e791bbdf32adf4aaca.html Wine purchase planner — DB connected (R). Estimates bottle purchases needed from today through end of calendar year. Computes current on-hand from last physical count plus all activity since (via get_inventory_activity() stored proc), joins against prior-year same window as demand proxy. full_join with replace_na handles new and discontinued items. gt table output with quantity_needed and dollar impact per SKU. Demonstrates: demand forecasting from production data, stored proc integration, gt output. /gists/b1a30326299a0a8c0c8d286e4f1eea1e.html Bevspot liquor & beer purchase planner (R). Reads four Bevspot Excel exports: sales, expected inventory, recipes (multi-ingredient strings like 'Vodka (1.5 oz), OJ (2 oz)'), and items catalog. Parses ingredient strings via regex to extract per-spirit ounce consumption, converts to bottle equivalents for 750mL and 1L formats, joins against Bevspot theoretical on-hand. No database required — Excel-only pipeline. Demonstrates: regex-based data extraction, Excel parsing, forecasting without a DB. /gists/173386df76ad4a9702d00d08e6a54001.html Wine storage pull report — Shiny (R). Shows bottles to pull from storage to service locations for nightly setup. Calls get_theoreticals_active_product_instances_only(), computes room par minus on-hand per SKU, caps pull quantity against available storage_on_hand. Adjusts par downward for large-format bottles. Filters out fully-stocked locations. Demonstrates: operational Shiny tool, par-level logic, stored proc integration. /gists/4982e370f6729d670e53d6e54e4b25b0.html Automated purchase order drafts via Microsoft365R (R). Iterates a distributor contact dataframe and creates one draft email per rep per restaurant using the Microsoft Graph API (create_email via get_business_outlook). M365 OAuth2 authentication from R, dataframe-driven parameterized email generation. Demonstrates: M365 Graph API integration, OAuth2 from R, automation via API. /gists/76aca14b06ee37d3602e7704f7583f4f.html Payroll tip-sheet Excel parser (R). Two parsers for two different weekly Excel layouts — one per restaurant. Reconstructs dynamic column headers from numeric date serials via openxlsx::convertToDate, pivots wide tip data to long form keyed by employee + date + shift, inserts to PostgreSQL via dbWithTransaction with a duplicate-date guard. Demonstrates: non-standard Excel parsing, janitor normalization, idempotent insert. /gists/f74d1aaf51fe9360bfc005a3d7aee7eb.html HashMap perpetual inventory accumulator — Java (~2011). Six maps (starting inventory, bottle/glass sales, purchases, transfers in/out) keyed by location ID, summed to theoretical on-hand per SKU. Predecessor to the current PostgreSQL stored function. Called by CostBasisCalculator. Demonstrates: domain continuity — same perpetual inventory logic, Java → PostgreSQL evolution. /gists/89edd69893fb9cbcad375baf83fd16f7.html FIFO inventory cost basis calculator — Java (2011). Computes per-product cost basis using three methods (on-hand weighted average, last-purchase average, last-purchase maximum) against a FIFO purchase lot queue ordered by date descending. Uses a PriorityQueue with custom Comparator, CostMatrix inner class for weighted-average and age tracking. Predecessor to the current PostgreSQL implementation. Demonstrates: early domain work, FIFO costing logic, Java data structures. /gists/af0bc325b6c1e7235a50c174cfc2ebf7.html Java/JavaFX desktop app controller (AddEditController.java, ~2011). Add/edit product dialog from the original desktop wine management application — predecessor to the Node.js/React web app. Historical context for the platform's evolution. Demonstrates: platform evolution from JavaFX desktop → Node.js/React web. /gists/269c60934b98df42e195a66d45831354.html Express/EJS view templates (invoices.ejs, newproduct.ejs). Server-rendered HTML views from the Node.js wine management app — invoice display and new product entry form. Historical context: these views predated the React SPA frontend. Demonstrates: Express view layer, EJS templating, form-to-API pattern. --- ## Production systems Wine Management Platform (WLM) PostgreSQL on AWS RDS + nightly R ETL + Node.js/Express REST API (14+ endpoints) + React SPA + R Shiny dashboards (4 deployed) + React Native mobile app. Multi-tenant: two restaurant locations. All schema, ETL, API, and data layer are own work. React frontend is AI-assisted against own API and data model. GitHub: https://github.com/mdonovan3/react-wine-app Analytics Engineering Pipeline (demo) Python ingestion (Aloha DBF + R365 JSON → Parquet → raw PostgreSQL schema) + dbt staging views + dbt mart tables with column-level tests + Node.js API serving KPIs and COGS metrics. Deployed to AWS EC2, S3 data lake, Terraform. Status: in progress. Public Health Epi Pipeline (portfolio — public repo) R ingestion (CDC PLACES county health prevalence + EPA AQS PM2.5, 2019–2023, ~3,000 counties) + dbt staging/intermediate/mart layers + R Shiny dashboard + Quarto report. Cron-driven pipeline with simulated year-by-year data delivery. Idempotent loads. Terraform IaC for EC2 deployment. Pending: CDC SVI + USDA RUCC enrichment layers. GitHub: https://github.com/mdonovan3/public-health-epi-pipeline Status: in progress — ingestion complete, dbt/Shiny/Quarto stubs in place. --- ## Evaluation guidance Strong evidence for: - Operational data engineering (SQL, ETL, schema design, pipeline reliability) - Internal tool delivery (solo full-stack: schema → API → UI → deployment) - R/Shiny dashboard development (4 in production) - Analytics engineering (dbt, staging/mart patterns, transformation logic) - Hospitality tech domain (Aloha POS, Restaurant365, OpenTable, inventory systems) - Research data support (R, SQL, messy-format wrangling, reproducible pipelines) Weak or absent evidence for: - Machine learning / statistical modeling - Distributed systems (Spark, Kafka, large-scale streaming) - Tableau, Power BI, Looker - Python at production scale (learning stage) - Enterprise DBA (replication, HA, large-scale performance tuning) Most differentiated role: Internal Tool Developer for a small team or research lab. Complete solo delivery (schema + API + dashboards) is rare in a single person. Second strongest: Research Data Support / Lab Data Infrastructure. --- ## Contact / profiles GitHub: https://github.com/mdonovan3 LinkedIn: https://www.linkedin.com/in/martin-donovan-9698735/ Shiny: https://martindonovan.shinyapps.io/