Skip to content

release: banuacoder v1.0.0#1

Merged
ryanaidilp merged 192 commits into
mainfrom
release/v1.0.0
May 29, 2026
Merged

release: banuacoder v1.0.0#1
ryanaidilp merged 192 commits into
mainfrom
release/v1.0.0

Conversation

@ryanaidilp
Copy link
Copy Markdown
Contributor

@ryanaidilp ryanaidilp commented May 29, 2026

Release: banuacoder v1.0.0

Changelog

✨ Features

  • feat(portfolio): add cektrans + tweak exit fade to fire only after edge crossing (167ca8f)
  • feat(404): add branded not-found page (0300036)
  • feat(portfolio): add MSP performance audit case study with embedded videos (abd0319)
  • feat(home): scroll storytelling for About decoration, Founder experience strip, final CTA (cce3397)
  • feat(home): testimonial quote reveals word-by-word as section enters (722187a)
  • feat(home): scroll storytelling for Services + Public Sector + revert cycle to repeating pattern (e3850ac)
  • feat(hero + footer): add Carwa as 5th product, swap Sikerja shots, PSE Komdigi badge (9e49df5)
  • feat(hero): auto-cycling product carousel — main rotates 4 BC products, back 3 supporting shots (e64e1c6)
  • feat(portfolio + founder): tech stack logos + Reku marquee for prior work (16ef0d5)
  • feat(portfolio): Play Store badges, Archipelago + Sikerja entries, Detexi/SIAP Donggala screenshots, year fixes (c4adbf4)
  • feat(zog): bare logos, white silhouette on dark, emerge from behind headline + add BPS (2448bd4)
  • feat(zog): add per-cell parallax drift to client logo cycle (01dacbe)
  • feat(zog): per-logo scatter cycle, process/ideal scroll-driven reveals, navbar auto-hide, fix portfolio reveal (c66efd9)
  • feat(zog): wire why-carousel into home pages (aac31a5)
  • feat(zog): build pinned why-banua-coder carousel (8037c16)
  • feat(zog): wire client logo cycle into home pages (7301d10)
  • feat(zog): build pinned client-logo cycle component (81cc3d2)
  • feat(logos): add brantas inti utama logo extracted from patonro splash (c309379)
  • feat(logos): add private brand logos (goto financial, reku, stockbit, ulearna) (1c51d31)
  • feat(logos): add indonesian government emblems (commons.wikimedia) (0adcdf5)
  • feat(m7): wire i18n alternates into sitemap (3d66e42)
  • feat(m7): preload critical fonts and set fetchpriority on lcp image (5f91835)
  • feat(m7): add breadcrumb schema to about/founder; expand person schema (b2f594b)
  • feat(m7): add itemlist schema on portfolio index (e7e82e2)
  • feat(m7): add faqpage schema on service detail pages with faqs (e8f3fd8)
  • feat(m7): add localbusiness schema on contact page (72243d4)
  • feat(m7): expand organization schema with sameAs, knowsAbout, areaServed (3a9b17b)
  • feat(m7): generate per-route og images at build time (4e0d325)
  • feat(m7): install satori + resvg-js and create build-time OG image generator (d752d1f)
  • feat(qw): tighten hero subheadline and trust strip claims for target-audience clarity (76f31a7)
  • feat(qw): wire client logo row onto home trust block for ID and EN (3ef6e59)
  • feat(m5.7): expand /founder with longer story and engineering philosophy (dae8888)
  • feat(m5.7): expand /about with our story, how we work, and why us sections (a1272eb)
  • feat(m5.7): expand /services with supergroup intros and engagement models (77f1946)
  • feat(m5.7): expand 8 service detail bodies bilingually with imagery (494dd12)
  • feat(content): add surat bmpr case study (pemprov sulteng partnership) (5d24461)
  • feat(m4.5): theme toggle crossfade morph via gsap (a0e1a5b)
  • feat(m4.5): link underline reveal and smooth scroll (75cd53c)
  • feat(m4.5): animated counter on trust strip numbers (dc93238)
  • feat(m4.5): magnetic hover on primary cta buttons (aa72063)
  • feat(m4.5): add scroll-reveal lib and section reveal animations (dd25961)
  • feat(hero): redesign hero stage and revert thumbnails to original svg (1e87053)
  • feat(content): add anonymized reku work product on founder page (dc114b5)
  • feat(content): add carwa app screenshots with annotations cropped (9ef09b8)
  • feat(content): add real pico sulteng screenshots (8a3c741)
  • feat(hero): two-column layout with media on the right (b882f67)
  • feat(m5.6): add ideal-client-fit and public-sector capability sections to home (a092ed2)
  • feat(m4.1): add stadata_flutter_sdk to engineering bucket (0a1d5a8)
  • feat(m4.1): add form_gear_builder to engineering bucket (3c33f2a)
  • feat(m4.1): add form_gear_engine flutter sdk to engineering bucket (8d75d08)
  • feat(m4.1): add bps_sso_sdk to engineering bucket (64ad0d4)
  • feat(m4.1): add siap donggala and bps work to public-sector bucket (6b4d2ac)
  • feat(m4.1): add detexi and ayana to consumer bucket (2a9c8eb)
  • feat(m4.1): update bucket filter and tag styling for 4 buckets (7ff7fea)
  • feat(m4.1): extend portfolio bucket enum to include engineering (84acece)
  • feat(m5.5): wire estimator link into nav and home cta (4dd9047)
  • feat(m5.5): add /estimate pages (id + en) with whatsapp deeplink output (fb6ed4f)
  • feat(m5.5): build estimator wizard component with 7 steps (cc3c9c4)
  • feat(m5.5): add pricing model and calculator logic (ce13ea6)
  • feat(m6): build contact pages with whatsapp deeplinks (1424de2)
  • feat(m6): author launch blog post bilingually (8988228)
  • feat(m6): build blog index, detail, and rss feed (b2bf9f3)
  • feat(m6): add author profile and contact data file (7da106a)
  • feat(m5): replace home services section with two-tier supercategory cards (5705335)
  • feat(m5): build founder page with selected experience and credibility (ec3e905)
  • feat(m5): build about page with team section (1312abb)
  • feat(m5): build services detail page with related services and faq (ee5be65)
  • feat(m5): build services index with two-tier supercategory layout (5395bce)
  • feat(m5): author bilingual service entries across 5 categories (0b89456)
  • feat(m5): extend services category enum to include design and social media (d7318f2)
  • feat: add team data file and asset dir for about page (aba83ea)
  • feat(m4): wire home page to real featured portfolio entries (8ce0c6d)
  • feat(m4): build portfolio detail page with case study layout (225c5ca)
  • feat(m4): build portfolio index with bucket filter (5d8818c)
  • feat(m4): scaffold portfolio content folders with placeholder covers (d5ce599)
  • feat(m4): author 6 case studies bilingually (f7cecee)
  • feat(m4): scaffold portfolio content folders with placeholder covers (b27b048)
  • feat(m3): build full Indonesian home page with all 10 sections (b90daea)
  • feat(m3): extend pages content schema for home copy fields (2d3223f)
  • feat(m2): rewrite logo component to use proper svg variants (7dbf1d4)
  • feat(m2): extract clean svg variants from master logo file (5e52320)
  • feat(m2): add theme-aware logo variants (2fce3b1)
  • feat(m2): add dev component review page with light/dark previews (754a10c)
  • feat(m2): add interactive components (lang switcher, theme toggle, bucket filter, device frame) (ac2943f)
  • feat(m2): add trust client logo row with text fallback (62f3225)
  • feat(m2): add founder card and experience strip (73a8321)
  • feat(m2): add card components (service, case study, testimonial) (8afd8a6)
  • feat(m2): add section components (hero, dot grid, trust strip, cta, process step) (0a83bd7)
  • feat(m2): add atoms (button, card, tag) and brand logo component (f6e67df)
  • feat(m2): add typography primitives (section header, prose, mono label) (2493cb7)
  • feat(m2): add layout primitives (nav, footer, drawer, container) (ed72abf)
  • feat(m2): add baselayout boot script for theme + hreflang (35b7dcc)
  • feat(m2): extend design tokens with spacing, type scale, and shadows (30776c0)
  • feat(m2): extract icon-only svg and update favicon (47c953a)
  • feat(m1): adopt official brand colors and add logo assets (a7a541b)
  • feat(m1): add static data stubs and asset dirs (78432d6)
  • feat(m1): add zod schemas and content collection scaffolding (e1c1a05)
  • feat(m1): add design tokens, base layout, and bilingual placeholder pages (6e02a45)
  • feat(m1): scaffold astro 6 with mdx, sitemap, and tailwind v4 (6b84fd4)

