Commit Graph

24 Commits

Author SHA1 Message Date
soroush.asadi 255e8d25e5 Humanize all Persian copy across the site
deploy / deploy (push) Successful in 24s
Rewrite the FA strings sitewide in natural, human Persian (English unchanged),
removing translation calques like «معمار راهکار», «هوش مصنوعی تولیدی»,
«موارد کاربری», «چرخه‌های هیجان», «استقرار در تولید», «محیط تولید».

Covers: hero, services, pipeline, stack, expertise, portfolio, blog, contact
(Index), nav/meta/footer (_Layout), the /blog list + per-post FA titles
(BlogIndexModel, PostModel). Also removed two stray English em-dashes in the
blog excerpts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 03:50:21 +03:30
soroush.asadi 29b5f07ebf Humanize Persian hero copy
deploy / deploy (push) Successful in 24s
The FA hero read as machine-translated calque. Replace with natural Persian:
- subhead: «هوش مصنوعی‌ای می‌سازم که فقط روی کاغذ نمی‌ماند؛ از طراحی تا اجرا، در مقیاس سازمانی.»
- role: «مهندس هوش مصنوعی و معمار نرم‌افزار.» (was the calque «معمار راهکار»)

English copy unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 03:32:53 +03:30
soroush.asadi b721f01e14 Replace placeholder portfolio with real projects
deploy / deploy (push) Successful in 24s
Swap the fabricated case studies (Atlas/Sentinel/etc. with invented metrics)
for the four real shipped products, each linking to its live site:

- Hamkadr (hamkadr.ir) - healthcare staffing marketplace
- Meezi (meezi.ir) - cafe/restaurant management SaaS
- Barge Vasat (bargevasat.ir) - online Hokm card game
- Flatrender (flatrender.ir) - AI video/image studio

Cards are now external links (2x2 grid), no invented numbers or clients.
Regenerated the purged Tailwind bundle for the new classes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 03:20:52 +03:30
soroush.asadi 33efeac98f Replace Tailwind Play CDN with a prebuilt, purged stylesheet
deploy / deploy (push) Successful in 37s
The runtime CDN (cdn.tailwindcss.com) is not production-grade: FOUC, no
purging, and an external request that is slow/blocked from some networks.

- Add Tailwind v3 build (package.json `npm run build`) with two scoped configs:
  public (accent + zinc) -> wwwroot/css/tailwind.css, and admin (dark base/
  electric/violet/emerald, separate to avoid the emerald flat-vs-scale clash)
  -> wwwroot/css/tailwind-admin.css. Both minified + content-purged.
- Layouts now link the built CSS instead of the CDN script; built artifacts
  are committed so Docker/CI need no Node step. node_modules stays ignored.
- Verified: utilities (incl. arbitrary values like aspect-[16/9], grid-cols-
  [8rem_1fr]) resolve; public + admin render; no console errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 03:06:24 +03:30
soroush.asadi cfff934bdd Fix SQLite advisory: bump SQLitePCLRaw to 3.0.x
The transitive SQLitePCLRaw.lib.e_sqlite3 2.1.11 (via EF Core 10 Sqlite) is
flagged High by GHSA-2m69-gcr7-jv3q, and the 2.x line has no patched release
(first_patched_version: null). Pin SQLitePCLRaw.bundle_e_sqlite3 3.0.3, which
is outside the vulnerable range (<= 2.1.11). Runtime-verified: EnsureCreated
and a DB read both succeed; `dotnet list package --vulnerable` is now clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 03:06:10 +03:30
soroush.asadi dd882287df Elevate public site UX: premium hero, motion, scrollspy, shared footer
deploy / deploy (push) Successful in 6m30s
Redesign-preserve pass on the light editorial theme (dials 7/5/3):

- Hero: live availability status, accent value-prop, role line, social row,
  staggered entrance
- Motion (all motivated, reduced-motion safe): CSS scroll-driven reading
  progress bar, scrollspy nav with animated underline, CTA/blog arrow nudges,
  service hover accent rule, portfolio cover scale, card lift
