diff --git a/generate.scm b/generate.scm index c5d37c8..bf2287c 100644 --- a/generate.scm +++ b/generate.scm @@ -18,8 +18,8 @@ ;; ─── Individual cards (all become flat children of .columns) ────────────────── -;; Project card — detail bullets revealed on hover (desktop) or click (mobile) -(define (render-project proj) +;; Work-experience project card — bullet summary + hover-reveal detail bullets +(define (render-work-project proj) `(div (@ (class "project-card") (onclick "this.classList.toggle('open')")) (div (@ (class "project-header")) @@ -31,6 +31,27 @@ ,(bullets (field proj 'detail-bullets))) ,(tech-list (field proj 'technologies)))) +;; Hobby/personal project card — sentence summary + hover-reveal links +(define (render-project proj) + (let* ((links (field proj 'detail-links)) + (has-links (and (pair? links) (> (length links) 0)))) + `(div (@ (class "project-card") + ,@(if has-links '((onclick "this.classList.toggle('open')")) '())) + (div (@ (class "project-header")) + (span (@ (class "project-name")) ,(field proj 'name)) + ,(date-range (field proj 'date-start) (field proj 'date-end))) + (p (@ (class "project-summary")) ,(field proj 'summary)) + ,(if has-links + `(div (@ (class "project-details")) + (ul ,@(map (lambda (link) + `(li (a (@ (href ,(cdr link)) + (target "_blank") + (rel "noopener")) + ,(car link)))) + links))) + '(span)) + ,(tech-list (field proj 'technologies))))) + ;; Title card: blurb only, no projects nested inside. ;; Projects are emitted as siblings after the title card. (define (render-title-card tc) @@ -43,11 +64,11 @@ (p (@ (class "title-blurb")) ,(string-join (field tc 'blurb) " ")))) -;; Emit a title card followed by its project cards as a flat list of siblings +;; Emit a title card followed by its work-project cards as a flat list of siblings (define (render-title-flat tc) (append (list (render-title-card tc)) - (map render-project (field tc 'projects)))) + (map render-work-project (field tc 'projects)))) (define (render-education edu) `(div (@ (class "education-card") diff --git a/resume.html b/resume.html index a1773dc..fec0321 100644 --- a/resume.html +++ b/resume.html @@ -1,2 +1,2 @@ -Jane Doe

Jane Doe

Springfield, USAjane@example.com

Education

Bachelor of Science in Computer ScienceAug 2011 – Dec 2016
The University of Georgia • Athens, GA
  • Graduated December 2016
  • ICPC Participant and Meeting Coordinator
  • WUOG 90.5 FM — Radio DJ and Operations Staff Member
  • UGA Game Development Club — founding member
  • Intramural soccer and volleyball

Work Experience

Full-Stack EngineerJul 2017 – Dec 2019
Startup XYZ • Athens, GA

Built product features across the React frontend and Node.js backend, maintained CI/CD pipelines and AWS infrastructure, and collaborated directly with design and product teams.

Real-Time DashboardFeb 2019 – Dec 2019
  • Delivered a live analytics dashboard processing 50k events/s.
  • Replaced polling with WebSocket fan-out, cutting server load by 60%.
  • Implemented client-side time-series aggregation using D3.js.
  • Added user-configurable alert thresholds stored in IndexedDB.
  • React
  • Node.js
  • WebSockets
  • D3.js
  • AWS
Senior Software EngineerJun 2022 – Present
Acme Corp • Remote

Led a team of 4 engineers on the core platform, driving adoption of internal developer tooling and mentoring junior engineers through architecture proposals and code review.

Distributed Config ServiceMar 2023 – Present
  • Built a Raft-based distributed config store used by 40+ services.
  • Designed the consensus layer using a custom Raft implementation in Go.
  • Added multi-region replication with conflict-free merge semantics.
  • Reduced config propagation time from ~30 s to <500 ms p99.
  • Go
  • Raft
  • gRPC
  • Kubernetes
  • Prometheus
Developer PortalJun 2022 – Feb 2023
  • Unified internal service catalogue and runbook search into one portal.
  • Indexed 300+ services via OpenAPI scraping and custom metadata YAML.
  • Built a fuzzy-search backend in Go backed by Bleve.
  • Reduced mean time-to-runbook from ~8 min to <30 s.
  • Go
  • Bleve
  • React
  • OpenAPI
Software Engineer IIJan 2020 – May 2022
Acme Corp • Remote

Owned the authentication service end-to-end, reducing API latency by 35% through targeted caching improvements.

Auth Service RewriteJan 2020 – Dec 2020
  • Rewrote legacy PHP auth service in Go; cut p99 latency from 800 ms to 40 ms.
  • Migrated 12 M users with zero downtime using a dual-write/dark-read strategy.
  • Introduced PKCE OAuth 2.0 flow replacing home-grown session tokens.
  • Added comprehensive integration test suite with 92% coverage.
  • Go
  • PostgreSQL
  • Redis
  • OAuth2
  • Docker
Rate Limiting LayerFeb 2021 – May 2022
  • Implemented token-bucket rate limiting across all public API endpoints.
  • Built as a gRPC interceptor; config hot-reloaded from the config service.
  • Reduced abusive traffic incidents by 80% in the first quarter after launch.
  • Added per-tenant override rules managed via an internal admin UI.
  • Go
  • gRPC
  • Redis
  • React

Projects

schemeresumeAug 2026 – Present
  • A resume generator written in Scheme that produces HTML via SXML.
  • Defined a small DSL for resume data in resume.scm.
  • generate.scm walks the data and emits SXML serialised to HTML.
  • CSS handles all layout including the two-column split.
  • Scheme
  • SXML
  • HTML
  • CSS
Tiny Lisp InterpreterJan 2025 – Mar 2025
  • A 600-line Lisp interpreter in Python supporting tail-call optimisation.
  • Implemented environments as linked frames, closures, and a macro expander.
  • Added a REPL with readline history and pretty-printing.
  • Python
  • Lisp

Interests

Open-SourceRegular contributor to Guile and Chicken Scheme ecosystem libraries.
Rock ClimbingSport climber; currently projecting 5.12a outdoors.
Technical WritingBlog at janedoe.dev — compilers, distributed systems, functional programming.

Favorite Software

Guile SchemeEmacsNeovimNixGuixTailscaleWireGuardmpvzathuratmuxAlacrittySyncthingBspwmRofi
+Jane Doe

Jane Doe

Springfield, USAjane@example.com

Education

Bachelor of Science in Computer ScienceAug 2011 – Dec 2016
The University of Georgia • Athens, GA
  • Graduated December 2016
  • ICPC Participant and Meeting Coordinator
  • WUOG 90.5 FM — Radio DJ and Operations Staff Member
  • UGA Game Development Club — founding member
  • Intramural soccer and volleyball

Work Experience

Full-Stack EngineerJul 2017 – Dec 2019
Startup XYZ • Athens, GA

Built product features across the React frontend and Node.js backend, maintained CI/CD pipelines and AWS infrastructure, and collaborated directly with design and product teams.

Real-Time DashboardFeb 2019 – Dec 2019
  • Live analytics dashboard processing 50k events/s via WebSocket fan-out.
  • Replaced polling, cutting server load by 60%.
  • User-configurable alert thresholds stored in IndexedDB.
  • React
  • Node.js
  • WebSockets
  • D3.js
  • AWS
Senior Software EngineerJun 2022 – Present
Acme Corp • Remote

Led a team of 4 engineers on the core platform, driving adoption of internal developer tooling and mentoring junior engineers through architecture proposals and code review.

Distributed Config ServiceMar 2023 – Present
  • Raft-based distributed config store serving 40+ services with <500 ms p99 propagation.
  • Designed consensus layer with custom Raft in Go.
  • Added multi-region replication with conflict-free merge semantics.
  • Reduced config propagation from ~30 s to <500 ms p99.
  • Go
  • Raft
  • gRPC
  • Kubernetes
  • Prometheus
Developer PortalJun 2022 – Feb 2023
  • Unified internal service catalogue and runbook search; cut time-to-runbook from 8 min to <30 s.
  • Indexed 300+ services via OpenAPI scraping.
  • Built fuzzy-search backend in Go with Bleve.
  • Go
  • Bleve
  • React
  • OpenAPI
Software Engineer IIJan 2020 – May 2022
Acme Corp • Remote

Owned the authentication service end-to-end, reducing API latency by 35% through targeted caching improvements.

Auth Service RewriteJan 2020 – Dec 2020
  • Rewrote legacy PHP auth service in Go; cut p99 latency 800 ms → 40 ms.
  • Migrated 12 M users with zero downtime via dual-write/dark-read.
  • Introduced PKCE OAuth 2.0 replacing home-grown session tokens.
  • Go
  • PostgreSQL
  • Redis
  • OAuth2
  • Docker
Rate Limiting LayerFeb 2021 – May 2022
  • Token-bucket rate limiting across all public API endpoints; reduced abusive traffic by 80%.
  • Built as a gRPC interceptor with hot-reloaded config.
  • Added per-tenant override rules via internal admin UI.
  • Go
  • gRPC
  • Redis
  • React

Projects

schemeresumeAug 2026 – Present

Resume generator written in Scheme; data as S-expressions, rendered to HTML via SXML.

  • Scheme
  • SXML
  • HTML
  • CSS
Tiny Lisp InterpreterJan 2025 – Mar 2025

600-line Lisp interpreter in Python with tail-call optimisation, closures, and a macro expander.

  • Python
  • Lisp

Interests

Open-SourceRegular contributor to Guile and Chicken Scheme ecosystem libraries.
Rock ClimbingSport climber; currently projecting 5.12a outdoors.
Technical WritingBlog at janedoe.dev — compilers, distributed systems, functional programming.

Favorite Software

Guile SchemeEmacsNeovimNixGuixTailscaleWireGuardmpvzathuratmuxAlacrittySyncthingBspwmRofi
diff --git a/resume.scm b/resume.scm index c6136cf..b316847 100644 --- a/resume.scm +++ b/resume.scm @@ -8,15 +8,25 @@ (cons 'email email) (cons 'location location))) -(define (make-project name date-start date-end summary-bullets detail-bullets technologies . rest) - (list 'project +;; Work-experience project: bullet summary + hover-reveal detail bullets +(define (make-work-project name date-start date-end summary-bullets detail-bullets technologies) + (list 'work-project (cons 'name name) (cons 'date-start date-start) (cons 'date-end date-end) (cons 'summary-bullets summary-bullets) (cons 'detail-bullets detail-bullets) - (cons 'technologies technologies) - (cons 'url (if (null? rest) #f (car rest))))) + (cons 'technologies technologies))) + +;; Hobby/personal project: sentence summary + hover-reveal (label . url) links +(define (make-project name date-start date-end summary detail-links technologies) + (list 'project + (cons 'name name) + (cons 'date-start date-start) + (cons 'date-end date-end) + (cons 'summary summary) + (cons 'detail-links detail-links) + (cons 'technologies technologies))) ;; Title card: lives inside a job card ;; blurb – responsibility bullets @@ -93,37 +103,34 @@ "Senior Software Engineer" "Acme Corp" "Remote" "Jun 2022" "Present" '("Led a team of 4 engineers on the core platform, driving adoption of internal developer tooling and mentoring junior engineers through architecture proposals and code review.") (list - (make-project + (make-work-project "Distributed Config Service" "Mar 2023" "Present" - '("Built a Raft-based distributed config store used by 40+ services.") - '("Designed the consensus layer using a custom Raft implementation in Go." + '("Raft-based distributed config store serving 40+ services with <500 ms p99 propagation.") + '("Designed consensus layer with custom Raft in Go." "Added multi-region replication with conflict-free merge semantics." - "Reduced config propagation time from ~30 s to <500 ms p99.") + "Reduced config propagation from ~30 s to <500 ms p99.") '("Go" "Raft" "gRPC" "Kubernetes" "Prometheus")) - (make-project + (make-work-project "Developer Portal" "Jun 2022" "Feb 2023" - '("Unified internal service catalogue and runbook search into one portal.") - '("Indexed 300+ services via OpenAPI scraping and custom metadata YAML." - "Built a fuzzy-search backend in Go backed by Bleve." - "Reduced mean time-to-runbook from ~8 min to <30 s.") + '("Unified internal service catalogue and runbook search; cut time-to-runbook from 8 min to <30 s.") + '("Indexed 300+ services via OpenAPI scraping." + "Built fuzzy-search backend in Go with Bleve.") '("Go" "Bleve" "React" "OpenAPI")))) (make-title "Software Engineer II" "Acme Corp" "Remote" "Jan 2020" "May 2022" '("Owned the authentication service end-to-end, reducing API latency by 35% through targeted caching improvements.") (list - (make-project + (make-work-project "Auth Service Rewrite" "Jan 2020" "Dec 2020" - '("Rewrote legacy PHP auth service in Go; cut p99 latency from 800 ms to 40 ms.") - '("Migrated 12 M users with zero downtime using a dual-write/dark-read strategy." - "Introduced PKCE OAuth 2.0 flow replacing home-grown session tokens." - "Added comprehensive integration test suite with 92% coverage.") + '("Rewrote legacy PHP auth service in Go; cut p99 latency 800 ms → 40 ms.") + '("Migrated 12 M users with zero downtime via dual-write/dark-read." + "Introduced PKCE OAuth 2.0 replacing home-grown session tokens.") '("Go" "PostgreSQL" "Redis" "OAuth2" "Docker")) - (make-project + (make-work-project "Rate Limiting Layer" "Feb 2021" "May 2022" - '("Implemented token-bucket rate limiting across all public API endpoints.") - '("Built as a gRPC interceptor; config hot-reloaded from the config service." - "Reduced abusive traffic incidents by 80% in the first quarter after launch." - "Added per-tenant override rules managed via an internal admin UI.") + '("Token-bucket rate limiting across all public API endpoints; reduced abusive traffic by 80%.") + '("Built as a gRPC interceptor with hot-reloaded config." + "Added per-tenant override rules via internal admin UI.") '("Go" "gRPC" "Redis" "React"))))))) (define job-startup @@ -134,12 +141,11 @@ "Full-Stack Engineer" "Startup XYZ" "Athens, GA" "Jul 2017" "Dec 2019" '("Built product features across the React frontend and Node.js backend, maintained CI/CD pipelines and AWS infrastructure, and collaborated directly with design and product teams.") (list - (make-project + (make-work-project "Real-Time Dashboard" "Feb 2019" "Dec 2019" - '("Delivered a live analytics dashboard processing 50k events/s.") - '("Replaced polling with WebSocket fan-out, cutting server load by 60%." - "Implemented client-side time-series aggregation using D3.js." - "Added user-configurable alert thresholds stored in IndexedDB.") + '("Live analytics dashboard processing 50k events/s via WebSocket fan-out.") + '("Replaced polling, cutting server load by 60%." + "User-configurable alert thresholds stored in IndexedDB.") '("React" "Node.js" "WebSockets" "D3.js" "AWS"))))))) (define my-education @@ -159,19 +165,14 @@ (list (make-project "schemeresume" "Aug 2026" "Present" - '("A resume generator written in Scheme that produces HTML via SXML.") - '("Defined a small DSL for resume data in resume.scm." - "generate.scm walks the data and emits SXML serialised to HTML." - "CSS handles all layout including the two-column split.") - '("Scheme" "SXML" "HTML" "CSS") - "https://github.com/janedoe/schemeresume") + "Resume generator written in Scheme; data as S-expressions, rendered to HTML via SXML." + '(("GitHub" . "https://github.com/janedoe/schemeresume")) + '("Scheme" "SXML" "HTML" "CSS")) (make-project "Tiny Lisp Interpreter" "Jan 2025" "Mar 2025" - '("A 600-line Lisp interpreter in Python supporting tail-call optimisation.") - '("Implemented environments as linked frames, closures, and a macro expander." - "Added a REPL with readline history and pretty-printing.") - '("Python" "Lisp") - "https://github.com/janedoe/tinylisp")))) + "600-line Lisp interpreter in Python with tail-call optimisation, closures, and a macro expander." + '(("GitHub" . "https://github.com/janedoe/tinylisp")) + '("Python" "Lisp"))))) (define my-interests (make-interests diff --git a/style.css b/style.css index 2e40b57..4982c6c 100644 --- a/style.css +++ b/style.css @@ -166,13 +166,19 @@ p.title-blurb { .project-name { font-size: 0.72rem; } -.project-summary ul { padding-left: 12px; margin-top: 2px; } -.project-summary li { +p.project-summary { + font-size: 0.68rem; + line-height: 1.5; + color: rgba(255,255,255,0.85); + margin-top: 2px; +} + +div.project-summary ul { list-style: disc; padding-left: 14px; margin-top: 2px; } +div.project-summary li { font-size: 0.68rem; line-height: 1.5; color: rgba(255,255,255,0.85); } -.project-summary li::before { content: "• "; color: var(--muted); } .project-details { max-height: 0; @@ -198,14 +204,19 @@ p.title-blurb { .education-card:hover .edu-extras { max-height: 0; opacity: 0; margin-top: 0; } .education-card.open .edu-extras { max-height: 400px; opacity: 1; margin-top: 4px; } } -.project-details ul { padding-left: 12px; margin-top: 4px; } +.project-details ul { list-style: disc; padding-left: 14px; margin-top: 4px; } .project-details li { font-size: 0.68rem; color: var(--muted); line-height: 1.5; - margin-bottom: 1px; + margin-bottom: 2px; } -.project-details li::before { content: "• "; } +.project-details li a { + color: var(--accent); + text-decoration: underline; + text-underline-offset: 2px; +} +.project-details li a:hover { opacity: 0.8; } .tech-list { display: flex;