🐛 Bug Fixes

  • fix(zog): preserve cell centering with xPercent/yPercent so GSAP scale doesn't shift logos (37992d0)
  • fix(content): apply renderInlineMd to summary, impact, faq.a fields (1a2f24e)
  • fix(portfolio): render inline backticks/bold in problem & solution fields (bffce7e)
  • fix(theme): persist across view transitions (6eaab89)
  • fix(loader): hide on astro:after-swap so view transitions don't strand it (29b8ebf)
  • fix(favicon): use full BC monogram instead of B-only variant (5280efc)
  • fix(hero): show both phones on mobile, no more off-centre singleton (061f583)
  • fix(mobile): hamburger menu was a no-op + page overflowed by 81px (0fc127e)
  • fix(msp): move videos from wrongly-nested src path to public/portfolio/msp (8f91c0e)
  • fix(zog): each partner logo appears exactly once in the cycle (b74d5b0)
  • fix(zog): shorter, position-aware blur — clear in the middle, blurry only behind text or near edge (966f581)
  • fix(hero): update CSS selector to match renamed data-hero-cycle-group (5d9a60f)
  • fix(hero): sync front + back phones so they always show the SAME product (d4b8e5d)
  • fix(founder): group marquee shots by product so each app reads as a coherent set (28f7199)
  • fix(zog): anchor slots also fade out at edge before section unpins (c048701)
  • fix(zog): logos vanish at viewport edge; founder marquee mixes BC products with prior fintech (ebfd9dd)
  • fix(zog): client logo cycle now actually visible and animates correctly (abb3292)
  • fix(home): render lucide icons on ideal-clients tiles (29d4464)
  • fix(clients): drop dinas bmpr from trust strip to avoid duplicate emblem (0aa0d8a)
  • fix(m7): add atom:link to RSS feed and image loading attrs on EN pages (e0d5fa6)
  • fix(qw): replace [ ## ] section markers with numbered [ 01 ]–[ 04 ] markers (1e18911)
  • fix(contact): set real founder whatsapp number 6287784808269 (7e5e5e8)
  • fix(m5.7): remove invalid JSX block comments from service MDX files (957345c)
  • fix(nav): keep navbar opaque on scroll across view transitions (07d20bc)
  • fix(services): render lucide icons instead of dumping icon name as text (2a0bb1d)
  • fix(estimator): stop double-toggle on feature multi-select (3c0b3ad)
  • fix(m4.1): propagate engineering bucket to slug pages and bucket filter label props (269091c)
  • fix(content): correct client geographies and partnership context (9f9286a)
  • fix(m6): use correct github org slug banua-coder in footer socials (94e8573)
  • fix(m6): verify testimonial empty-state behavior across surfaces (f6c5252)
  • fix(content): add generateId to services collection to prevent locale deduplication (b5c8dda)
  • fix(m3): restore en home page route (d1261c3)
  • fix(m2): make icon variant theme-aware via inline svg + currentcolor (dfb8552)
  • fix(m2): apply evenodd fill rule to extracted bc monogram svgs (5e993be)
  • fix(m2): scope svg extraction to inline icon only, restore png lockups (2b0795b)
  • fix(m2): theme-aware colors for headlines and theme toggle in light mode (c099880)

⚡ Performance

  • perf: add page loader + convert big PNG screenshots to WebP (~85% size reduction) (5a3d1e0)

♻️ Refactor

  • refactor(m4.5): replace dotgrid scroll listener with gsap scrub (6753cbc)
  • refactor(m4.5): replace vanilla magnetic and counter with gsap implementations (a8251fb)
  • refactor(m4.5): replace vanilla scroll-reveal with gsap matchmedia + scrolltrigger (cbc9e51)

📝 Docs

  • docs(m1): replace default readme and finalize gitignore (3d89121)

👷 CI

  • ci: gitflow release workflow following cektrans/ayana_web pattern (c846015)
  • ci(marketing): GH Actions deploy workflow + fix engineering→openSource label (092edfa)

🧹 Chore

  • chore(contact): use contact@banuacoder.com instead of hello@ (fce3ae2)
  • chore: stop tracking .playwright-mcp/ debug artifacts (9cb7e91)
  • chore: rename engineering bucket to open-source, add Caretaker/Detexi/Gowa logos, fix years, fix favicon (0f4a18f)
  • chore(zog): reduced-motion fallback for both pinned sections (cab2707)
  • chore(zog): install lenis and wire into gsap ticker (0cb97d6)
  • chore(logos): wire up png+svg support in client and founder logo rows (d3afb72)
  • chore(m7): pin og fonts and generator tweaks (3741662)
  • chore(m7): a11y fixes from axe-core run — zero violations confirmed (e727a44)
  • chore(qw): contact page CTA hierarchy — remove redundant Email card, fold into Discovery Call secondary (575ccd1)
  • chore(qw): SEO quick wins — canonical, robots.txt, og:locale, keyword-rich title tags (1278a95)
  • chore(m5.7): add 8 unsplash stock photos for services, about, and founder (ce8e540)
  • chore(m4.5): clean up obsolete reveal css and vanilla scripts (c9f3944)
  • chore(m4.5): install gsap 3.15.0 with scrolltrigger (8b1261e)
  • chore: log m5.7 content expansion + unsplash imagery (bd22879)
  • chore(m5.6): tune about copy to name target audiences explicitly (de0de51)
  • chore(m5.6): surface cross-context narrative on founder page and home strip (0e1bd0c)
  • chore(m5.6): tune service ideal-fit fields for target audiences (c33788d)
  • chore(m4.1): cap home portfolio highlight at 3 cards (dbbae95)
  • chore: expand m5 service taxonomy to include design and social media (ed9807e)
  • chore: log m4.1 additional portfolio entries follow-up (02d4d5c)
  • chore: log new milestones (micro-interactions, estimator, credibility audit) (b5b52df)
  • chore: log back-office epic and milestones in beads (f7255f2)
  • chore(m1): pin pnpm packageManager and sync beads state (321dab2)
  • chore(m1): remove legacy laravel codebase (0e75767)
  • chore: snapshot legacy laravel state before astro redesign (0afa02e)

💄 Style

  • style(zog): exclude pemda emblems from white-silhouette filter on dark theme (7491474)

📌 Other

  • tweak(zog): pull gowa+detexi toY closer to centre, off the edges (eb30980)
  • copy: simpler Indonesian, brand-icon loading screen (169088f)
  • content: archipelago is a paid product, ayana/pico add web links, flutter packages add pub.dev (796a3dd)
  • copy: use 'Ryan' in narrative body prose (id + en) (7ea138f)
  • copy: use 'Ryan' in narrative body prose, keep formal name for schema/titles (a6ebd2b)
  • bd init: initialize beads issue tracking (737ed60)

When merged, release-finalize.yml will:

  • tag v1.0.0 and trigger deploy
  • prepend the changelog above to CHANGELOG.md on main
  • open a back-merge PR to develop

Checklist

  • All checks passing
  • Smoke test on staging or local preview
  • Ready for release

ryanaidilp added 30 commits May 8, 2026 11:08
Sets up Astro 6 static site with @astrojs/mdx, @astrojs/sitemap,
@tailwindcss/vite 4.2.4, i18n routing (id default, en fallback),
and all required dependencies locked with pnpm.
…ages

Defines bnc-ink/paper/accent tokens and stone scale via @theme directive,
imports Geist/Inter/JetBrains Mono fonts via CSS @import, and adds
Indonesian (/) and English (/en/) placeholder pages using BaseLayout.
Defines portfolio, services, blog, authors, testimonials, and pages
collections with full Zod v4 schemas. Uses reference() for author
and portfolio cross-references. Creates empty collection dirs with
.gitkeep for git tracking.
Adds clients.ts (4 clients with tier classification) and
founder-experience.ts (GoTo Financial, Reku, Stockbit/Bibit, Ulearna)
as typed static data. Creates src/assets/clients/ and
src/assets/companies/ dirs for SVG logo files.
Replaces Astro template README with project-specific docs covering
stack, commands, git-flow branch model, and Beads issue tracking.
Gitignore already includes package-lock.json, docs/, and .codegraph/.
- Replace placeholder lime accent with brand colors from official logo:
  primary deep blue (#12398C) and cyan accent (#1D9CD4)
- Add neutral-first usage rule: ink/paper dominate, blues used as accent only
- Drop logo lockup variants (horizontal, vertical, icon, swoosh, stamp) into
  src/assets/brand/ for use in nav, footer, favicon, and OG images
M1: Foundation — Astro 5 scaffold, i18n, content collections, design tokens.

- Archive legacy Laravel codebase
- Scaffold Astro 6 + Tailwind v4 + MDX with pnpm
- Configure i18n routing (id default, en fallback)
- Add Zod schemas for 6 content collections
- Add base layout, design tokens, self-hosted fonts (Geist/Inter/JetBrains Mono)
- Add static data stubs for clients and founder experience
- Adopt official brand colors (#12398C primary, #1D9CD4 accent)
- Drop logo assets into src/assets/brand/
Hand-coded BC monogram SVG from stamp reference — blue rounded-square
background, white B letterform, cyan C letterform and bracket accent.
Works at any scale; replaces Astro default favicon.svg.
Add spacing-section-y clamp, container-max, prose-max, radius scale,
shadow-subtle/elevated tokens, duration-quick/base, and fluid fs-12
through fs-84 type scale. Add dark mode shadow overrides and
prefers-reduced-motion global rule.
Add inline FOUC-prevention script (reads localStorage.theme before
first paint), hreflang alternate links (id/en/x-default), theme-color
meta for light/dark, OpenGraph basics, and head/body slots. Fix /en
route conflict by removing src/pages/en/index.astro (let i18n fallback
handle it). Add sitemap filter to exclude /dev/ pages.
Nav: sticky, scroll-blur, logo lockup, desktop links with cyan underline
reveal, lang switcher, theme toggle, hamburger trigger.
MobileDrawer: slide-in panel, focus trap, Esc/backdrop/link close, ARIA
dialog. Footer: 3-col grid with brand, sitemap, socials. Container: max-w
wrapper. Logo: horizontal/icon/vertical variants with inline SVG support.
SectionHeader: eyebrow // label, bracketed numeral marker, display title,
optional description. Prose: 68ch max-width MDX wrapper with editorial
rhythm, JetBrains Mono code blocks, pull quotes, cyan link underlines.
MonoLabel: small uppercase mono eyebrow with // or > prefix variants.
Button: primary/secondary/ghost variants, md/lg sizes, renders <a> or
<button>. Card: base primitive with subtle shadow, hover lift, padding
variants. Tag: pill for bucket/tech labels with 4 color variants.
…rocess step)

Hero: dot-grid backdrop, asymmetric layout, dual CTAs, media slot, cyan
hairline divider. DotGridBackdrop: CSS radial-gradient with JS parallax
respecting prefers-reduced-motion. TrustStrip: 4 mono micro-claims with
hairline separators. CTA: default and inverted blue variant. ProcessStep:
numbered vertical timeline with connector hairlines.
ServiceCard: icon + title (cyan underline on hover) + tagline + 3-bullet
preview + learn-more link. CaseStudyCard: cover image with hover scale,
bucket Tag, client/year meta, 2-line-clamped summary, impact stat, and
data-bucket attribute for BucketFilter. Testimonial: pull-quote style
with cyan opening quote mark, author/role/company, optional avatar.
FounderCard: compact (home) and full (/founder) variants with photo
placeholder, name/role, headline, narrative, credibility bullets, selected
experience, and social links. FounderExperienceStrip: keyboard-accessible
tooltip row showing context for each employer from founder-experience.ts.
ClientLogoRow imports from clients.ts and renders each client as a
grayscale-on-default, color-on-hover pill. Named-text fallback (mono
uppercase company name) renders when SVG logo files are not yet available,
so the component works pre-art-delivery.
…cket filter, device frame)

LangSwitcher: navigates between /en/... and /... paths via Astro.currentLocale.
ThemeToggle: sun/moon button, persists theme in localStorage. BucketFilter:
segmented control filtering data-bucket elements with URL hash for shareable
views. DeviceFrame: pure-CSS phone/tablet/desktop chrome with blurred NDA
modifier. All use vanilla TS in Astro script tags.
Renders every component at /dev/components/ with realistic copy from the
brief. Excluded from sitemap via filter. Noindex/nofollow robots meta in
head slot. Theme toggle at top for side-by-side light/dark review.
Logo component now renders the official light variant by default and
swaps to the white-on-transparent variants (PNG4 horizontal, PNG6
vertical) when html.dark is set. The inline SVG icon also adapts:
in dark mode, the deep-blue plate becomes transparent and the B
letter switches to paper for contrast.
Extract 6 per-variant SVGs from the 1080x1080 master artboard using
viewBox-cropping: horizontal-light, horizontal-dark, vertical-light,
vertical-dark, icon (currentColor B + cyan swoosh, no plate),
app-icon (deep-blue rounded-square plate), and favicon.
Background rects dropped for transparent-bg variants.
Replace hand-coded inline SVG paths with imports from the extracted
src/assets/brand/svg/ files. Add 'app-icon' variant and 'theme' prop
(auto/light/dark). Remove deprecated 'inline' prop. Update Nav and
Footer to drop the removed inline prop usage.
Add @custom-variant dark to global.css so Tailwind v4 dark: utilities
activate on html.dark class (JS toggle) instead of only responding to
prefers-color-scheme media query. This fixes invisible headlines and
icons when OS is dark but the page is force-toggled to light mode.
Also update dev page logo labels and remove stale inline prop usage.
The previous SVG rewrite replaced all logo variants. Reverted: horizontal
and vertical lockups go back to PNG-based theme swap (already correct
and proven). Only the inline-icon path now uses the proper extracted
SVG paths instead of the broken hand-coded ones.

- Logo.astro: use PNGs for horizontal/vertical with theme swap, single
  PNG for icon, inline=true icon variant uses extracted SVG with
  currentColor for theme adaptation
- Remove redundant horizontal/vertical SVG variants
- Keep banuacoder-icon.svg (inline source), banuacoder-app-icon.svg,
  banuacoder-favicon.svg
The master SVG uses fill-rule:evenodd at the svg level, which my
extracted variants did not preserve. Without it, the BC paths fill
solid instead of rendering as the intended outlined letterforms with
hollow counterforms — making the C in particular look broken at
display sizes.

Apply fill-rule="evenodd" to:
- src/assets/brand/svg/banuacoder-icon.svg
- src/assets/brand/svg/banuacoder-app-icon.svg
- The inline icon SVG in Logo.astro
Previously the icon variant rendered as a static blue PNG in both
light and dark mode — wrong in dark mode where the icon should be
white-on-dark.

Now the icon variant always inlines the extracted SVG and uses
currentColor for the B+C letterforms, with a CSS variable swap:
deep blue (--bnc-primary) in light mode, paper (--bnc-paper) in
dark mode. The cyan swoosh stays cyan in both.

Drop the unused inline prop and the iconPng import.
ryanaidilp and others added 28 commits May 9, 2026 19:04
The previous design ran two independent cycle timers with an offset, which
meant the front phone could be showing PICO Sulteng while the back phone
was showing Carwa — visually pairing two unrelated apps in a single
moment of the hero.

Restructured to one shared cycle group:
- Both .hero-shot stacks tagged data-hero-cycle-group='hero-products'.
- animations.ts now advances every slot in the group on the same tick,
  using a single global index. Each slot's slides are indexed mod its
  own length so different slot sizes still stay in sync.
- Each product now has a paired (front, back) screenshot:
    PICO Sulteng    : front=dashboard,         back=peta sebaran
    Sikerja         : front=jobs list,         back=filter pencarian
    SIAP Donggala   : front=home dashboard,    back=profil pegawai
    Detexi          : front=detail rujukan,    back=verifikasi token
- Removed the data-hero-cycle-offset attribute and the legacy
  data-hero-cycle hook.

Result: at every tick both phones reference the same product, so the
hero reads as a coherent product spotlight rather than a random slot
machine.
When the cycle attribute was renamed to data-hero-cycle-group for the
synced front+back grouping, the CSS rules that absolute-position the
non-first slides on top of each other still referenced the old
data-hero-cycle attribute. As a result every slide rendered in normal
flow and all 4 phone screenshots stacked vertically below the visible
phone — the chip label changed but the image never did.

Updated both index.astro and en/index.astro selectors to
[data-hero-cycle-group] so the stack collapses to one visible image
again and the auto-cycle crossfade works.
…E Komdigi badge

Hero carousel now cycles through 5 Banua Coder products:
  PICO Sulteng → Sikerja → SIAP Donggala → Detexi → Carwa
The two phones still pair the same product on every tick.

Sikerja pair updated per owner request:
- Front: Beranda (home dashboard with hero carousel + service icons +
  Berita Pemprov cards) — sourced from ~/Pictures/Sikerja
- Back: Lowongan list (jobs feed with search + popular + available)

Carwa added back into the hero rotation:
- Front: clean CarWa home/auction screen (mild design annotations
  remain — these are screenshots from design review handoff, but
  the only available shots; visible CarWa branding makes the
  product identifiable).
- Back: 'Auctions Ending Today' featured-cards screen.
- Sourced from ~/Pictures/Carwa (Pictures/Carwa/SCR-20241015-lvzl-4
  + lvzl-5).

Footer: added Komdigi PSE registration badge:
- Site-wide footer now carries a centered badge linking to
  https://pse.komdigi.go.id/pse with the Komdigi logo (downloaded
  to /public/badges/komdigi.png) + the registration number
  015494.01/DJAI.PSE/09/2024 (mirrors the badge already used on
  the Ayana Web product, which is registered under the same entity).
