Data Engineering · Analytics 🏗 Architect + 🔬 Analyst + 📋 Product Owner ◆ Independent Project ⛳ Personal Use · Blog & Analysis
PinSeeker —
Golf Analytics
Operating System
A fully personal golf analytics system built to answer my own questions better — a MySQL medallion warehouse fed by the DataGolf API, a custom player identity engine with 5 branded archetypes, a multi-layer prediction stack, a DFS intelligence layer, and an 8-page Streamlit app designed as my weekly operating surface for tournament analysis and blog content. Not a product. A point of view, backed by a real system.
⛳ Personal Use · Non-Commercial
PinSeeker is built for my own weekly golf analysis workflow — not for distribution, sale, or external users. It powers my tournament previews, DFS decision process, Pick6 selections, and blog content. Every architectural decision was made to serve one user: me. That constraint is what makes it a genuine data engineering and product thinking exercise — not a demo, but a working system I actually depend on every tournament week during the PGA Tour season.
MySQLPythonStreamlitDataGolf APIMedallion ArchitecturePrediction ModelingDFS OptimizationPlayer Identity EngineMac cron automation
The Problem

Golf analytics that
reflects how I think.

The publicly available golf analytics tools are either too surface-level for serious weekly analysis or too generic to reflect any individual point of view. I wanted something that thought about golf the way I do.

Existing feeds like DataGolf provide strong statistical baselines — but they don't have my opinion layered on top. They don't know that I weight course fit differently for a major. They don't have my archetype taxonomy. They don't generate my Pick6 line estimates or build lineups using my leverage philosophy.

More practically: I was spending tournament weeks jumping between five different tools with no single surface connecting my player profiles to my predictions, my DFS stack, and my content workflow.

PinSeeker is the system I built so I never have to do that again. One warehouse. One app. My own analytical layer on top of the best available data.

Gap 01 · No Identity Layer
No existing tool let me define and apply my own player archetypes as first-class model inputs driving predictions, DFS scoring, and content from the same taxonomy.
Gap 02 · Disconnected Workflows
Tournament previews, Pick6 decisions, DFS lineup building, and post-event review all lived in separate places with no shared context or data lineage.
Gap 03 · Generic Predictions
Available tools surface raw probabilities but have no mechanism for a personal opinion layer — no archetype adjustments, no versioned rule sets, no traceability.
Gap 04 · No Evaluation Loop
Nothing tracked how good my predictions actually were — no weekly scorecard, no season-level model comparison, no disciplined way to know what to tune.
My Role

Every layer. One person.

🏗
What I Designed & Built
  • Designed the full MySQL medallion warehouse — Bronze (raw API), Silver (clean/structured), Gold (analytics-ready), plus ops and models schemas. 14+ active DDL files in the 2026 rebuild.
  • Built all Python ETL pipelines from the DataGolf API — automated via Mac cron for live tournament refreshes and pre-tournament pulls
  • Created the PinSeeker Player Identity System — 5 branded archetypes, 12 trait tags, 6 analyst flags — versioned, scored, append-only history
  • Built the full prediction stack — tournament outcomes (win/top10/cut), round-level scoring, stat predictions (birdies, pars, bogeys, eagles) with PinSeeker rule layers on top of DataGolf baselines
  • Designed the DFS intelligence layer — 60/40 source/PinSeeker projection blend, archetype-aware rule engine, lineup optimizers for all DraftKings slates
  • Built the Pick6 decision engine — PinSeeker-generated lines and over/under probabilities without depending on bookmaker lines
  • Built the 8-page Streamlit app — weekly operating system: Home, Control Center, Profiles, Tournament Hub, Round Lab, DFS Lab, Lineups, Review
  • Designed the evaluation framework — Brier score, MAE, calibration tracking, model version comparison across all prediction families
📋
Product Philosophy
  • Built for one user — every UX decision, every data model choice, every archetype definition reflects my own analytical framework, not a market of users
  • Versioned and auditable throughout — every prediction family ties to a model run ID, every rule adjustment is traceable, every profile snapshot is append-only history
  • Backend-first, app second — the warehouse was kept mature before the app was redesigned; the app is a surface over the data, not a logic engine
  • Iterative by design — new archetype rules, Masters special event modes, and prediction tuning are treated as versioned business logic changes, not ad hoc overrides
  • Personally operated weekly — I refresh it, run it, review it, and tune it every tournament week during the PGA Tour season
  • Content-ready — a dedicated Content Studio page surfaces talking points, blog prep notes, and insight cards directly from the live warehouse