- Shared multi-column footer across home + blog (brand, nav, contact, social)
- Fix anchor scroll offset under the fixed navbar (scroll-margin-top)
- Wire real social: LinkedIn, Instagram, email (code.soroush@gmail.com)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 02:48:22 +03:30
soroush.asadi 5cc9ed976c Add logo mark and use it for nav, footer, and favicon
deploy / deploy (push) Successful in 24s
Geometric "S" monogram in a near-black rounded tile with a single #2563eb
accent dot at the bottom-left. Crisp from 16px (favicon) up. All references
already point to /logo-mark.svg, so nav, footer, and favicon update together.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 05:40:48 +03:30
soroush.asadi 97bd2a12df Redesign public site: minimal light editorial theme
deploy / deploy (push) Successful in 1m20s
Full design refactor of the public surface (home, blog, layout) using the
taste-skill anti-slop rules. Admin CMS is untouched.

- Single locked light theme: #fafafa bg, #18181b text, one accent #2563eb
- Syne headings + system body + Vazirmatn (fa); hairline rules, no glows/cards
- Remove AI tells: 5-colour palette, gradient text, neon glows, custom cursor,
  particle canvas, typewriter, scroll cue, per-section eyebrows, progress bars
- Replace window scroll listener with an IntersectionObserver sentinel
- 8 distinct section layouts; portfolio uses typographic covers (no broken imgs)
- Zero em-dashes in visible copy; fix relative-path-safe asset refs
- Add missing wwwroot/logo-mark.svg (was 404)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 05:16:06 +03:30
soroush.asadi a55c75b928 CI
deploy / deploy (push) Successful in 12s
2026-06-01 09:22:33 +03:30
soroush.asadi fcc476e432 Fix critical port conflict: move portfolio off Gitea's port 3000
deploy / deploy (push) Successful in 12s
Host port 3000 is Gitea (git.soroushasadi.com proxies to :3000). The
portfolio was publishing 3000:3000 AND the deploy had a "Free Port 3000"
step that force-removed every container on :3000 — which evicted the
Gitea container.

- compose: publish 3020:3000 instead of 3000:3000
- deploy: delete the "Free Port 3000" step entirely; compose recreates
  only our own named container and must never touch other stacks

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 08:43:23 +03:30
soroush.asadi e79d2d6108 Ignore stale Next.js build output (.next/, node_modules/)
deploy / deploy (push) Failing after 44m43s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 08:30:06 +03:30
soroush.asadi 059c67bf76 Fix deploy: free port 3000 by removing any container publishing it
The previous name-based stop only removed soroushasadi-site, but the
container holding :3000 can have a different name (old Next.js build or
an orphan from a previously-named compose project), so the bind kept
failing. Now we remove every container publishing :3000 by filter, then
also remove by our known name as a fallback.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 08:29:14 +03:30
soroush.asadi e5094b53ff Fix deploy: stop old container before starting new one
deploy / deploy (push) Failing after 2s
Port 3000 was already allocated by the previous container from the
Next.js era. --remove-orphans only removes containers within the same
compose project, so the old one survived. Explicitly stop+rm the named
container before docker compose up so the port is always free.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 08:17:11 +03:30
soroush.asadi f2d6300d72 Fix: rename Data/ to Database/ to avoid gitignore collision
deploy / deploy (push) Failing after 13s
.gitignore has '/data' which Windows git (case-insensitive) silently
matched '/Data/', so AppDbContext.cs was never committed and the Docker
build (Linux, case-sensitive) failed with CS0234 'Data' not found.
Renaming the directory to 'Database/' sidesteps the collision.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 08:00:54 +03:30
soroush.asadi 1b3a8b493e Rewrite: Next.js → ASP.NET Core 10 Razor Pages
deploy / deploy (push) Failing after 1m21s
Full rewrite of the portfolio site from Next.js 14 to .NET 10:

- ASP.NET Core 10 Razor Pages, no Node.js dependency
- EF Core 10 + SQLite (same schema as before — data survives upgrade)
- Cookie authentication (same single-password model)
- Resend contact form via HttpClient
- Bilingual FA/EN via locale cookie + BasePageModel
- All UI ported to Razor Pages with Tailwind CDN + custom CSS
- Vanilla JS: particles, typewriter, cursor, animations, portfolio modal
- Dockerfile: SDK 10.0-alpine → aspnet 10.0-alpine (no npm/Node needed)
- CI/CD: dropped NPM_TOKEN, ADMIN_SESSION_SECRET — pure dotnet publish

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 07:46:56 +03:30
soroush.asadi bcea9dc2f6 Bust npm ci cache, add post-install next verification
deploy / deploy (push) Failing after 1m17s
The npm ci layer was cached with a broken result (node_modules/next missing).
Changing the RUN command text invalidates that cache entry and forces a fresh
install. The added post-install check will show the exact npm ci error if next
is still missing, instead of failing silently.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:43:19 +03:30
soroush.asadi 213a9d4f1c Debug next not found: add diagnostic + use direct node invocation
deploy / deploy (push) Failing after 1s
Replace `npm run build` with `node node_modules/next/dist/bin/next build`
to bypass PATH/symlink resolution issues on Alpine. Also adds a diagnostic
`ls node_modules/.bin/next` so CI logs show whether the binary is present.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:35:48 +03:30
soroush.asadi b2ed75cf2d Fix build: collapse deps+builder, add libc6-compat
deploy / deploy (push) Failing after 3m16s
The cross-stage COPY --from=deps /app/node_modules caused
sh: next: not found in the builder stage. Fix by merging deps
and builder into one stage — npm ci and next build run in the
same layer so node_modules is always present when building.

Also add libc6-compat (required by Next.js SWC binaries on Alpine)
to both builder and runner stages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 15:17:07 +03:30
soroush.asadi 20e14d3a28 Fix base image: use mirror direct path, switch to node:20-alpine
deploy / deploy (push) Failing after 7m35s
Mirror exposes images as mirror.soroushasadi.com/<image> directly,
not via /repository/docker-group/ path. Also node:20-alpine is already
cached on the server; node:20-slim was never pulled.

Dockerfile: apk instead of apt-get, addgroup/adduser instead of
groupadd/useradd (Alpine BusyBox compatibility).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:46:05 +03:30
soroush.asadi 98e100557f fixed
deploy / deploy (push) Failing after 14s
2026-05-31 14:22:40 +03:30
soroush.asadi be658e9d77 Correct mirror hostname to soroushasadi.com, HTTP protocol
deploy / deploy (push) Failing after 11s
ci / build (pull_request) Failing after 5s
Previous commit introduced a typo (soroushasad vs soroushasadi).
All references now use:
  npm    -> http://mirror.soroushasadi.com/repository/npm-group/
  docker -> mirror.soroushasadi.com/repository/docker-group/  (no protocol in image refs)

Also restore Dockerfile ARG NPM_TOKEN + COPY .npmrc that were lost
when the soroush-cicd skill regenerated the file, and set the
NODE_IMAGE ARG default back to the mirror path.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 13:49:51 +03:30
soroush.asadi 13241612fe Fix mirror hostname and protocol (soroushasad.com, HTTP)
All references updated from mirror.soroushasadi.com (https) to
mirror.soroushasad.com (http):
  - .npmrc: registry uses http://
  - Dockerfile: syntax frontend + NODE_IMAGE ARG + npm auth line
  - docker-compose.yml: NODE_IMAGE default
  - deploy.yml: docker login/logout + NODE_IMAGE env
  - ci.yml: container image + NODE_IMAGE build-arg + npm auth line

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 13:47:18 +03:30
soroush.asadi 4caba29984 Fix port conflict, healthcheck, and mirror routing
deploy / deploy (push) Failing after 4s
docker-compose.yml:
- Add top-level name: soroushasadi so Compose uses a stable project name
  regardless of which temp directory the runner checks out into. Without
  this, each run gets a different project name and the old container is not
  recognised as an orphan — it stays bound to port 3000 and the new
  container fails to start.
- Fix healthcheck: wget is not in node:20-slim; use Node 20's built-in
  fetch instead.
- Set NODE_IMAGE default to the Nexus docker-group mirror.

Workflows:
- Add GIT_SSL_NO_VERIFY=true to checkout steps (self-signed cert on
  git.soroushasadi.com).
- Pass NODE_IMAGE to build step in deploy.
- Add git remote remove guard to CI checkout (prevents failure on
  second run in the same workspace).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 13:40:36 +03:30
soroush.asadi add78d8460 first commit
ci / build (push) Failing after 23s
deploy / deploy (push) Failing after 10m12s
2026-05-31 12:47:02 +03:30