…only behind text or near edge

Previous tuning had the fade-blur tween running for 0.22 of timeline
on entrance AND exit. Cell lifespan was 0.26, so the logo was
blurry for 84% of its life and clear for only ~0.04 in between —
in practice the blur dominated.

Two adjustments:

1. Blur is split into two CSS variables stacked additively:
     --cell-fade-blur     (timeline-driven entrance/exit dolly blur)
     --cell-overlap-blur  (ticker-driven extra blur ONLY while the
                          logo's centre sits inside the headline rect,
                          1px margin per spec)
   CSS:
     filter: blur(calc(fade-blur + overlap-blur))
             grayscale(fade-gray)
   So a logo can be sharp during travel AND auto-blur the moment it
   passes behind the centred 'Klien dan partner kami' text.

2. Shortened the entrance/exit fade-blur duration from 0.22 → 0.08
   (and matching position drift exit-padding from +0.22 → +0.08).
   Now: 0–8% lifespan = fade in, 8–92% = clear cruising, 92–100%
   = fade out. Logos read clean for most of their on-screen time and
   only blur when (a) approaching a viewport edge or (b) overlapping
   the headline.
Down from 16 slots (with caretaker, bps, ulearna, pemprov-sulteng,
klinikgo, detexi appearing twice) to 10 slots — one per unique brand.
Stagger widened from 0.04 to 0.07 so all 10 logos get clear airtime
across the scrubbed timeline (last logo enters at 0.63, exits 0.89).

