diff --git a/assets/resume/kyle-neal-resume.pdf b/assets/resume/kyle-neal-resume.pdf index 3f85605..6e323e1 100644 Binary files a/assets/resume/kyle-neal-resume.pdf and b/assets/resume/kyle-neal-resume.pdf differ diff --git a/lib/revstack_web/live/whoami_live.ex b/lib/revstack_web/live/whoami_live.ex index 4b3fd13..294db62 100644 --- a/lib/revstack_web/live/whoami_live.ex +++ b/lib/revstack_web/live/whoami_live.ex @@ -48,12 +48,10 @@ defmodule RevstackWeb.WhoamiLive do @section_navigation_items [ %{id: "whoami-hero", label: "Hero"}, - %{id: "whoami-glance", label: "At A Glance"}, - %{id: "whoami-summary", label: "Professional Summary"}, - %{id: "whoami-expertise", label: "Technical Expertise"}, %{id: "whoami-experience", label: "Professional Experience"}, %{id: "whoami-portfolio", label: "Career Portfolio"}, - %{id: "live-projects", label: "Personal Live Projects"}, + %{id: "whoami-expertise", label: "Technical Expertise"}, + %{id: "live-projects", label: "Independent Product Work"}, %{id: "leadership-teamwork", label: "Leadership & Teamwork"}, %{id: "whoami-education", label: "Education"}, %{id: "whoami-interests", label: "When I'm Not Coding"}, @@ -65,9 +63,9 @@ defmodule RevstackWeb.WhoamiLive do def mount(_params, _session, socket) do socket = assign(socket, - page_title: "Kyle Neal | Lead Elixir & Erlang Engineer", + page_title: "Kyle Neal | Lead Distributed Systems Engineer", page_description: - "Kyle Neal — Lead Distributed Systems Engineer specializing in Erlang/OTP, Elixir, Phoenix LiveView, high-volume event processing, and technical leadership.", + "Kyle Neal — Lead Distributed Systems Engineer specializing in Erlang/OTP, Elixir, high-throughput event systems, distributed data platforms, and hands-on technical leadership.", current_path: "/whoami", admin_gallery_open?: false, admin_gallery_index: 0, @@ -77,6 +75,7 @@ defmodule RevstackWeb.WhoamiLive do career_modal_open?: false, career_selected_project_id: nil, career_detail_view?: false, + experience_expanded_id: nil, career_expanded_phase_id: nil, career_phases: [career_portfolio_phase_two(), career_portfolio_phase_one()] ) @@ -124,6 +123,17 @@ defmodule RevstackWeb.WhoamiLive do {:noreply, assign(socket, career_expanded_phase_id: nil)} end + def handle_event("toggle_experience", %{"id" => experience_id}, socket) do + next_id = + if socket.assigns.experience_expanded_id == experience_id do + nil + else + experience_id + end + + {:noreply, assign(socket, :experience_expanded_id, next_id)} + end + def handle_event("open_career_modal", %{"project-id" => project_id}, socket) do {:noreply, assign(socket, @@ -171,14 +181,12 @@ defmodule RevstackWeb.WhoamiLive do />
<.hero_section /> - <.at_a_glance_section /> - <.professional_summary_section /> - <.technical_expertise_section /> - <.professional_experience_section /> + <.professional_experience_section experience_expanded_id={@experience_expanded_id} /> <.career_portfolio_section career_phases={@career_phases} expanded_phase_id={@career_expanded_phase_id} /> + <.technical_expertise_section /> <.live_projects_section admin_gallery_images={@admin_gallery_images} /> <.leadership_and_teamwork_section /> <.education_section /> @@ -207,139 +215,148 @@ defmodule RevstackWeb.WhoamiLive do defp hero_section(assigns) do ~H""" -
-
-
- <.icon name="hero-user" class="size-4" /> Technical Profile -
-

- Kyle Neal -

-

- Lead Elixir & Erlang Engineer -

-

- 10+ years building revenue-critical distributed systems on the BEAM. - Erlang/OTP, Elixir, Phoenix LiveView, Cassandra, RabbitMQ, and technical leadership. -

-
- - <.link - navigate={~p"/contact"} - id="hero-contact-link" - class="btn btn-primary btn-md sm:btn-lg gap-2 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-0.5 w-full sm:w-auto max-w-xs" - > - <.icon name="hero-envelope" class="size-5" /> Contact Me - -
- <%!-- Quick links --%> -
-
- +
+
+
+

+ Erlang/OTP + Elixir • Revenue-Critical Platforms • Hands-On Technical Leadership +

+

- - GitHub - - +

+ I build and operate high-throughput BEAM systems that directly support revenue. +

+

- <.icon name="hero-envelope" class="size-4" /> nealkyle5@gmail.com - + My core story is long-term ownership of an Erlang/OTP affiliate platform handling + click tracking, attribution, partner callbacks, analytics, and reporting at + 1.5M+ events/day + and $2.5M+ monthly revenue. + I also architected NetAdmin, a major Elixir/Phoenix LiveView + Ash platform for + orchestration, monitoring, auditability, and automation. +

+ +
+

+ Best fit roles +

+
+ <.signal_chip label="Lead Distributed Systems Engineer" /> + <.signal_chip label="Senior Erlang / Elixir Engineer" /> + <.signal_chip label="Staff Backend Engineer" /> + <.signal_chip label="Platform / Infrastructure Engineer" /> + <.signal_chip label="Technical Lead Who Still Codes" /> +
+
+ +
+
+ <.proof_point_chip value="1.5M+" label="events/day processed by systems I've built" /> + <.proof_point_chip + value="$2.5M+" + label="monthly revenue supported on systems I've built" + /> + <.proof_point_chip + value="~25%" + label="infrastructure cost reduction through workflow and scaling improvements" + /> + <.proof_point_chip value="5" label="engineers led hands-on" /> +
+
+ +
+
+ <.link + navigate={~p"/contact"} + id="hero-contact-link" + class="btn btn-primary btn-md sm:btn-lg gap-2 shadow-lg hover:shadow-xl transition-all duration-300 hover:-translate-y-0.5" + > + <.icon name="hero-envelope" class="size-5" /> Contact Me + + + <.icon name="hero-eye" class="size-5" /> View Resume + + + <.icon name="hero-arrow-down-tray" class="size-5" /> + +
+ + +

-
-
-
- """ - end - defp at_a_glance_section(assigns) do - ~H""" -
-
-
- <.stat_card value="10+" label="Years on the BEAM" /> - <.stat_card value="1.5M+" label="Daily events processed by systems I built" /> - <.stat_card value="$2.5M+" label="Monthly revenue supported by systems I built" /> - <.stat_card value="5" label="Engineers managed" /> -
-
-
- """ - end +
+
+
+

+ Why I stand out +

+

+ The first-glance version before you dive into the deeper project and system detail. +

+
- defp professional_summary_section(assigns) do - ~H""" -
-
-
-

Professional Summary

-
-
-
- <.summary_item - icon="hero-cpu-chip" - text="Lead Distributed Systems Engineer focused on long-lived, production BEAM systems (Erlang/OTP + Elixir)" - /> - <.summary_item - icon="hero-server-stack" - text="Builds and operates high-throughput, revenue-critical platforms with a strong performance and operability mindset" - /> - <.summary_item - icon="hero-circle-stack" - text="Designs distributed data + messaging architectures across Cassandra/PostgreSQL, RabbitMQ, and search/analytics" - /> - <.summary_item - icon="hero-magnifying-glass" - text="Owns data modeling and query tuning across OLTP and time-series workloads, with deep comfort debugging production paths" - /> - <.summary_item - icon="hero-cog-6-tooth" - text="Reliability-first engineering: OTP fault tolerance, BEAM VM tuning, release strategy, CI/CD automation, and incident response" - /> - <.summary_item - icon="hero-computer-desktop" - text="Full-stack builder with Phoenix/LiveView and Ash; ships internal platforms and tooling from concept to production" - /> - <.summary_item - icon="hero-user-group" - text="Hands-on technical leader: mentors engineers, aligns cross-team delivery, and stays deep in the code" - /> - <.summary_item - icon="hero-cloud" - text="Infrastructure-aware across AWS and Linux, with pragmatic automation experience (Jenkins/Ansible)" - /> + <.hero_spotlight_card + eyebrow="Primary Story" + title="Affiliate platform ownership" + description="Long-term owner of a revenue-critical Erlang/OTP platform spanning tracking, attribution, callbacks, partner reporting, distributed messaging, Cassandra-backed event storage, and production reliability." + /> + + <.hero_spotlight_card + eyebrow="Elixir Signal" + title="NetAdmin" + description="Architected a Phoenix LiveView + Ash control plane for lifecycle orchestration, monitoring, log visibility, audit trails, and operational automation across internal systems." + /> + + <.hero_spotlight_card + eyebrow="Leadership Style" + title="Hands-on technical leadership" + description="Led up to 5 engineers, handled technical interviews and hiring, and stayed directly responsible for architecture, code, escalations, and infrastructure decisions." + /> +
+
@@ -361,33 +378,34 @@ defmodule RevstackWeb.WhoamiLive do <.expertise_group title="BEAM & Languages" items={[ - "Erlang/OTP (GenServers, Supervisors, clustering)", - "Elixir", + "Erlang/OTP for high-throughput, fault-tolerant services", + "Elixir application and platform development", "Phoenix + LiveView", "Ash Framework", - "BEAM VM tuning & relup zero-downtime upgrades", - "REST API design & third-party integrations" + "BEAM VM tuning and relup zero-downtime upgrades", + "REST API design and third-party integrations" ]} /> <.expertise_group title="Data & Messaging" items={[ - "Cassandra (6-node production cluster)", - "PostgreSQL", - "Elasticsearch / OpenSearch analytics", - "Apache Spark (AWS EMR)", + "Cassandra (6-node production cluster, time-series modeling)", + "PostgreSQL query tuning and reporting workloads", "RabbitMQ distributed messaging pipelines", - "Time-series data modeling (1.5M+ events/day)" + "Elasticsearch / OpenSearch analytics", + "Apache Spark (Scala, AWS EMR)", + "Event ingestion and reporting pipelines at 1.5M+ events/day" ]} /> <.expertise_group - title="Infrastructure & DevOps" + title="Infrastructure & Protocols" items={[ "AWS (EC2, RDS, S3)", "Linux operations & administration", "Ansible automation", - "CI/CD (Jenkins, Ansible)", - "Observability & reliability engineering" + "CI/CD with Jenkins", + "HTTP, WebSockets, DNS, SMTP, and proxies", + "Observability, monitoring, and reliability engineering" ]} />
@@ -406,35 +424,61 @@ defmodule RevstackWeb.WhoamiLive do

Professional Experience

+

+ Condensed on the surface for fast scanning. Open a role for the deeper architecture, + systems, and delivery detail. +

-
+
<.experience_card + id="experience-ionik" title="Lead Distributed Systems Engineer" - company="Ubiquity Agency an Ionik company" - period="October 2014 — 2026" - current?={false} + company="Ionik (formerly VeriAS)" + period="October 2014 — Present" + current?={true} + expanded?={@experience_expanded_id == "experience-ionik"} + summary="Long-term owner of a revenue-critical Erlang/OTP affiliate platform covering click tracking, attribution, callbacks, partner reporting, distributed data architecture, and production reliability. NetAdmin, the internal Elixir platform I architected, sits alongside that work as the strongest Elixir proof point on the page." + surface_points={[ + "1.5M+ events/day", + "$2.5M+ monthly revenue", + "6-node Cassandra event store", + "~25% infra cost reduction", + "Led up to 5 engineers" + ]} items={[ - "Lead architect and primary backend engineer for a revenue-critical affiliate network platform written in Erlang, supporting $2.5M+ monthly revenue and processing 1.5M+ events daily (~20+ events/sec average with significantly higher peak throughput).", - "Design and operate distributed data and messaging architecture including a 6-node Cassandra production cluster, RabbitMQ event pipelines, and Elasticsearch/OpenSearch analytics infrastructure.", - "Own data modeling and performance strategy across Cassandra and PostgreSQL; routinely debug and optimize complex production queries and high-volume transaction paths.", - "Responsible for system reliability, BEAM VM tuning, release strategy (relup), CI/CD automation, and production incident debugging across distributed environments.", - "Architected and built an internal infrastructure management platform from inception, a full-stack Elixir (Phoenix + Ash) internal infrastructure control platform enabling resource lifecycle orchestration, authorization modeling, operational auditability, and cross-system automation.", - "Lead and managed 5 engineers (UI + infrastructure) while remaining hands-on across backend, data architecture, and full-stack feature delivery. Conducted technical interviews and evaluated engineering candidates as part of the hiring process." + "Lead architect and primary backend engineer for a revenue-critical affiliate marketing platform using Erlang/OTP. The platform supports $2.5M+ monthly revenue, processes 1.5M+ events daily, and powers high-volume click tracking, attribution, and real-time partner reporting.", + "Owned backend platform design across tracking, analytics, and partner connectivity, including REST APIs and internal service integrations used throughout the product.", + "Designed and operated distributed data and messaging architecture including a 6-node Cassandra production cluster, RabbitMQ event pipelines, and Elasticsearch/OpenSearch analytics infrastructure.", + "Owned data modeling across Cassandra and PostgreSQL; routinely debugged and optimized high-volume transaction paths, production SQL, and reporting workloads.", + "Built Apache Spark (Scala, AWS EMR) pipelines that aggregated Cassandra raw event data into PostgreSQL datasets used for analytics and financial reporting.", + "Architected and built NetAdmin, an internal Elixir platform using Phoenix, LiveView, and Ash Framework for resource lifecycle orchestration, distributed systems monitoring, operational auditability, and cross-system automation.", + "Owned system reliability across BEAM VM tuning, relup strategy, CI/CD automation, Ansible-based infrastructure automation, and production incident debugging in distributed environments.", + "Led and managed up to 5 engineers across UI and infrastructure while remaining hands-on in backend development, data architecture, and full-stack delivery. Conducted technical interviews and hiring evaluations.", + "Managed cloud and infrastructure operations across AWS, domains, and VPS providers, and implemented audits and scaling changes that reduced infrastructure operating costs by ~25%." ]} /> <.experience_card + id="experience-revenuelink" title="Founder & Software Engineer" company="RevenueLink Technologies LLC" period="2023 — Present" current?={true} + expanded?={@experience_expanded_id == "experience-revenuelink"} + summary="Independent consulting and product vehicle for real deployed work, including business-facing lead-generation systems, recruiter-facing software, and small Elixir experiments with full delivery ownership." + surface_points={[ + "Phoenix LiveView product work", + "Real business demand", + "Lead-gen + admin workflows" + ]} + impact_note="Hardcore Handyman generated more inbound demand than the business could operationally support." items={[ - "Founded a consulting and technology services company used for independent software projects, consulting engagements, and local technology services.", + "Founded a consulting and software vehicle for independent projects, select consulting engagements, and Elixir/Phoenix experiments.", {:parts, [ {:text, "Designed and built "}, {:link, "https://hardcorehandyman.fly.dev/", "hardcorehandyman.fly.dev"}, {:text, - " (formerly hardcorehandymanoflawton.com), a custom lead-generation platform for a local handyman business. Built with Elixir, Phoenix LiveView, and Ecto, the system included SEO-driven service pages, conversion-focused design, and an internal admin interface for managing customer quote requests with photo uploads of project details. "}, + ", a custom Phoenix LiveView lead-generation platform for a local handyman business. The system included SEO-driven service pages, a quote workflow with photo uploads, and an internal admin interface for managing requests. "}, {:strong, "The platform ultimately generated more inbound demand than the business could operationally support."} ]}, @@ -443,32 +487,32 @@ defmodule RevstackWeb.WhoamiLive do {:text, "Built and operate "}, {:link, "https://revstack.fly.dev/", "revstack.fly.dev"}, {:text, - ", a Phoenix LiveView application serving as a professional portfolio, lead-generation platform, and development sandbox for new ideas."} + ", a Phoenix LiveView application serving as a recruiter-facing portfolio, lead-generation platform, and sandbox for new ideas."} ]}, - "Provide consulting and technical services including custom web application development, systems architecture guidance, and local technology support for individuals and small businesses.", - "Use the company as a vehicle for experimentation with Elixir, distributed systems, infrastructure tooling, and small SaaS-style projects." - ]} - /> - <.experience_card - title="Application Programmer" - company="CGI Federal" - period="December 2013 — October 2014" - current?={false} - items={[ - "Performed detailed source code analysis for enterprise Java/ADA systems.", - "Developed tooling and assisted with build/release workflows for multi-million SLOC applications.", - "Created smoke and sanity testing processes supporting production releases." - ]} - /> - <.experience_card - title="In-House Technician" - company="Wichita Online" - period="April 2013 — December 2013" - current?={false} - items={[ - "Provided in-field network troubleshooting and wireless equipment deployment (MikroTik, Canopy routers)." + "Use the company as a vehicle for consulting, hands-on product work, and experimentation with Elixir, infrastructure tooling, and small SaaS-style projects." ]} /> +
+

+ Earlier experience +

+
+ <.compact_experience_card + id="experience-cgi" + title="Application Programmer" + company="CGI Federal" + period="December 2013 — October 2014" + summary="Performed source analysis and release-support tooling work for large enterprise Java and ADA systems." + /> + <.compact_experience_card + id="experience-wichita" + title="In-House Technician" + company="Wichita Online" + period="April 2013 — December 2013" + summary="Handled in-field network troubleshooting and wireless equipment deployment for ISP operations." + /> +
+
@@ -486,7 +530,9 @@ defmodule RevstackWeb.WhoamiLive do

Career Portfolio

- Two major chapters of production systems engineering on the BEAM.
+ The affiliate platform is the flagship system, and NetAdmin is the strongest Elixir + platform built alongside it. Supporting systems are grouped the way they were actually + owned in production.
<.icon name="hero-cursor-arrow-rays" class="size-7 inline-block align-text-bottom" @@ -511,13 +557,12 @@ defmodule RevstackWeb.WhoamiLive do

- <%!--
- <.icon name="hero-rocket-launch" class="size-4" /> Live & Deployed -
--%> -

Personal Live Projects

+

Independent Product Work

- Production applications I designed, built, and deployed on my spare time
+ Deployed work outside the affiliate platform and NetAdmin. Hardcore Handyman is the + clearest business signal here: the platform generated more inbound demand than the + business could operationally support.
<.icon name="hero-cursor-arrow-rays" class="size-5 inline-block align-text-bottom" @@ -529,7 +574,7 @@ defmodule RevstackWeb.WhoamiLive do <.project_card id="project-handyman" title="Hardcore Handyman" - subtitle="Production Phoenix LiveView system enabling customers to submit job requests with image uploads. Data is validated, stored with Ecto, and triggers email notifications for a streamlined quoting workflow." + subtitle="Phoenix LiveView lead-generation platform that generated more inbound demand than the business could operationally support, backed by quote requests, photo uploads, SEO-driven pages, and an admin workflow." href="https://hardcorehandyman.fly.dev/" icon="hero-wrench-screwdriver" preview_src={~p"/images/hardcorehandyman_preview.png"} @@ -537,18 +582,18 @@ defmodule RevstackWeb.WhoamiLive do /> <.project_card id="project-admin" - title="Admin Dashboard (for this site!)" - subtitle="Custom-built admin dashboard for managing leads and estimates. Features real-time data grids, filtering, status management, and single-user authentication." + title="Revstack Admin Dashboard" + subtitle="Internal Phoenix LiveView admin surface for managing leads and estimates, with real-time data grids, filtering, status workflows, and authenticated operations." href="https://github.com/kyle-neal/revstack" icon="hero-cog-6-tooth" preview_src={~p"/images/admin_panel/admin_dashboard.png"} - tech={~w(Elixir Phoenix LiveView Ash Postgres)} + tech={["Elixir", "Phoenix", "LiveView", "Ash Framework", "Postgres"]} on_click="open_admin_gallery" /> <.project_card id="project-revenuelink" title="RevenueLink" - subtitle="My personal business website and portfolio hub. Showcases my professional profile and services, and serves as a central point for inquiries and collaborations." + subtitle="Public home for RevenueLink Technologies, used to ship business-facing services, deployed software, and lightweight product experiments with real delivery ownership." href="https://revenuelink.net/" icon="hero-building-office-2" preview_src={~p"/images/revenuelink_preview.png"} @@ -575,13 +620,13 @@ defmodule RevstackWeb.WhoamiLive do <.education_card degree="B.S. Computer Science" school="Cameron University" - period="2010 — 2014" + period="Fall 2010 — July 2014" honors="Magna Cum Laude" /> <.education_card degree="A.S. Information Technology" school="Cameron University" - period="2014 — 2016" + period="Fall 2012 — June 2014" honors="Magna Cum Laude" />

@@ -601,8 +646,9 @@ defmodule RevstackWeb.WhoamiLive do

Leadership & Teamwork

- Technical leadership across distributed teams, from architecting production systems to - mentoring engineers and coordinating cross-functional delivery. + Hands-on technical leadership across backend, infrastructure, and delivery. I stayed + responsible for architecture and production systems while leading engineers, hiring, and + driving operational decisions.

@@ -610,27 +656,27 @@ defmodule RevstackWeb.WhoamiLive do
<.leadership_item icon="hero-building-office" - text="Architecture ownership across all production systems" + text="Long-term ownership of revenue-critical backend platforms" /> <.leadership_item icon="hero-academic-cap" - text="Mentored & managed 5 engineers across backend and infrastructure" + text="Led, mentored, and managed up to 5 engineers" /> <.leadership_item - icon="hero-arrows-right-left" - text="Coordinated frontend, backend & infrastructure teams" + icon="hero-user-plus" + text="Conducted technical interviews and engineering evaluations" /> <.leadership_item icon="hero-arrow-trending-up" - text="Scaled platforms to $2.5M+ monthly revenue" + text="Scaled systems supporting $2.5M+ monthly revenue" /> <.leadership_item icon="hero-calendar" - text="Managed delivery timelines, releases & incident response" + text="Managed releases, incidents, and infrastructure operations" /> <.leadership_item icon="hero-wrench-screwdriver" - text="Hands-on across backend, full-stack & DevOps delivery" + text="Reduced infrastructure operating costs by ~25%" />
@@ -645,9 +691,9 @@ defmodule RevstackWeb.WhoamiLive do <.icon name="hero-user-group" class="size-5" />
-

Affiliate Platform Team

+

Affiliate Platform Ownership

- Poland-based backend & DevOps collaboration + Distributed backend and operations collaboration

@@ -656,23 +702,23 @@ defmodule RevstackWeb.WhoamiLive do
  • <.icon name="hero-chevron-right" class="size-4 text-primary shrink-0 mt-0.5" /> - Collaborated with 5 backend - and 3 DevOps engineers - to build a multi-million-dollar affiliate network platform. + Partnered with backend and infrastructure engineers across multiple stages of the + platform, then became the long-term owner of backend architecture, features, and + production operations.
  • <.icon name="hero-chevron-right" class="size-4 text-primary shrink-0 mt-0.5" /> - Partnered with 2 lead engineers - on architecture and initial production launch, then became the sole owner - for features, maintenance, and major rewrites. + Worked directly with the CTO on business rules, partner integrations, reporting + requirements, and production decision-making for the affiliate platform.
  • <.icon name="hero-chevron-right" class="size-4 text-primary shrink-0 mt-0.5" /> - Ultimately rewrote more of the system than the original team-built release contained. + Rewrote and expanded major portions of the system over time while keeping the + platform live, revenue-critical, and operationally stable.
  • @@ -689,7 +735,7 @@ defmodule RevstackWeb.WhoamiLive do

    Infrastructure Team

    - Built & led a self-managed ops team + Hands-on infrastructure and operational leadership

    @@ -698,16 +744,16 @@ defmodule RevstackWeb.WhoamiLive do
  • <.icon name="hero-chevron-right" class="size-4 text-primary shrink-0 mt-0.5" /> - Built a Philippines-based infrastructure team to operate as a - self-managed unit - with the structure and autonomy to run independently. + Led up to 3 infrastructure engineers + and 2 UI engineers + while still owning critical backend architecture, reliability work, and escalations.
  • <.icon name="hero-chevron-right" class="size-4 text-primary shrink-0 mt-0.5" /> - Balanced delegation with hands-on involvement during high-pressure delivery periods, - keeping the team sustainable and operationally independent. + Managed AWS, VPS, domain, and operational cost decisions directly, including audits + and scaling changes that lowered infrastructure spend by ~25%.
  • @@ -753,11 +799,11 @@ defmodule RevstackWeb.WhoamiLive do

    - Hiring for a role? + Hiring for a remote role?

    - I'm always open to discussing the right engineering opportunity. + Open to the right Erlang/Elixir, platform, or distributed systems opportunity.

    <.link navigate={~p"/contact"} class="btn btn-primary gap-2"> @@ -1107,22 +1153,29 @@ defmodule RevstackWeb.WhoamiLive do """ end - defp stat_card(assigns) do + defp proof_point_chip(assigns) do ~H""" -
    -

    {@value}

    -

    {@label}

    -
    + + {@value} + {@label} + """ end - defp summary_item(assigns) do + defp signal_chip(assigns) do ~H""" -
    -
    - <.icon name={@icon} class="size-4" /> -
    -

    {@text}

    + + {@label} + + """ + end + + defp hero_spotlight_card(assigns) do + ~H""" +
    +

    {@eyebrow}

    +

    {@title}

    +

    {@description}

    """ end @@ -1142,8 +1195,25 @@ defmodule RevstackWeb.WhoamiLive do end defp experience_card(assigns) do + assigns = + assigns + |> assign_new(:id, fn -> nil end) + |> assign_new(:summary, fn -> nil end) + |> assign_new(:surface_points, fn -> [] end) + |> assign_new(:impact_note, fn -> nil end) + |> assign_new(:expanded?, fn -> false end) + ~H""" -
    +

    {@title}

    @@ -1159,15 +1229,51 @@ defmodule RevstackWeb.WhoamiLive do
    -
      -
    • - <.icon name="hero-chevron-right" class="size-4 text-primary shrink-0 mt-0.5" /> - <.experience_item item={item} /> -
    • -
    + +

    {@summary}

    + +
    + <.signal_chip :for={point <- @surface_points} label={point} /> +
    + +
    +
    + <.icon name="hero-megaphone" class="size-4 shrink-0 mt-0.5 text-primary" /> + {@impact_note} +
    +
    + + + +
    +
      +
    • + <.icon name="hero-chevron-right" class="size-4 text-primary shrink-0 mt-0.5" /> + <.experience_item item={item} /> +
    • +
    +
    """ end @@ -1202,6 +1308,24 @@ defmodule RevstackWeb.WhoamiLive do """ end + defp compact_experience_card(assigns) do + ~H""" +
    +
    +
    +

    {@title}

    +

    {@company}

    +
    +

    {@period}

    +
    +

    {@summary}

    +
    + """ + end + defp education_card(assigns) do ~H"""
    @@ -1348,7 +1472,30 @@ defmodule RevstackWeb.WhoamiLive do {@phase.overview}

    <.phase_scale_metrics :if={Map.get(@phase, :metrics)} metrics={@phase.metrics} /> -
    + +
    + <.career_project_group + :for={group <- @phase.project_groups} + phase={@phase} + group={group} + /> +
    +

    <.icon name="hero-cursor-arrow-rays" class="size-4 inline-block align-text-bottom" /> Click any project for the full story @@ -1403,12 +1550,26 @@ defmodule RevstackWeb.WhoamiLive do end defp career_project_card(assigns) do + assigns = assign_new(assigns, :featured?, fn -> false end) + ~H""" + """ + end + + defp career_project_group(assigns) do + assigns = assign(assigns, :projects, phase_projects(assigns.phase, assigns.group.project_ids)) + + ~H""" +

    +
    +
    + <.icon name={@group.icon} class="size-5" /> +
    +
    +

    {@group.title}

    +

    {@group.description}

    +
    +
    +
    + <.career_project_list_item :for={project <- @projects} project={project} /> +
    +
    + """ + end + + defp career_project_list_item(assigns) do + ~H""" + """ end @@ -1448,12 +1667,14 @@ defmodule RevstackWeb.WhoamiLive do label in [ "Cassandra", "Elasticsearch", + "Elasticsearch/OpenSearch", "PostgreSQL", "RabbitMQ", "Distributed Systems", "Infrastructure Reliability", "Platform Ownership", - "Leadership" + "Leadership", + "Technical Leadership" ] -> "skill-badge-subtle" @@ -1742,6 +1963,13 @@ defmodule RevstackWeb.WhoamiLive do # Career Portfolio Data # --------------------------------------------------------------------------- + defp phase_projects(phase, project_ids) do + Enum.map(project_ids, fn project_id -> + Enum.find(phase.projects, &(&1.id == project_id)) + end) + |> Enum.reject(&is_nil/1) + end + defp find_career_project(phases, project_id) do Enum.find_value(phases, fn phase -> Enum.find(phase.projects, &(&1.id == project_id)) @@ -2145,108 +2373,141 @@ defmodule RevstackWeb.WhoamiLive do title: "Affiliate Network Platform & Infrastructure Leadership", card_title: "Affiliate Network Platform", card_icon: "hero-chart-bar", - card_era: "2018–2026 — Senior Engineer & Platform Ownership", + card_era: "2018–Present — Senior Engineer & Platform Ownership", card_summary: - "Built and owned a revenue-critical affiliate network platform end-to-end, spanning high-throughput Erlang services, internal Elixir/Phoenix tooling, and large-scale Cassandra, Elasticsearch, and PostgreSQL data systems.", + "Long-term ownership of a revenue-critical affiliate marketing platform in Erlang/OTP, complemented by NetAdmin, the Elixir control plane I built for infrastructure lifecycle orchestration and monitoring.", card_badges: [ "Erlang/OTP", "Elixir", "Phoenix LiveView", "Ash Framework", "Cassandra", - "Elasticsearch", + "Elasticsearch/OpenSearch", "RabbitMQ", "PostgreSQL", - "Apache Spark (scala)", + "Apache Spark", "REST APIs", - "High-Throughput Backends", - "Leadership over UI and Infrastructure Engineers", - "Event Driven Architecture and Pipelines", - "Big Data Processing", - "Reporting and Analytics", + "HTTP", + "WebSockets", + "DNS", + "SMTP", + "Technical Leadership", "Affiliate Marketing Technology" ], card_bullets: [ - "Owned the entire backend stack of a $2.5M+/month affiliate network platform", - "Designed event-driven click tracking, redirect, and conversion systems at scale", - "Operated Cassandra, Elasticsearch, and Spark across ~1.2PB of combined data", - "Led supporting engineers while remaining hands-on across all backend systems" + "Owned the backend architecture of a $2.5M+/month affiliate platform processing 1.5M+ events/day", + "Built click tracking, attribution, reporting, and partner integration systems in Erlang/OTP", + "Architected NetAdmin in Elixir/Phoenix LiveView/Ash as the internal infrastructure control plane", + "Led UI and infrastructure engineers while staying hands-on in architecture, code, and operations" ], overview: - "Architected and operated backend systems powering a large affiliate marketing platform processing millions of daily events. Later built internal infrastructure management tooling used across multiple company systems.", + "This phase is the core of my professional story: long-term ownership of a revenue-critical affiliate marketing platform, plus the Elixir control plane I built to manage infrastructure and operational workflows around it.", metrics: [ %{value: "1.5M+", label: "events / day"}, - %{value: "~250", label: "peak events / sec"}, - %{value: "~600", label: "peak redirects / sec"}, + %{value: "$2.5M+", label: "monthly revenue"}, %{value: "6-node", label: "Cassandra cluster"}, - %{value: "3-node", label: "ES cluster"}, - %{value: "~600 TB", label: "Cassandra footprint"}, - %{value: "~600 TB", label: "ES analytics"}, - %{value: "12+", label: "years ownership"} + %{value: "~25%", label: "lower infra costs"}, + %{value: "5", label: "engineers led"} ], team: %{ description: - "Kyle served as the lead backend engineer for the affiliate platform, responsible for architecture, development, and production operations.", + "I stayed hands-on while leading engineers, owning backend architecture, and driving production operations for the affiliate platform and the systems around it.", members: [ - "Worked closely with the CTO on business issues and core technology", - "Kyle owned the entire affiliate network platform backend stack", - "Led 2 UI engineers building customer-facing tools on top of the platform", - "Led 3 infrastructure engineers that managed the underlying VPS, DNS, and monitoring infrastructure supporting the platform" + "Worked closely with the CTO on partner requirements, reporting needs, business rules, and core technology decisions", + "Owned the long-term backend architecture for the affiliate platform and its supporting services", + "Led up to 2 UI engineers and 3 infrastructure engineers while remaining active in system design and implementation", + "Handled releases, production debugging, infrastructure audits, and cost strategy without stepping away from code" ] }, + featured_project_ids: ["affiliate-network-platform", "netadmin-platform"], + project_groups: [ + %{ + id: "tracking-attribution", + title: "Tracking, Attribution & Partner Integrations", + description: + "Supporting services that turned incoming traffic into attributable, reportable partner outcomes.", + icon: "hero-arrows-right-left", + project_ids: [ + "edge-redirect-service", + "conversion-callback-engine", + "tracking-domain-infra" + ] + }, + %{ + id: "analytics-reporting", + title: "Analytics, Reporting & Data Infrastructure", + description: + "The ingestion, storage, aggregation, and reporting systems behind partner analytics and operational visibility.", + icon: "hero-circle-stack", + project_ids: [ + "traffic-analytics-pipeline", + "distributed-data-platform" + ] + } + ], projects: [ %{ id: "affiliate-network-platform", - title: "Affiliate Network Platform", + title: "Affiliate Marketing Platform", tagline: - "Core backend platform powering affiliate campaign tracking, conversion attribution, reporting, and partner integrations", + "Flagship Erlang/OTP platform for click tracking, attribution, reporting, and partner integrations", period_label: "Core Platform", phase: 2, icon: "hero-chart-bar", + featured_label: "Flagship Distributed System", card_copy: - "Revenue-critical Erlang platform handling click tracking, conversion attribution, campaign management, reporting, and partner integrations across millions of daily events.", + "Revenue-critical Erlang/OTP system supporting $2.5M+ monthly revenue and 1.5M+ daily events across click tracking, attribution, campaign logic, reporting, and partner APIs.", summary: - "Core backend platform powering affiliate campaign tracking, conversion attribution, reporting, and partner integrations. Built in Erlang/OTP with Cassandra, Elasticsearch, RabbitMQ, and PostgreSQL as the primary data and messaging layer.", + "The core backend platform I owned for the affiliate business. It handled click, impression, and conversion tracking; attribution; reporting; partner integrations; and the operational workflows that made the platform revenue-critical.", tech_used: [ "Erlang/OTP", + "Cassandra", "PostgreSQL", "RabbitMQ", - "Cassandra", - "Elasticsearch", + "Elasticsearch/OpenSearch", + "REST APIs", "Apache Spark" ], + architecture: [ + "Event-driven Erlang services handled tracking, attribution, routing, and partner workflows", + "Cassandra stored high-volume raw event data and time-series traffic history", + "PostgreSQL supported operational workflows, reporting datasets, and financial views", + "RabbitMQ connected ingestion, callbacks, and downstream processing services", + "Elasticsearch/OpenSearch powered detailed partner reporting and performance analytics", + "Spark pipelines aggregated raw event data into reporting datasets used for analytics and finance" + ], responsibilities: [ - "Click tracking", - "Impression tracking", - "Conversion attribution", - "Affiliate management", - "Advertiser management", - "Campaign configuration and payout rules", - "Reporting and analytics", - "CSV export pipelines", - "Moderation workflows", - "Suppression list management", - "Creative and landing page management", - "External APIs and integrations" + "Owned backend architecture, features, and production operations for the platform", + "Built and maintained click, impression, and conversion tracking paths", + "Implemented attribution, routing, campaign configuration, and payout workflows", + "Designed partner-facing and internal REST APIs plus service integrations", + "Owned data modeling, query tuning, and reporting paths across Cassandra and PostgreSQL" ], scale: [ - "Millions of events processed daily", - "Revenue-critical production system supporting $2.5M+ monthly revenue" + "1.5M+ events processed daily", + "$2.5M+ monthly revenue supported by the platform", + "6-node Cassandra production cluster", + "Real-time partner reporting and high-volume transaction paths" + ], + business_impact: [ + "Served as the primary technical engine behind a long-running affiliate business", + "Demonstrated sustained ownership of a revenue-critical distributed system on the BEAM" ], timeline_order: 1 }, %{ id: "netadmin-platform", - title: "NetAdmin/Infra Platform", + title: "NetAdmin", tagline: - "Internal infrastructure management platform supporting affiliate network, MTA, data verification, and external systems", + "Elixir control plane for lifecycle orchestration, monitoring, log streaming, and operational auditability", period_label: "Internal Tooling", phase: 2, icon: "hero-cog-6-tooth", + featured_label: "Featured Elixir Platform", card_copy: - "Full-stack Elixir/Phoenix/Ash internal platform managing infrastructure provisioning, VPS lifecycle, domain management, and service automation across company systems.", + "Phoenix + LiveView + Ash platform for provisioning, service lifecycle automation, monitoring, auditability, and cross-system operational workflows.", summary: - "Internal infrastructure management platform originally created to manage affiliate network infrastructure and later expanded to support company-wide systems including MTA infrastructure, data verification systems, and external affiliate network platforms. Served as a DevOps dashboard for provisioniong and monitoring all company infrastructure.", + "NetAdmin was the internal infrastructure platform I architected and built in Elixir. It started as a way to manage affiliate platform infrastructure and expanded into a control plane for MTA, verification, and other company systems.", tech_used: [ "Elixir", "Phoenix", @@ -2256,46 +2517,50 @@ defmodule RevstackWeb.WhoamiLive do "Ansible" ], architecture: [ - "Full-stack Elixir application built with Phoenix and Ash Framework", - "PostgreSQL for persistent data storage", - "Ansible integration for infrastructure automation", - "Multi-system management across affiliate network, MTA, data verification, and external platforms", - "Real-time monitoring and dashboards for infrastructure visibility", - "Log streaming and alerting for operational awareness" + "Phoenix + LiveView UI backed by Ash resources and authorization rules", + "PostgreSQL as the system of record for infrastructure state and operational history", + "Ansible integration for provisioning and lifecycle automation", + "Cross-system workflows spanning the affiliate platform, MTA, verification systems, and external platforms", + "Real-time dashboards, operational monitoring, and log visibility for daily operations", + "Operational auditability built into the platform rather than bolted on afterward" ], responsibilities: [ - "Infrastructure provisioning", - "VPS lifecycle management", - "Domain and SSL management", - "Payment method tracking", - "Service lifecycle automation", - "Infrastructure visibility dashboards" + "Resource lifecycle orchestration", + "VPS, service, domain, and SSL management", + "Monitoring dashboards and operational visibility", + "Real-time log streaming and cross-system troubleshooting support", + "Authorization modeling and auditability", + "Automation across multiple internal platforms" + ], + business_impact: [ + "Centralized infrastructure operations that had previously been spread across scripts and tribal knowledge", + "Showcases deep Elixir, Phoenix LiveView, and Ash experience in a production internal platform" ], timeline_order: 2 }, %{ id: "edge-redirect-service", - title: "Edge Redirect Service", + title: "Tracking Edge Service", tagline: - "High-performance edge service handling affiliate tracking links and routing traffic based on campaign rules", + "High-performance Erlang service handling tracking links and routing traffic based on campaign rules", period_label: "Edge Infrastructure", phase: 2, icon: "hero-arrows-right-left", card_copy: - "Erlang edge service on disposable VPS nodes generating real-time redirect responses for affiliate tracking links based on campaign routing rules.", + "Erlang edge service generating real-time redirect decisions for tracking links based on campaign routing, geo rules, and cap logic.", summary: - "High-performance edge service responsible for handling affiliate tracking links and routing traffic based on campaign rules. Deployed on disposable VPS nodes with DNS tracking domains pointed to these nodes.", + "High-performance edge service responsible for handling affiliate tracking links and routing traffic based on campaign rules. It sat close to incoming HTTP traffic and turned campaign configuration into live redirect behavior.", tech_used: [ "Erlang/OTP", - "DNS", "HTTP", + "DNS", "VPS Infrastructure" ], architecture: [ - "Erlang service deployed on disposable VPS nodes", - "DNS tracking domains pointed to these nodes", - "Nodes retrieved campaign configuration from backend services", - "Redirect responses generated in real time" + "Erlang service deployed on tracking edge nodes close to incoming traffic", + "Tracking domains routed HTTP requests into the service", + "Nodes pulled campaign configuration and routing rules from backend systems", + "Redirect responses were generated in real time based on live business logic" ], responsibilities: [ "Campaign routing", @@ -2315,15 +2580,21 @@ defmodule RevstackWeb.WhoamiLive do phase: 2, icon: "hero-circle-stack", card_copy: - "Distributed pipeline ingesting click, impression, and conversion events into Cassandra and Elasticsearch, powering real-time analytics and report aggregation.", + "Distributed ingestion and indexing pipeline feeding partner analytics, reporting, and downstream aggregation from raw traffic events.", summary: - "Distributed event pipeline responsible for ingesting click, impression, and conversion events and powering analytics and reporting across the affiliate network.", + "Distributed event pipeline responsible for ingesting click, impression, and conversion events and turning them into the analytics and reports used throughout the affiliate platform.", tech_used: [ "Cassandra", - "Elasticsearch", "RabbitMQ", + "Elasticsearch/OpenSearch", "Apache Spark" ], + architecture: [ + "RabbitMQ buffered and distributed event work between services", + "Cassandra stored high-volume event data for long-term analysis", + "Search and analytics infrastructure powered detailed reporting views", + "Spark aggregation jobs transformed raw data into reporting-friendly datasets" + ], responsibilities: [ "Event ingestion", "Traffic logging", @@ -2332,8 +2603,8 @@ defmodule RevstackWeb.WhoamiLive do "Export dataset generation" ], scale: [ - "~150\u2013250 peak events per second", - "Multi-terabyte traffic datasets" + "1.5M+ daily events across click, impression, and conversion paths", + "High-volume analytics and reporting workloads running continuously" ], timeline_order: 4 }, @@ -2345,9 +2616,9 @@ defmodule RevstackWeb.WhoamiLive do phase: 2, icon: "hero-paper-airplane", card_copy: - "Reliable server-to-server callback delivery system handling conversion notifications with retry logic, macro substitution, and delivery tracking.", + "Reliable server-to-server callback delivery system with retry logic, macro substitution, delivery tracking, and failure handling.", summary: - "Reliable delivery system for advertiser and affiliate conversion callbacks. Handles server-to-server conversion notifications with retries, macro substitution, and failure tracking.", + "Reliable delivery system for advertiser and affiliate conversion callbacks. It handled server-to-server notifications, retry behavior, macro substitution, and tracking around partner delivery failures.", tech_used: [ "RabbitMQ", "Erlang Worker Pools", @@ -2365,16 +2636,18 @@ defmodule RevstackWeb.WhoamiLive do %{ id: "tracking-domain-infra", title: "Tracking Domain Infrastructure", - tagline: "Infrastructure for managing tracking domains and routing configuration", + tagline: + "Domain, SSL, and routing infrastructure behind tracking links and redirect services", period_label: "Infrastructure", phase: 2, icon: "hero-globe-alt", card_copy: - "Managed tracking domain lifecycle including SSL certificates, DNS routing, and domain rotation experiments to reduce blacklist risk.", + "Managed the lifecycle of tracking domains, SSL certificates, routing configuration, and domain rotation experiments.", summary: - "Infrastructure responsible for managing tracking domains and routing configuration. Handled domain lifecycle, SSL certificates, and DNS routing across the affiliate network.", + "Infrastructure responsible for managing tracking domains and routing configuration. It handled the DNS and SSL layer that allowed tracking services to operate cleanly and evolve over time.", tech_used: [ - "Routing Configuration + DNS", + "DNS", + "HTTP", "SSL/TLS + letsencrypt", "Domain Management" ], @@ -2395,20 +2668,20 @@ defmodule RevstackWeb.WhoamiLive do phase: 2, icon: "hero-server-stack", card_copy: - "Operated a 6-node Cassandra cluster, 3-node Elasticsearch cluster, Spark aggregation jobs, and RabbitMQ pipelines supporting ~600TB of combined data.", + "Operated the core data layer behind the platform, including Cassandra, analytics infrastructure, Spark jobs, and RabbitMQ pipelines.", summary: - "Large-scale data storage and analytics infrastructure supporting event ingestion and reporting across the affiliate network platform.", + "Large-scale data storage and analytics infrastructure supporting event ingestion and reporting across the affiliate platform.", tech_used: [ "Cassandra", - "Elasticsearch", + "Elasticsearch/OpenSearch", "Apache Spark (Scala)", "RabbitMQ" ], architecture: [ "Cassandra cluster (6 nodes) for high-throughput event storage", - "Elasticsearch analytics cluster (3 nodes) for search and reporting", - "Spark aggregation jobs for batch processing", - "Ingested RabbitMQ messages via Erlang worker services for real-time processing" + "Search and analytics infrastructure for detailed reporting", + "Spark aggregation jobs for batch processing and reporting dataset generation", + "RabbitMQ-fed services for near-real-time downstream processing" ], responsibilities: [ "High-throughput event ingestion", @@ -2417,10 +2690,8 @@ defmodule RevstackWeb.WhoamiLive do "Reporting aggregation" ], scale: [ - "~600TB Cassandra data footprint", - "~600TB Elasticsearch analytics dataset", "6-node Cassandra production cluster", - "3-node Elasticsearch cluster" + "Large reporting and analytics workloads across raw and aggregated event data" ], timeline_order: 7 } @@ -2439,6 +2710,7 @@ defmodule RevstackWeb.WhoamiLive do "Postgres", "RabbitMQ", "Elasticsearch", + "Elasticsearch/OpenSearch", "OpenSearch", "Apache Spark", "AWS", diff --git a/priv/resume/kyle-neal-resume.pdf b/priv/resume/kyle-neal-resume.pdf index 3f85605..6e323e1 100644 Binary files a/priv/resume/kyle-neal-resume.pdf and b/priv/resume/kyle-neal-resume.pdf differ diff --git a/test/revstack_web/layouts_user_menu_test.exs b/test/revstack_web/layouts_user_menu_test.exs index 63afa1c..79d8070 100644 --- a/test/revstack_web/layouts_user_menu_test.exs +++ b/test/revstack_web/layouts_user_menu_test.exs @@ -35,6 +35,6 @@ defmodule RevstackWeb.LayoutsUserMenuTest do test "whoami page includes the admin panel project card", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/whoami") - assert has_element?(view, "button#project-admin", "Admin Dashboard (for this site!)") + assert has_element?(view, "button#project-admin", "Revstack Admin Dashboard") end end diff --git a/test/revstack_web/whoami_live_career_modal_test.exs b/test/revstack_web/whoami_live_career_modal_test.exs index dc71647..3843052 100644 --- a/test/revstack_web/whoami_live_career_modal_test.exs +++ b/test/revstack_web/whoami_live_career_modal_test.exs @@ -41,6 +41,34 @@ defmodule RevstackWeb.WhoamiLiveCareerModalTest do assert has_element?(view, "button[phx-click='open_career_modal']") end + test "phase two highlights flagship systems and groups supporting systems beneath them", %{ + conn: conn + } do + {:ok, view, _html} = live(conn, ~p"/") + + view + |> element("button[phx-click='expand_career_phase'][phx-value-phase-id='phase-2']") + |> render_click() + + assert has_element?(view, "#career-featured-phase-2") + + assert has_element?( + view, + "#career-project-card-affiliate-network-platform", + "Affiliate Marketing Platform" + ) + + assert has_element?(view, "#career-project-card-netadmin-platform", "NetAdmin") + assert has_element?(view, "#career-group-tracking-attribution") + assert has_element?(view, "#career-group-analytics-reporting") + + assert has_element?( + view, + "#career-project-list-edge-redirect-service", + "Tracking Edge Service" + ) + end + test "collapsing a phase hides project cards", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/") @@ -80,6 +108,21 @@ defmodule RevstackWeb.WhoamiLiveCareerModalTest do assert has_element?(view, "#career-portfolio-modal") end + test "featured affiliate platform card opens the modal from phase two", %{conn: conn} do + {:ok, view, _html} = live(conn, ~p"/") + + view + |> element("button[phx-click='expand_career_phase'][phx-value-phase-id='phase-2']") + |> render_click() + + view + |> element("#career-project-card-affiliate-network-platform") + |> render_click() + + assert has_element?(view, "#career-portfolio-modal") + assert has_element?(view, "h4", "Affiliate Marketing Platform") + end + test "modal has phx-hook LockBodyScroll for scroll locking", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/") diff --git a/test/revstack_web/whoami_live_layout_test.exs b/test/revstack_web/whoami_live_layout_test.exs index 58466f5..0d58d69 100644 --- a/test/revstack_web/whoami_live_layout_test.exs +++ b/test/revstack_web/whoami_live_layout_test.exs @@ -24,8 +24,30 @@ defmodule RevstackWeb.WhoamiLiveLayoutTest do test "renders role title and skill signature", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/") - assert has_element?(view, "#whoami-role-title") - assert has_element?(view, "#whoami-skill-signature") + assert has_element?(view, "#whoami-role-title", "Lead Distributed Systems Engineer") + assert has_element?(view, "#whoami-skill-signature", "1.5M+ events/day") + end + + test "hero surfaces recruiter-facing fit and proof points without a stat grid", %{conn: conn} do + {:ok, view, _html} = live(conn, ~p"/") + + assert has_element?(view, "#whoami-role-fit", "Staff Backend Engineer") + assert has_element?(view, "#whoami-role-fit", "Technical Lead Who Still Codes") + assert has_element?(view, "#whoami-proof-points", "1.5M+") + + assert has_element?( + view, + "#whoami-proof-points", + "events/day processed by systems I've built" + ) + + assert has_element?(view, "#whoami-proof-points", "~25%") + + assert has_element?( + view, + "#whoami-proof-points", + "infrastructure cost reduction through workflow and scaling improvements" + ) end end @@ -46,8 +68,8 @@ defmodule RevstackWeb.WhoamiLiveLayoutTest do test "renders leadership items within the combined section", %{conn: conn} do {:ok, _view, html} = live(conn, ~p"/") - assert html =~ "Architecture ownership" - assert html =~ "Scaled platforms" + assert html =~ "Long-term ownership of revenue-critical backend platforms" + assert html =~ "Reduced infrastructure operating costs by ~25%" assert html =~ "leadership-teamwork" end end diff --git a/test/revstack_web/whoami_live_projects_test.exs b/test/revstack_web/whoami_live_projects_test.exs index a59f5b0..877c04f 100644 --- a/test/revstack_web/whoami_live_projects_test.exs +++ b/test/revstack_web/whoami_live_projects_test.exs @@ -82,39 +82,85 @@ defmodule RevstackWeb.WhoamiLiveProjectsTest do html = render(view) - assert html =~ "5 backend" - assert html =~ "3 DevOps engineers" - assert html =~ "sole owner" - assert html =~ "self-managed unit" + assert html =~ "long-term owner of backend architecture" + assert html =~ "CTO on business rules" + assert html =~ "3 infrastructure engineers" + assert html =~ "~25%" end end describe "professional experience emphasis" do - test "renders the demand outcome sentence in bold", %{conn: conn} do + test "keeps Ionik concise on the surface with recruiter-facing proof points", %{conn: conn} do + {:ok, view, _html} = live(conn, ~p"/whoami") + + assert has_element?(view, "#experience-ionik", "Ionik (formerly VeriAS)") + assert has_element?(view, "#experience-ionik", "NetAdmin") + assert has_element?(view, "#experience-ionik", "$2.5M+ monthly revenue") + assert has_element?(view, "#experience-ionik", "6-node Cassandra event store") + + assert has_element?( + view, + "#experience-ionik-toggle[aria-expanded='false']", + "Show full scope" + ) + + refute has_element?(view, "#experience-ionik-details") + end + + test "expands Ionik experience details on click", %{conn: conn} do + {:ok, view, _html} = live(conn, ~p"/whoami") + + view + |> element("#experience-ionik-toggle") + |> render_click() + + assert has_element?( + view, + "#experience-ionik-toggle[aria-expanded='true']", + "Hide full scope" + ) + + assert has_element?(view, "#experience-ionik-details li", "1.5M+ events daily") + assert has_element?(view, "#experience-ionik-details li", "NetAdmin") + + view + |> element("#experience-ionik-toggle") + |> render_click() + + refute has_element?(view, "#experience-ionik-details") + end + + test "surfaces the handyman demand outcome before founder details are expanded", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/whoami") assert has_element?( view, - "strong.experience-emphasis", - "The platform ultimately generated more inbound demand than the business could operationally support." + "#experience-revenuelink strong.experience-emphasis", + "Hardcore Handyman generated more inbound demand than the business could operationally support." ) + + refute has_element?(view, "#experience-revenuelink-details") end - test "renders handyman SEO and implementation details in founder experience", %{ + test "renders handyman SEO and implementation details after founder card expansion", %{ conn: conn } do {:ok, view, _html} = live(conn, ~p"/whoami") + view + |> element("#experience-revenuelink-toggle") + |> render_click() + assert has_element?( view, - "li", - "the system included SEO-driven service pages, conversion-focused design" + "#experience-revenuelink-details li", + "SEO-driven service pages, a quote workflow with photo uploads" ) assert has_element?( view, - "li", - "Built with Elixir, Phoenix LiveView, and Ecto" + "#experience-revenuelink-details li", + "consulting, hands-on product work" ) end end