The Approach

A weekly operating
sequence, not a script

Five layers — each cleanly separated so predictions, identity, and decisions all come from the same source of truth.

01
Pipeline
Automated DataGolf API pulls load Bronze on cron. Silver standardizes. Gold builds analytics-ready facts and views.
02
Profiles
Every active player gets a PinSeeker archetype and trait tags, scored against versioned component formulas — updated weekly.
03
Predict
Tournament outcomes, round scores, and stat lines modeled — DataGolf baseline blended with PinSeeker archetype-based rule adjustments.
04
Decide
DFS lineups built using blended projection stack. Pick6 lines generated from round-stat model. App surfaces everything in one flow.
05
Review
Post-event evaluation runs automatically — Brier scores, MAE, model version comparison, scorecards for every prediction family.
The Stack

Tools & system design

Five core technologies and a full system diagram showing how data flows from the API through the warehouse to the app decision surfaces.

MySQL
MySQL
Medallion warehouse — Bronze, Silver, Gold, ops, models
Python
Python
ETL pipelines, prediction models, DFS optimizer, profile scoring
Streamlit
Streamlit
8-page weekly operating app — local, personal-use deployment
DataGolf API
Source of truth — predictions, live scoring, decomposition, DFS projections
Mac Cron
Automated pipeline scheduling — live refreshes during tournament rounds
PinSeeker System Architecture
DataGolf API → Medallion Warehouse → Prediction Stack → App Decision Surfaces
2026 Rebuild
SOURCE BRONZE SILVER GOLD MODELS + OPS APP (STREAMLIT) DataGolf API Live + Historical DraftKings DFS Salaries Mac Cron Scheduler api_response_log APPEND-ONLY HISTORY bronze_pre_tournament _predictions bronze_live_stats current_* views bronze_decompositions player decomp fields bronze_fantasy_proj_dk fct_round_stats SG + round history fct_tournament_results season-safe keys fct_player_history recency + form silver_dfs_tables slate-aware current_pinseeker _player_card PLAYER IDENTITY 5 archetypes + 12 tags profile_snapshot versioned + append-only fct_dfs_pool 60/40 blend + archetypes fct_tournament_results PREDICTION STACK tournament + round + stats raw > DG blend > PinSeeker final pred_tournament_outcomes win / top10 / top25 / make_cut pred_pick6 birdies + pars + score + lines pred_dfs_scores source / PinSeeker / blended fct_dfs_lineups main + showdown + captain EVAL + OPS pipeline_runs + model_run_log prediction_eval_summary Brier + MAE + calibration STREAMLIT APP - 8 PAGES Home Status + KPIs + shortcuts Control Center Pipeline + logs Profiles Archetypes + tags Tournament Hub Win/top10 predictions Round Lab Pick6 + birdies + lines DFS Lab Projection + pool Lineups Saved + exposure Review Scorecards + eval Content Studio (Phase 2) Talking points + blog prep + insight cards Special Event Mode - Masters 7-signal bonus layer + tiered pool + DFS overlay Data flow arrows - - Supporting inputs Identity layer (personal taxonomy) Personal use - non-commercial
Player Identity System

Five archetypes.
My own taxonomy.

Every active PGA Tour player gets a primary archetype weekly — scored against versioned component formulas, stored as append-only history. These flow into predictions, DFS scoring, content framing, and lineup logic. They're the thing that makes PinSeeker distinctly mine.

👑
The Headliner
High-class, well-rounded. True top-end finish equity. Win probability boost + strong placement support.
🎯
The Stripe Show
Ball-striking-led. OTT and approach-driven ceiling. Scoring and upside boost. Moderate leverage premium.
🔧
The Scrambler
Short-game survival. ARG, putting, damage control. Cut-making and top-25 support. Lighter win ceiling.
The Firecracker
High-variance scorer. Birdie spikes, boom/bust. Strong win and GPP boost with deliberate downside tolerance.
🎱
The Metronome
Stable, accurate, low-volatility. Avoids big mistakes. Consistency and cut-making reward, reduced win ceiling.
Also tagged with 12 trait descriptors + 6 weekly analyst flags:
Birdie SurgeBogey ResistantGPP CeilingDFS CorePick6 FriendlyCourse HorseShowdown FriendlyForm-Driven ValueFast StarterStrong CloserCut RiskDifficult-Course Fit
Weekly flags: Analyst Boost · Analyst Fade · Ownership Trap · Weather Upgrade/Downgrade · Major Week Upgrade
The Output