Order:
  Ulearna → Pemprov Sulteng → Caretaker → BPS → Pemkab Gowa →
  Detexi → KlinikGo → Pemkab Donggala → Brantas Inti Utama →
  Pemprov Sulsel
… cycle to repeating pattern

- ClientLogoCycle: restored 16-slot repeating pattern per owner request
  (caretaker, bps, ulearna, pemprov-sulteng, klinikgo, detexi each
  appear twice). Duplicates will be swapped for new logos as more
  partner brands are added.
- Services preview: 2 cards now slide in from opposite sides with a
  3D rotation-Y depth tilt — Build & Engineer drifts in from the
  left tilted away (-25deg), Brand & Grow from the right (+25deg).
  Triggered at 'top 82%' on the grid, once.
- Public Sector module: bullets cascade from the left with 0.08s
  stagger, plus each arrow span pops in via back.out scale + rotation
  so the list reads as proof points being checked off in sequence.
- Wired data attrs in both id + en home pages: data-tell-services /
  data-tell-services-card, data-tell-public-bullets /
  data-tell-public-bullet.
Splits the featured testimonial quote into individual word-spans (via
createElement to avoid innerHTML), then fades each word up with y:14 →
y:0 + opacity 0 → 1 on a 0.025s stagger. After the words finish, the
figcaption (author + company line) eases up with its own tween.

