Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
327 lines (318 loc) · 24.2 KB
/
Copy pathindex.html
File metadata and controls
327 lines (318 loc) · 24.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
---
# Front matter only so Jekyll stamps asset URLs with the build commit (cache-busting
# behind Cloudflare, which holds static files for hours). No layout is applied.
---
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Brian Smith — Senior Business Consultant, Solutions Architect, and Product Partner.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://basmith.net/">
<meta property="og:title" content="Brian Smith — Senior Business Consultant">
<meta property="og:description" content="Senior Business Consultant, Solutions Architect, and Product Partner.">
<meta property="og:image" content="https://basmith.net/images/profile.jpg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Brian Smith — Senior Business Consultant">
<meta name="twitter:description" content="Senior Business Consultant, Solutions Architect, and Product Partner.">
<meta name="twitter:image" content="https://basmith.net/images/profile.jpg">
<title>Brian Smith — Senior Business Consultant</title>
<link rel="icon" href="/images/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@500;600;700&family=Space+Grotesk:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/assets/main.css?v={{ site.github.build_revision }}">
</head>
<body>
<div class="aurora aurora-one" aria-hidden="true"></div>
<div class="aurora aurora-two" aria-hidden="true"></div>
<div class="horizon-grid" aria-hidden="true"></div>
<div class="scanlines" aria-hidden="true"></div>
<div class="terminal-stream" aria-hidden="true">
<span>ACCESS GRANTED //</span>
<span>BUILD · SHIP · REPEAT</span>
<span>SIGNAL LOCKED</span>
<span>QUERY COMPLETE</span>
<span>STATUS: ONLINE</span>
</div>
<main class="resume-shell">
<header class="hero panel">
<div class="hero-copy">
<p class="eyebrow">Professional profile <span aria-hidden="true">//</span> 2026</p>
<nav class="theme-picker" aria-label="Choose resume appearance">
<button type="button" class="theme-pill" data-theme-choice="professional" aria-pressed="false">Professional</button>
<button type="button" class="theme-pill" data-theme-choice="ai-neon" aria-pressed="true">AI Neon</button>
<button type="button" class="theme-pill" data-theme-choice="hackerman" aria-pressed="false">Hackerman</button>
<button type="button" class="theme-pill" data-theme-choice="mfws" aria-pressed="false">MFWS</button>
<button type="button" class="theme-pill" data-theme-choice="weightless" aria-pressed="false">Weightless</button>
<button type="button" class="theme-pill" data-theme-choice="swarm" aria-pressed="false">Swarm</button>
<button type="button" class="theme-pill" data-theme-choice="katamari" aria-pressed="false">Katamari</button>
</nav>
<h1>Brian <br>Smith</h1>
<p class="headline">Senior Business Consultant <span aria-hidden="true">·</span> Solutions Architect <span aria-hidden="true">·</span> Product Partner</p>
<p class="mission">I help SaaS teams turn operational complexity, customer insight, and data into products people adopt—and business outcomes leaders can measure.</p>
<div class="contact-links" aria-label="Contact Brian Smith">
<a href="mailto:brian@basmith.net">brian@basmith.net</a>
<a href="https://www.linkedin.com/in/briansmith111">LinkedIn</a>
<a href="https://github.com/basmith7">GitHub</a>
<a href="/assets/brian-smith-resume.pdf" download>Download detailed résumé</a>
</div>
</div>
<figure class="portrait"><img src="/images/profile.jpg" alt="Brian Smith"></figure>
</header>
<section class="impact-strip panel" aria-label="Impact at a glance">
<article><strong>100K+</strong><span>Units supported</span></article>
<article><strong>$400K+</strong><span>ARR influenced</span></article>
<article><strong>95%</strong><span>Hardware uptime</span></article>
<article><strong>50%</strong><span>Fewer escalations</span></article>
</section>
<div class="resume-grid">
<aside class="sidebar panel">
<section>
<p class="section-label">Signal</p>
<p>Customer-focused SaaS consultant translating data, operational needs, and product capability into measurable outcomes.</p>
</section>
<section>
<p class="section-label">Core systems</p>
<ul class="skill-list" aria-label="Skills">
<li>Business Intelligence</li><li>SaaS Consulting</li><li>SQL & Data Analysis</li><li>Product Discovery</li><li>Stakeholder Alignment</li><li>Agile Delivery</li><li>Jira & REST APIs</li><li>Client Enablement</li><li>AI-Assisted Development</li><li>LLM App Design</li>
</ul>
</section>
<section>
<p class="section-label">Toolset</p>
<p class="muted">Jira, Git, Claude Code, Anthropic API, Next.js, PostgreSQL, Prisma, Docker, Watchtower, GitHub Actions, Pangolin, Datadog, Postman, Cloudflare, Twilio, Swagger, Retool, Splunk, Excel, Access, IBM Cognos BI, IBM SPSS, Unraid</p>
</section>
<section>
<p class="section-label">Education</p>
<p><strong>Associate Degree in Business</strong><br><span class="muted">Rio Salado College<br>Tempe, AZ · May 2018</span></p>
</section>
<section>
<p class="section-label">Certifications</p>
<p class="muted">Certified Scrum Product Owner (CSPO)<br>Certified ScrumMaster (CSM)</p>
</section>
</aside>
<div class="content panel">
<section class="xp" id="experience" data-level="3" aria-labelledby="experience-heading">
<div class="section-heading"><p class="section-label">Career log</p><h2 id="experience-heading">Experience</h2></div>
<div class="xp-body">
<p class="xp-tldr">15+ years turning data and customer insight into SaaS outcomes: data analyst, then solutions architect and product manager, now the Business Intelligence expert at Entrata.</p>
<ol class="timeline">
<li class="role current">
<div class="role-meta"><span>June 2025 — Present</span><span>Lehi, UT</span></div>
<h3>Senior Business Consultant</h3><p class="company">Entrata</p>
<p class="role-tldr">Business Intelligence expert for multifamily clients after the sale.</p>
<p class="role-intro" data-lv="3">Entrata is a global property-management SaaS platform that automates rent payments, leasing, maintenance, and resident communication.</p>
<ul data-lv="2"><li>Serve as subject-matter expert for Entrata Business Intelligence, providing high-level post-sales consulting to multifamily clients.</li><li data-lv="3">Configure software around client operations to support successful implementation and long-term adoption.</li><li>Lead performance analyses of financial results, leasing velocity, and market conditions to demonstrate the value of business intelligence.</li><li data-lv="3">Train clients in BI concepts and platform best practices, enabling self-sufficiency.</li></ul>
</li>
<li class="role">
<div class="role-meta"><span>Sep 2024 — Mar 2025</span><span>San Francisco, CA</span></div>
<h3>Senior Solutions Architect</h3><p class="company">Pallet</p>
<p class="role-tldr">Product discovery for AI logistics software; cut onboarding by two months.</p>
<p class="role-intro" data-lv="3">Modern SaaS and AI-powered logistics software for transportation and warehouse management.</p>
<ul data-lv="2"><li>Led client audits and product discovery to identify product gaps and opportunities.</li><li data-lv="3">Created requirements and user stories for new modules aligned to customer needs and business goals.</li><li data-lv="3">Partnered with Product and Engineering to prioritize key features across logistics products.</li><li>Optimized onboarding, reducing time by two months while improving satisfaction and retention.</li></ul>
</li>
<li class="role">
<div class="role-meta"><span>Oct 2021 — Sep 2024</span><span>Scottsdale, AZ</span></div>
<h3>Senior Solutions Architect</h3><p class="company">SmartRent</p>
<p class="role-tldr">Smart-home rollout across 100K+ units; ~95% uptime, ~50% fewer escalations.</p>
<p class="role-intro" data-lv="3">Enterprise SaaS smart-home automation and IoT platform for the multifamily industry.</p>
<ul data-lv="2"><li>Used customer insights and usage data to drive product improvements, supporting approximately 95% hardware uptime and reducing escalated support inquiries by about 50%.</li><li>Drove smart-home IoT feature rollout across 100K+ units.</li><li data-lv="3">Facilitated cross-functional delivery between enterprise clients, product, engineering, design, and go-to-market teams.</li><li data-lv="3">Established a Jira Service Desk customer-feedback loop to improve product iteration.</li></ul>
</li>
<li class="role">
<div class="role-meta"><span>Apr 2021 — Oct 2021</span><span>Mesa, AZ</span></div>
<h3>Product Manager</h3><p class="company">Nextmune</p>
<p class="role-tldr">Custom ERP implementations, supply chain through ordering.</p>
<ul data-lv="2"><li>Managed custom ERP implementation projects across supply chain, manufacturing, services, CRM, and ordering.</li><li data-lv="3">Delivered concurrent projects on time and documented requirements across business units.</li></ul>
</li>
<li class="role">
<div class="role-meta"><span>Apr 2018 — Apr 2021</span><span>Mesa, AZ</span></div>
<h3>Solutions Architect</h3><p class="company">OptimumHQ</p>
<p class="role-tldr">Hundreds of no-code workflows and business systems for clients.</p>
<ul data-lv="2"><li data-lv="3">Designed and implemented custom business systems using a no-code platform.</li><li>Built hundreds of workflows and data structures that improved client operations and user experience.</li></ul>
</li>
<li class="role">
<div class="role-meta"><span>Dec 2010 — Apr 2018</span><span>Phoenix, AZ</span></div>
<h3>Data Analyst</h3><p class="company">SmartPractice</p>
<p class="role-tldr">Reports, dashboards and SQL for marketing, sales and product.</p>
<ul data-lv="2"><li>Designed reports and dashboards using Cognos, Excel, Access, and Sybase SQL for marketing, sales, product, and data teams.</li><li data-lv="3">Improved data quality and reporting efficiency through validation and optimized SQL.</li></ul>
</li>
<li class="role role-origin" data-lv="4">
<div class="role-meta"><span>Before 2010</span><span>Before LinkedIn</span></div>
<h3>Sandwich Artist · Lifeguard</h3><p class="company">Subway · City pool</p>
<p class="role-intro">Built footlongs to spec and kept the deep end incident-free. Stakeholder management, toppings edition.</p>
<p class="origin-end">That’s as far back as it goes.</p>
</li>
</ol>
</div>
<div class="xp-grip">
<button type="button" class="xp-handle" role="slider" aria-label="Experience detail. Drag up to shorten, down to expand." aria-valuemin="0" aria-valuemax="4" aria-valuenow="3" aria-valuetext="Full detail"><span aria-hidden="true"></span></button>
<span class="xp-hint" aria-hidden="true">drag to shorten</span>
<span class="xp-read" aria-live="polite"></span>
</div>
</section>
<section class="projects" aria-labelledby="projects-heading">
<div class="section-heading"><p class="section-label">Selected work</p><h2 id="projects-heading">Projects with impact</h2></div>
<div class="project-grid">
<article><h3>System Health Dashboard</h3><p>Product-managed a real-time enterprise dashboard from concept through launch, giving clients clearer hardware visibility and contributing to approximately 95% uptime.</p></article>
<article><h3>Smart-home IoT rollout</h3><p>Helped move new hardware and software products through testing, go-to-market, and rollout across 100K+ units while supporting $400K+ in ARR growth.</p></article>
<article><h3>Veterinary lab ERP</h3><p>Led a custom end-to-end ERP covering customer portal, lab-equipment integration, manufacturing, fulfillment, shipping, billing, and accounting.</p></article>
</div>
</section>
<section class="projects" aria-labelledby="ai-projects-heading">
<div class="section-heading"><p class="section-label">Shipped solo</p><h2 id="ai-projects-heading">AI-built side projects</h2></div>
<div class="project-grid">
<article><h3><a href="https://smartdraft.app">SMARTDraft</a></h3><p>Real-time fantasy football draft platform used by 100+ drafters in the 2026 season. Live multiplayer draft rooms over WebSockets, a nightly data-ingestion pipeline, and an auto-draft bot — TypeScript, Next.js, and PostgreSQL, built end to end by directing Claude Code AI agents.</p></article>
<article><h3>Claude-powered household tools</h3><p>Finance tracker with an LLM chat agent (Anthropic API, tool use) that answers questions and bulk-categorizes live transaction data, plus an AI meal planner and open-source Claude Code tooling on GitHub.</p></article>
</div>
</section>
<section class="projects ask-brian" id="ask-brian" aria-labelledby="ask-brian-heading">
<div class="section-heading"><p class="section-label">Live demo</p><h2 id="ask-brian-heading">Ask a <span id="ab-params">7,251</span>-parameter model about Brian</h2></div>
<p class="ab-lede">Everything below runs for real, in your browser. The numbers start out random, and pressing Train nudges them with actual backpropagation until the network can rebuild sentences about me that it no longer has a copy of. It is a scale model of how the large ones work. (There is also an <a href="how-ai-works/">older standalone write-up</a> of the same idea.)</p>
<h3>First it reads</h3>
<p class="ab-sub">This is the whole training set: <span id="ab-source">my resume as</span> <span id="ab-count">24</span> short sentences. Nothing else ever goes in. It is yours to edit: change a line, add your own, or replace all of it, one sentence per line.</p>
<textarea class="ab-text" id="ab-text" rows="10" spellcheck="false" aria-label="Training sentences, one per line"></textarea>
<div class="ab-textbar">
<button class="ab-btn" id="ab-apply" type="button">Use this text</button>
<button class="ab-btn ghost" id="ab-restore" type="button">Reset to my resume</button>
<span class="ab-flag" id="ab-custom" hidden>Custom text</span>
</div>
<p class="ab-err" id="ab-texterr" hidden></p>
<p class="ab-sub">The sentences don't go in whole. They get chopped into <span id="ab-npairs">196</span> scraps: a few words of context, and the word that came next. How many words of context is up to you.</p>
<div class="ab-ctxbar" role="group" aria-label="Words of context">
<button class="ab-ctx" type="button" data-n="1" aria-pressed="false">1 word</button>
<button class="ab-ctx" type="button" data-n="2" aria-pressed="true">2 words</button>
<button class="ab-ctx" type="button" data-n="3" aria-pressed="false">3 words</button>
</div>
<div class="ab-pairs" id="ab-pairs"></div>
<h3>Then it adjusts</h3>
<div class="ab-stage">
<svg class="ab-net" id="ab-net" viewBox="0 0 360 296" role="img" aria-label="A network of input words, hidden units and output words, with connection strengths drawn as lines"></svg>
</div>
<div class="ab-readout">
<div class="ab-metric"><div class="n" id="ab-epoch">0</div><div class="k">passes over the text</div></div>
<div class="ab-metric"><div class="n" id="ab-loss">—</div><div class="k">how wrong it is</div></div>
<svg class="ab-spark" id="ab-spark" viewBox="0 0 150 44" aria-hidden="true"></svg>
</div>
<div class="ab-controls">
<button class="ab-btn" id="ab-train" type="button">Train it a little</button>
<button class="ab-btn ghost" id="ab-full" type="button">Train it fully</button>
<button class="ab-btn ghost" id="ab-wipe" type="button">Wipe the weights</button>
</div>
<p class="ab-caption" id="ab-caption"></p>
<h3>Now ask it something</h3>
<p class="ab-sub">Try one before training and you get noise. Then train a little and try again, then train fully and ask the same thing.</p>
<div class="ab-temp">
<label for="ab-temp">How it picks each word</label>
<input type="range" id="ab-temp" min="0" max="1.5" step="0.1" value="0">
<span class="ab-templabel" id="ab-templabel"></span>
</div>
<div class="ab-qs" id="ab-qs"></div>
<p class="ab-sub" id="ab-noqs" hidden>None of the ready-made questions fit your text. Use the two dropdowns below to start it off with any words you wrote.</p>
<div class="ab-answer">
<div class="seed" id="ab-seed">Nothing asked yet</div>
<div class="out" id="ab-out">—</div>
<div class="ab-trail" id="ab-trail"></div>
<div class="ab-probs" id="ab-probs"></div>
</div>
<p class="ab-note" id="ab-note"></p>
<h3>Or drive it yourself</h3>
<p class="ab-sub">Give it any two words from its vocabulary. Most combinations were never in the text, and it will still answer.</p>
<div class="ab-exp">
<select id="ab-s1" aria-label="First context word"></select>
<select id="ab-s2" aria-label="Second context word"></select>
<span class="arrow">then?</span>
<button class="ab-btn ghost" id="ab-go" type="button">Continue it</button>
</div>
<h3>What is real here, and what is not</h3>
<p class="ab-sub">Real: the forward pass, the softmax, the cross-entropy loss, the gradients, the weight updates. Every line redrawn during training is an actual number that changed.</p>
<ul class="ab-real">
<li>This network holds a few thousand numbers. A model you would actually talk to holds hundreds of billions.</li>
<li>It sees one, two or three words of context. Real models see thousands and weigh them against each other with attention, which this has none of.</li>
<li>The loss never quite reaches zero, and that is correct. "brian was a senior solutions architect at" is followed by two different companies, so the honest answer is a spread, not a single word. Flip to one word of context and the spread gets much wider, because "at" alone could go anywhere.</li>
<li>The bars are the real output. The model never produces a word, it produces odds over every word, and something has to pick. Set to "always the top word" it is deterministic. Slide it toward "takes chances" and it samples from the odds instead, which is where the variety in a real model's answers comes from. Train it a little and the odds are spread; train it fully and they collapse toward certainty, because it has memorized the text rather than learned anything general.</li>
<li>The part that carries over exactly: once training is done, the sentences are gone. What is left is a pile of numbers that lean the right way, and the answer is rebuilt from scratch every time you ask.</li>
</ul>
</section>
</div>
</div>
<footer>© Brian Smith</footer>
</main>
<script src="/assets/weightless.js?v={{ site.github.build_revision }}"></script>
<script src="/assets/swarm.js?v={{ site.github.build_revision }}"></script>
<script>
(() => {
const choices = [...document.querySelectorAll('[data-theme-choice]')];
const portrait = document.querySelector('.portrait img');
const plain = { src: '/images/profile.jpg', alt: 'Brian Smith' };
const cyber = { src: '/images/profile-cyberpunk.png', alt: 'Brian Smith holding Biscuit' };
// persist: false themes are never remembered; onEnter/onLeave run when switching to/from them.
// Katamari's script loads after this one (defer), so look it up only when it is needed.
const themes = {
professional: { portrait: plain },
'ai-neon': { portrait: cyber },
hackerman: { portrait: cyber },
mfws: { portrait: plain },
weightless: { portrait: plain, onEnter: () => Weightless.start(), onLeave: () => Weightless.teardown() },
swarm: { portrait: plain, persist: false, onEnter: () => Swarm.start(), onLeave: () => Swarm.stop() },
katamari: {
portrait: plain,
persist: false,
onEnter: () => window.Katamari ? window.Katamari.start({ onExit: () => setTheme(storedTheme()) })
: console.warn('Katamari did not load; showing the skin only.'),
onLeave: () => window.Katamari && window.Katamari.stop()
}
};
const storedTheme = () => {
const saved = localStorage.getItem('resume-theme');
return themes[saved] && themes[saved].persist !== false ? saved : 'professional';
};
let current = null;
const setTheme = (theme) => {
if (theme === current) return;
const leaving = themes[current];
current = theme;
if (leaving && leaving.onLeave) leaving.onLeave();
const entry = themes[theme];
document.documentElement.dataset.theme = theme;
choices.forEach((choice) => choice.setAttribute('aria-pressed', String(choice.dataset.themeChoice === theme)));
portrait.src = entry.portrait.src;
portrait.alt = entry.portrait.alt;
if (entry.persist !== false) localStorage.setItem('resume-theme', theme);
if (entry.onEnter) entry.onEnter();
};
// Reveal the new theme in a circle growing out of the pill that was clicked.
const revealTheme = (theme, pill) => {
if (!document.startViewTransition || matchMedia('(prefers-reduced-motion: reduce)').matches) return setTheme(theme);
const box = pill.getBoundingClientRect();
const x = box.left + box.width / 2, y = box.top + box.height / 2;
const radius = Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y));
const transition = document.startViewTransition(() => setTheme(theme));
return transition.ready.then(() => document.documentElement.animate(
{ clipPath: [`circle(0 at ${x}px ${y}px)`, `circle(${radius}px at ${x}px ${y}px)`] },
{ duration: 750, easing: 'cubic-bezier(.65, 0, .35, 1)', pseudoElement: '::view-transition-new(root)' }
).finished);
};
let busy = false;
const chooseTheme = async (theme, pill) => {
if (busy || theme === current) return;
busy = true;
try {
if (current === 'weightless') await Weightless.settle();
await revealTheme(theme, pill);
} finally {
busy = false;
}
};
setTheme(storedTheme());
choices.forEach((choice) => choice.addEventListener('click', () => chooseTheme(choice.dataset.themeChoice, choice)));
})();
</script>
<script src="/assets/experience-drag.js?v={{ site.github.build_revision }}"></script>
<script src="/assets/ask-brian-model.js?v={{ site.github.build_revision }}"></script>
<script src="/assets/ask-brian-corpus.js?v={{ site.github.build_revision }}"></script>
<script src="/assets/ask-brian.js?v={{ site.github.build_revision }}"></script>
<script src="/assets/katamari-core.js?v={{ site.github.build_revision }}" defer></script>
<script src="/assets/katamari.js?v={{ site.github.build_revision }}" defer></script>
</body>
</html>