Eight pages. One weekly flow.

The Streamlit app is the operating surface I actually use every tournament week — not a demo. It runs locally, reads from the live warehouse, and moves me through the full decision sequence in one place.

Control Center
Control Center
Pipeline Mgmt
Refresh controls · run logs · freshness
Player Profiles
Profiles
Player Identity
Archetypes · tags · component scores
DFS Optimizer
DFS Lab
DFS Optimizer
Target · fade · leverage · projections
Lineup Builder
Lineups
Lineup Builder
Optimizer controls · slate · exposure
Generated Lineups
Lineups
Lineup Review
Saved lineups · usage · exposure
Pick6 Round Lab
Round Lab
Pick6 Engine
PS lines · birdies/pars · over/under
Content Studio
Content Studio
Content Engine
Talking points · blog prep · insights
Review - Pending
Review
Evaluation
Brier · MAE · model scorecards
Scale

The stat sheet

14+
Active DDL Files
Full 2026 warehouse rebuild across Bronze, Silver, Gold, ops, and models schemas.
5 fam
Prediction Families
Tournament, round scoring, birdies/pars/bogeys/eagles — each with raw, DG-blended, and PinSeeker-adjusted outputs.
8 pg
App Pages
Home, Control Center, Profiles, Tournament Hub, Round Lab, DFS Lab, Lineups, Review.
7 sig
Masters Special Mode
7 Augusta-specific bonus signals, tiered pool support, DFS overlay — without touching the standard weekly process.
Builder's Lens

Key decisions & tradeoffs

The architectural choices that shaped PinSeeker — and what building for yourself, rather than for a market, changes about each one.

DecisionRationaleTradeoff
Personal use onlyBuilding for one real user — myself — forced every design decision to be genuinely useful rather than impressive. There's no “will users understand this?” question. If it works for my workflow, it ships.Maximum relevance — every feature exists because I actually needed it. The evaluation framework exists because I genuinely want to know if I was right, not because it demos well.
Backend-first, app secondThe warehouse was kept mature before the app was redesigned. Full medallion architecture, versioned logic, auditable predictions — all in place before the Streamlit surface was rebuilt.Slower to usable UI — months of warehouse work before the app felt right. The right tradeoff: an app over messy data would have been worse than no app.
Versioned rule layersEvery prediction adjustment is versioned, stored, and auditable. I can trace exactly what changed for any prediction in any week. A black-box system is unimprovable.More engineering overhead — faster to hardcode. But versioned rules are the only way to know if the system is actually getting better.
60/40 DFS blendRather than fully trusting external DFS projections or overriding them entirely, the stack blends 60% source with 40% PinSeeker-generated projection. My opinion matters without discarding a strong baseline.Testable — the evaluation framework compares source-only, PinSeeker-only, and blended MAE. I'll know if the ratio should shift after a full season.
Pick6 without book linesDraftKings Pick6 lines aren't reliably available in advance. PinSeeker generates its own best line and uses those as the reference for over/under probabilities — useful whether or not an actual line ever shows up.No edge confirmation — I can't say “PinSeeker is 15% above the market” without a market line. But knowing what PinSeeker would set reveals where my model is extreme — the actual decision surface.
Masters special modeThe Masters requires fundamentally different prediction logic. Rather than patching the standard weekly process, a dedicated overlay layer sits on top without touching base outputs — preserving everything and adding Augusta-specific signals cleanly.Reusable for all majors — the event mode architecture (standard / masters_major_mode / pga_major_mode) extends cleanly to every major. Building it right once is cheaper than rebuilding four times a year.
Gallery

Screenshot gallery

The app in operation — every page from the weekly workflow. Click any screenshot to expand.

Control Center
Control Center
Pipeline refresh controls · run logs · data freshness
Player Profiles
Player Profiles
Archetypes · tags · component scores · analyst flags
DFS Optimizer
DFS Optimizer
Source / PinSeeker / blended · target, fade, leverage
Lineup Builder
Lineup Builder
Optimizer controls · slate selection · exposure settings
Generated Lineups
Generated Lineups
Saved lineup review · player usage · exposure summary
Pick6 Round Lab
Pick6 / Round Lab
PinSeeker-generated lines · birdies/pars/score · over/under edges
Content Studio
Content Studio
Weekly talking points · blog prep · insight cards
PinSeeker Brand
PinSeeker Analytics
Personal golf analytics operating system
×