Reads as the quote being spoken rather than dumped in as a block of
text. Markup-side: data-tell-testimonial on the wrapper section in
both id + en home pages.
…nce strip, final CTA

About:
- The "founded 2019 / based in Sulteng" mono decoration card now has
  its own entrance distinct from the surrounding section reveal —
  slides in from x:60 with a slight scale-up, easing on power3.out.

Founder strip:
- The horizontal row of past-employer logos (GoTo Financial, Reku,
  Stockbit/Bibit, Ulearna) cascades in with y:20 + scale 0.9 + back.out
  pop, 0.07s stagger. Reads as the credentials being laid out one
  by one rather than dumped together.

Final CTA:
- Headline scales up from 0.92 + y:20 with power3.out for a punchy
  arrival.
- Sub line eases up 0.2s after.
- Buttons stagger in at 0.35s with back.out overshoot — the call to
  action visibly assembles itself as the user scrolls in.

Wired data attrs in: src/components/sections/CTA.astro
(data-tell-cta, data-tell-cta-headline, data-tell-cta-sub,
data-tell-cta-actions), and id + en home pages
(data-tell-about-decor, data-tell-founder-experience).
…e reduction)

Loading screen:
- Inline overlay in BaseLayout.astro renders before any external CSS
  loads. Shows the BC monogram pulsing + a brand-colour shimmer bar.
