28 Commits

Author SHA1 Message Date
3d4dd1a3b1 ci: add local pre-commit gitleaks hook
All checks were successful
CI / skip-ci-check (push) Successful in 10s
CI / secret-scan (push) Successful in 9s
CI / node-ci (push) Successful in 1m37s
2026-07-13 14:44:43 -05:00
2ac42e6fe4 Fix hero subtitle separator markup (#2)
All checks were successful
CI / skip-ci-check (push) Successful in 11s
CI / secret-scan (push) Successful in 8s
CI / node-ci (push) Successful in 1m44s
2026-07-12 10:27:16 -05:00
Builder
e077dec21b Sync Caddyfile.snippet with live edge config
All checks were successful
CI / skip-ci-check (push) Successful in 4s
CI / secret-scan (push) Successful in 3s
CI / node-ci (push) Successful in 44s
Edge (10.0.10.20) already uses the shared security-headers snippet and
a permanent (301) www redirect; the checked-in reference snippet had
drifted (302 redirect, no security headers, stale upstream IP).
2026-07-08 11:05:24 -04:00
Builder
10a72495db Merge remote CI bootstrap + Umami tracking
All checks were successful
CI / skip-ci-check (push) Successful in 17s
CI / secret-scan (push) Successful in 19s
CI / node-ci (push) Successful in 53s
2026-07-08 10:59:25 -04:00
Builder
e9d96a08e2 Add SEO baseline: robots.txt, sitemap.xml, canonical, OG/Twitter tags, JSON-LD
Also fixes a broken LinkedIn URL (/in/idobkin/ 404s; correct profile
is /in/ilia-dobkin-8263343/) that was referenced in the contact data.
2026-07-08 10:58:08 -04:00
67066d217a Merge pull request 'Add homelab Gitea Actions CI (generic)' (#1) from ci/bootstrap-gitea-actions-node into master
All checks were successful
CI / skip-ci-check (push) Successful in 9s
CI / secret-scan (push) Successful in 9s
CI / node-ci (push) Successful in 1m4s
Reviewed-on: #1
2026-05-29 20:38:39 -05:00
bac22f4192 ci: refresh workflow (re-run pipelines)
All checks were successful
CI / skip-ci-check (pull_request) Successful in 10s
CI / secret-scan (pull_request) Successful in 9s
CI / node-ci (pull_request) Successful in 1m11s
2026-05-29 20:31:14 -05:00
abe5053d62 ci: refresh workflow (re-run pipelines)
All checks were successful
CI / skip-ci-check (pull_request) Successful in 11s
CI / secret-scan (pull_request) Successful in 9s
CI / node-ci (pull_request) Successful in 1m16s
2026-05-29 20:28:49 -05:00
d0d7e32766 ci: sync workflow template
All checks were successful
CI / skip-ci-check (pull_request) Successful in 10s
CI / secret-scan (pull_request) Successful in 9s
CI / node-ci (pull_request) Successful in 1m11s
2026-05-29 20:26:30 -05:00
f2667c18fe ci: refresh workflow (re-run pipelines)
Some checks failed
CI / skip-ci-check (pull_request) Successful in 10s
CI / secret-scan (pull_request) Successful in 10s
CI / node-ci (pull_request) Failing after 1m8s
2026-05-29 20:20:56 -05:00
512aee523b ci: sync workflow template (node container + host fixes)
Some checks failed
CI / skip-ci-check (pull_request) Successful in 9s
CI / secret-scan (pull_request) Successful in 9s
CI / node-ci (pull_request) Failing after 1m13s
2026-05-29 20:15:17 -05:00
b9af290900 ci: add homelab Gitea Actions workflow (ci-node.yml)
Some checks failed
CI / skip-ci-check (pull_request) Failing after 7s
CI / secret-scan (pull_request) Has been skipped
CI / node-ci (pull_request) Has been skipped
2026-05-29 16:19:28 -05:00
root
3e81c655a4 Add Umami tracking via stats.levkin.ca 2026-05-22 20:18:59 +00:00
Builder
c7fa2e0f98 Fix dangling separator in hero subtitle on narrow Safari viewports
The " · " before test.describe() was orphaned when .mono became
display:block on mobile.  Wrap it in .hero__sub-sep and hide it at
≤900px.  Also tighten topbar padding at ≤480px for iPhone-mini widths.
Add a responsive test asserting the separator is hidden on mobile.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:45:28 -04:00
Builder
7a175a97e8 Add swipe gesture to cycle specs on mobile
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:38:02 -04:00
Builder
42ad9e869c Wrap long text and code blocks on mobile instead of clipping
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:35:16 -04:00
Builder
d4c78fd273 Fix mobile text overflow — hero subtitle, hint, summary stripe wrapping
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:33:22 -04:00
Builder
fb50e159ef Improve mobile responsiveness — touch targets, phone breakpoint, grid fixes
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:30:59 -04:00
Builder
23a90a7bd6 Update resume PDF
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:27:19 -04:00
Builder
0c343b6606 Fix resume PDF path after file rename
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:20:54 -04:00
Builder
6e5f21093d Remove setup-lxc.sh — container already provisioned
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:17:42 -04:00
Builder
4241129d94 Update portfolio content, resume, and add deploy scripts
- Location/work auth updates across data, HTML, and app
- Swap resume PDF to DobkinResume26
- Refresh experience bullets, projects, and skills
- Add deploy/ with Caddyfile snippet, LXC setup, and update scripts

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 16:15:10 -04:00
Builder
6f897fafb9 Add lint, typecheck, and html-validate guardrails
Tooling:
- ESLint 9 flat config (eslint.config.mjs) with three scopes:
  - browser vanilla JS for js/ (no modules, window globals)
  - Node ESM for scripts/
  - typescript-eslint for tests/ and *.ts
- Stylelint with a deliberately minimal "bug-only" ruleset
  (block-no-empty, color-no-invalid-hex, function-no-unknown,
  property-no-unknown, …) — no nags about compact handwritten CSS
- html-validate against index.html (DOCTYPE, accessible names,
  non-redundant ARIA roles, valid landmark usage)
- TypeScript --noEmit strict on playwright.config.ts + tests/*.ts

npm scripts:
- lint        — parallel run of lint:js, lint:css, lint:html (~3s)
- lint:js{,:fix}, lint:css{,:fix}, lint:html
- typecheck   — tsc --noEmit
- check       — lint + typecheck + test in parallel (CI entry point)

Fixes uncovered by the new checks:
- js/app.js: drop unused `activeTimers`, drop unused `t` lookup in
  refreshTreeRow, switch `activeTags` let→const, replace empty
  `catch(_)` blocks with parameter-less catch + intent comment
- js/data.js: drop unused index arg in renderExperience
- index.html: uppercase DOCTYPE, drop redundant role="banner" /
  role="contentinfo" on <header>/<footer>, add aria-labels on icon-only
  Stop / Reset buttons, add role="group" to the tag bar so its
  aria-label is valid, add explicit type="button" everywhere
- tests/portfolio.spec.ts: landmark test now uses getByRole() rather
  than the explicit [role="banner"] attribute selector

Housekeeping:
- .gitignore picks up .eslintcache / .stylelintcache / *.tsbuildinfo
- README documents the lint + check toolchain

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 23:06:42 -04:00
Builder
b596b2d608 Editor strip, Network/Console/Trace tabs, real Playwright tests, HC theme
UI:
- Editor tab strip above the report with per-spec scoping (sidebar tree,
  results, source, status counts, hero copy); cookie-persisted active spec
- Status pill + workers / headed overflow menu moved from topbar into the
  editor bar to slim the global chrome
- Summary stripe and pending-preview body so the report never lands empty
- Tag bar with first-6 + "+N more" + clear; auto-run first idle test on load
- Mobile drawer for the test explorer; keyboard shortcuts overlay (?)
- Skipped + failed sample tests with proper icons / step rendering

Tabs:
- Network tab: public git.levkin.ca repos rendered as Playwright-style
  GET ... 200 rows with expandable JSON bodies and repo links
- Trace tab: career timeline as a Gantt-style waterfall
- Console tab: live run events; Source tab regenerates per active spec

Theming:
- Wire up high-contrast (WCAG AAA) theme: cycle dark → light → hc → dark,
  widen theme cookie regex to accept "hc", add HC overrides for syntax
  tokens and a few hardcoded "text-on-accent" sites in app.css

Testing:
- Add @playwright/test dev dependency + playwright.config.ts on port 3173
- tests/portfolio.spec.ts: 37 specs across 12 describe blocks
- scripts/fetch-gitea-repos.mjs to refresh giteaRepos from the Gitea API

Docs / housekeeping:
- README rewritten to reflect editor strip, network tab, HC theme, test
  runner, and updated project structure
- IDEAS.md trimmed to remaining roadmap; shipped items removed
- .gitignore ignores stray PDFs at repo root (canonical resume in assets/)
- Add assets/ilia-dobkin-resume.pdf as the canonical resume binary

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 22:55:48 -04:00
Builder
7564148c3c Add README, IDEAS, and .gitignore 2026-05-11 00:25:09 +00:00
Builder
cfa5b0e4f9 Remove forbidden API references in comments 2026-05-10 23:57:49 +00:00
Builder
fb83aa491b Swap localStorage for cookie-based theme persistence 2026-05-10 23:57:40 +00:00
Builder
8894748179 Portfolio v1: Playwright runner UI 2026-05-10 23:57:19 +00:00