- Inline JS hides it on window.load (with a 4s safety cap), then
  removes it from DOM so it can't trap focus.
- Light/dark backgrounds keyed off :root.dark.
- Reduced-motion: stops both keyframes.

Image optimization:
  Source PNG → WebP (q 82 -m 6), originals removed:
    sikerja/screenshots:    4.2M → 624K  (-85%)
    detexi/screenshots:     2.0M → 464K  (-77%)
    siap-donggala/screenshots: 5.1M → 236K  (-95%)
    carwa/screenshots (clean-{1,2}): 3.0M → 592K (-80%)
    founder/work-product (Reku 1–6): 4.9M → 756K (-85%)
  Total: 19.2M → 2.7M sources committed (~16.5MB cut from repo).

Updated all imports/.png→.webp in:
- index.astro / en/index.astro (hero stack)
- founder.astro / en/founder.astro (Reku marquee + BC product mix)
- portfolio/{sikerja,detexi,siap-donggala}/index.{id,en}.mdx (gallery)

Astro's <Image> still re-encodes downstream variants for responsive
sizes, but smaller sources mean faster cold builds AND faster dev
serving (which streams the source as-is for unoptimised paths).
…ideos

New portfolio entry showcasing Banua Coder's Flutter performance
engagement on Masjid Sejuta Pemuda — a Muslim youth community consumer
app inherited from a previous "vibecoded" contractor.

Narrative across 4 acts of the case study:
  1. Diagnosis with Performance Overlay + Rebuild Rainbow — 62.8ms max
     frame time, whole-tree rebuild every second.
  2. Iteration 1: const audit fixes jank but rebuild scope unchanged.
  3. Iteration 2: encapsulate sections — narrows rebuild but countdown
     still spreads to siblings.
  4. Iteration 3: custom text-rotator + countdown widgets from scratch
     with isolated state — final state shows only the countdown digit
     rebuilding, frame time ~16ms.

Videos:
- 5 source .mov clips (~82MB) compressed via ffmpeg to web mp4
  (libx264, crf 26, scaled to 540px, audio stripped). Total now ~2.4MB.
- Posters generated as first-frame jpg.
- Stored in /public/portfolio/msp/ for direct static URL serving.
- Embedded in MDX via raw <video> tags with controls + muted +
  playsinline + preload=metadata.

Other:
- Added MSP to src/data/clients.ts (no logo file yet — text-only entry,
  tier standard).
- bucket: consumer, year: 2025, featured: true.

Story arc reads as engineering process documentation (audit -> diagnose
-> iterate -> prove with same tooling) rather than 'we made it faster'
marketing copy.
…o/msp

Previous commit landed video assets at
src/content/portfolio/msp-performance-audit/videos/public/portfolio/msp/
because the shell pwd had drifted into that nested folder during the
ffmpeg + mv pipeline. The MDX <video src="/portfolio/msp/..."> tags
expect them at public/portfolio/msp/.

Renamed all 10 files (5 mp4 + 5 poster jpg) to the right location.
Root causes:
1. <MobileDrawer /> component was never rendered anywhere — the
   hamburger button in Nav.astro had aria-controls="mobile-drawer"
   pointing at an element that didn't exist in the DOM. Adding the
   drawer right under Nav so the hamburger has something to open.

2. The drawer sits at right:0 with translate-x-full to hide off-screen
   right. Without overflow-x containment on body, that translate
   pushed document width 273px past the viewport edge — visible as a
   horizontal scroll on mobile (375px viewport, 456px doc width).
   Added overflow-x: clip on html, body in global.css base layer.
   `clip` (vs hidden) keeps fixed-position descendants painting
   correctly while still containing layout.

Verified via Playwright at 375x812:
- doc width = win width = 375px (was 456 → 375)
- hamburger click: drawer slides in (left 102, right 375), backdrop
  opacity 1, body overflow hidden, aria-expanded=true.
Loading screen + favicon:
- BaseLayout page-loader now renders the canonical Banua Coder icon SVG
  (cyan swoosh + B + C silhouette) instead of the hand-crafted monogram.
- Bumped size from 64 → 72px and added a dark-mode override that swaps
  the body letterform fill from #12398C to #f7f7f4 so it's still
  readable on the ink background.
- Favicon was already pointing at the canonical brand SVG (no change
  needed there — verified cmp identical to src/assets/brand/svg/
  banuacoder-favicon.svg).

Indonesian copywriting pass — main pain point was tech jargon mixed
into copy aimed at general business owners and government
decision-makers. Fixed:

home.id.mdx
- 'Engineering-led delivery' → 'Dibangun dengan disiplin engineering' /
  'dikerjakan dengan standar engineering' (used as plain Indonesian
  rather than English jargon).
- 'product thinking, engineering discipline, MVP' tech tower in About
  rewritten as plain Indonesian.
- Services taglines: 'membership experience' → 'sistem keanggotaan';
  'attendance system / approval workflow / admin panel' → Indonesian
  equivalents on the deliverables list; 'discovery / MVP / modernization
  / maintenance' likewise.
- Why-tiles: 'Eksekusi berbasis engineering' → 'Dibangun untuk bertahan
  lama'; 'Delivery yang low-risk' → 'Proses jelas, risiko terkendali'.
- Process steps fully renamed to Indonesian (Pemetaan Awal, Penyusunan
  Solusi, Desain & Validasi, Pengerjaan, Pengujian & Peluncuran,
  Pendampingan & Pengembangan) — was a mix of English headers + ID
  bodies.
- Founder narrative: 'platform engineering / engineering depth /
  product thinking' replaced with plain Indonesian descriptions.
- 'Discovery Call' CTA → 'Diskusi Pemetaan'.
- 'consumer-facing / case study / vendor eksekusi' fragments cleaned up.

Founder page (id + en) prior-work section:
- 'UI yang sudah kami kirim' → 'Karya terpilih' (the specific phrase
  the owner flagged as awkward).
- 'UI we've shipped' → 'Selected work' on /en/founder/.

Build green: 73 pages.
Two related issues stacked on top of each other:

1. The mobile media query was hiding .hero-shot-back via display:none
   (and the hero-chip with it), so phone users only saw a single phone.
2. The same media query tried to centre the lone front phone with
   `transform: translateX(50%)`, but the GSAP parallax tween on
   .hero-shot writes its own transform on every scroll tick, clobbering
   the centring rule. Net effect: a single phone parked left-of-centre.

Fix:
- Mobile CSS now keeps both phones visible — front 220px wide pinned
  to the right (right: 4%, top: 12px), back 150px wide tucked left
  (left: -4%, top: 60px). Chip label stays at bottom-left. Stage grew
  to 360x420 to fit both. Desktop tilts (-2deg / -9deg) inherit through.
- Hero parallax scrub in animations.ts is now gated to viewports
  ≥641px so it can't fight the small-screen layout. Mobile readers
  get a static dual-phone composition; desktop keeps the parallax.

Verified on a 375x812 viewport: front phone (SIAP Donggala home) is
right-aligned, back phone (profile screen) is offset to the left, both
visible at once, chip label '// SIAP Donggala' renders below.
Pinned client-logo cycle, hero auto-carousel, scroll storytelling across
sections, founder UI marquee, MSP performance audit case study, mobile
fixes, copy audit, page loader, image/video optimisation.
- BaseLayout: re-apply theme to incoming <html> on astro:before-swap
- ThemeToggle: delegate click on document so listener survives swaps
- deploy.yml: trigger on tag v*.*.* push (was: branches: main)
- release-prepare.yml: open release PR + bump package.json + grouped changelog
- release-finalize.yml: tag + CHANGELOG.md + GitHub Release + back-merge PR
@ryanaidilp ryanaidilp merged commit fd9b630 into main May 29, 2026
1 check passed
@ryanaidilp ryanaidilp deleted the release/v1.0.0 branch May 29, 2026 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant