Notable changes to the portfolio site. Dates are in YYYY-MM-DD.
- Bumped in-range npm deps (
@supabase/supabase-js2.110.7,axios1.18.1,ws8.21.1);npm auditclean. Lockfile-only change, no site behavior affected.@vectorize-io/vectorize-client0.4.0 left alone (major).
- Hero: Restructured from a centered single column to a two-column
.hero-grid— left column holds the headline, subtitle, tagline, CTAs, and text links; right column is an.hero-achievement-cardsurfacing the RBI award badge and three key metrics ($10M+, 30%, 10+) with the current role line. - Trust strip: New section between hero and experience listing employers (Eagle Eye highlighted as current) plus the RBI Asia Trailblazer 2025 award callout. Label reads "Experience across" (not "Worked with") since Eagle Eye is the current employer.
- About: Removed a duplicated paragraph; replaced the three equal highlight cards with an asymmetric layout — one tall featured card ("Pre-sales SE" + "10+ years in APAC retail & payments" stat) beside a stack of two smaller cards (Product Management, Fintech & Payments). Copy updated from "fintech & payments" to "retail & payments".
- About card fix: Small highlight cards used
padding: var(--space-5)while the featured card usedvar(--space-6), so their icon+heading sat 4px closer to the card's left border. Bumped small cards tovar(--space-6)so all three align at the same inset. Icon+heading also wrapped in a.highlight-small-headerflex row. - Skills: Replaced the equal-column grid with a
.skills-bentolayout (featured "SE + PM" block, four regular blocks, one wide block) using.skill-pill/.skill-pill-primarytags. - Cache-busting: All homepage CSS
<link>hrefs carry?v=3(the/css/*files are immutable-cached bynetlify.toml, so a version bump is required for browsers to pick up CSS changes).
news-events/css/layout.css: The.content-displaypanel showed an empty bordered box during loading / no-data (the inner containers are hidden while loading, leaving just the panel chrome). The panel now defaults to no chrome and only restores its border/background/padding when it actually holds content —:has(.news-item)or a visible#events-calendar. Error and no-results messages already carry their own box styling, so they stay unwrapped. Pure CSS; no script/logic change.PM+Framework/index.html: Bumped Font Awesome6.0.0→6.4.0to match the other sub-pages.- All sub-pages (
PM+Framework,news-events,ai-tools,games): Added?v=3to the shared../css/base.cssand../css/subpage.csslinks for consistency with the homepage.
index.html: Fixed brokenog:image/twitter:image— they pointed to/images/placeholder-profile.jpg(a non-existent folder); corrected to the real root file/placeholder-profile.jpg(the same photo the hero uses).twitter:cardstayssummary, which suits the 400×400 square image.news-events/index.html: Replaced thepath/to/your/social-share-image.jpgplaceholderog:image/twitter:imagewith/placeholder-profile.jpg, and switchedtwitter:cardfromsummary_large_imagetosummaryto match the square image. Social shares now show a valid preview on both pages.index.html,news-events/index.html: Appended?v=2to theog:image/twitter:imageURLs to bust LinkedIn's image cache (it keys on the full URL incl. query), forcing a fresh fetch of the current profile photo on re-scrape.
- Deleted
mockup-preview.html(throwaway preview from the redesign review). .gitignore: Added.agents/andskills-lock.json(local agent tooling).
- Dependencies (P1, High):
npm audit fixbumped transitiveform-datato 4.0.6, clearing the GHSA unsafe-random-boundary advisory.npm audit --omit devnow reports 0 vulnerabilities.package-lock.jsonupdated. - Outbound timeouts (P2, Medium):
netlify/functions/fetch-news.js— addedsignal: AbortSignal.timeout(8000)to the NewsData.io and NewsAPI.orgfetch()calls, andtimeout: 8000to therss-parserinstance. Brings the file in line with the "timeouts on all outbound HTTP" standard. - Error leakage (P3, Low):
netlify/functions/chatbot.js— the 500 response no longer echoes upstream provider error text to the client; it returns a generic message while full detail is still logged server-side only.
ai-tools/index.html: Fixed the "Your enhanced prompt will appear here..." placeholder rendering offset. Root cause:.output-displayuseswhite-space: pre-wrap, so the source-code indentation before the<span>was rendered as literal leading whitespace. Collapsed the markup so the placeholder span is the immediate, only child of the output div. Runtime output is unaffected (JS replaces the div content).
index.html: Added Experience section (between hero and About) — Eagle Eye, Sales Engineer (Jul 2025–Present); Mastercard, Director SE Presales + Product Manager (Jun 2015–Oct 2024, 9 yrs). Styled with monogram logo placeholders.index.html: Added employer strip below hero CTA buttons — "Worked with: Eagle Eye, Mastercard, S2 Infotech, Nisa Group" — as subtle pill badges.index.htmlAPAC Market Expansion card: Expanded to ~120 words covering the localization problem, eight-market rollout approach, and $10M+ revenue outcome.index.htmlAPI Ecosystem Development card: Expanded to ~120 words covering fragmented integration problem, unified API gateway approach, and 30% cost / 50% time-to-live outcomes. Tech stack updated to Swagger/OpenAPI (OAuth 1.0 removed).index.htmlCredit Card Rewards Program card: Expanded to ~120 words covering the UX problem, what the prototype demonstrates, and the Trailblazer Award context.index.htmlAbout: Added "retail" to domain description; corrected Fintech & Payments highlight from "10+ years" to "9+ years".index.htmlSkills: Added parenthetical to OpenClaw — "OpenClaw (personal trading intelligence platform)".ai-tools/index.html: Added collapsible "About this tool" block (collapsed by default) above the tool interface — explains purpose, tech stack, and instructs users to switch models if optimization fails.
PM+Framework/index.html: Converted all five accordion phases from<button>+ JS-drivenmax-heightto native<details>/<summary>elements. Content is now crawlable without JavaScript.PM+Framework/css/accordion.cssrewritten accordingly.index.htmlKey Achievements: Refactored icon containers from<i class="fas ... achievement-icon">to<span class="achievement-icon"><i class="fas ..."></i></span>. Root cause: Font Awesome's.fas { display: inline-block }was overridingdisplay: flexat equal CSS specificity. Separating the flex container from the FA element fixes centering on all five items.
favicon.ico,favicon-192.png,favicon-512.png,apple-touch-icon.png: "P" monogram favicon in brand blue on dark navy. Wired into<head>of all six pages.flowdiagram.webp: WebP conversion offlowdiagram.png— 368 KB → 44 KB (88% reduction).netlify.toml: Added cache headers for.ico,.png, and.webpfiles (immutable, 1 year).css/sections.css: Experience timeline styles added.css/hero.css: Employer strip styles added.
index.html: Replacedstyle.css@importchain with individual parallel<link>tags. Eliminates serial CSS fetch (LCP improvement).index.html: Google Fonts and Font Awesome now load asynchronously viapreload+onloadpattern with<noscript>fallbacks.index.html: Profile image — addedwidth="400" height="400"(eliminates CLS),fetchpriority="high"(LCP), removedloading="lazy"(above the fold).
index.htmlhero: Added award callout pill badge for the RBI Asia Trailblazer Award 2025.index.htmlhero: Added LinkedIn and View Resume CTA buttons.index.htmlAbout: Rewrote opening paragraph — 143 words, self-identifying, covers Mastercard APAC, PM-to-SE path, $10M+ revenue, 30% cost reduction, and Trailblazer Award.
css/subpage.css: Added.page-footerstyles and sticky-bottom body layout so footer always sits at viewport bottom on short pages.- Added consistent footer to:
ai-tools/index.html,news-events/index.html,games/index.html,PM+Framework/index.html. loyalty-ui/index.html: Updated app footer to "(demo)" framing; added separate portfolio footer.games/index.html: Added<meta name="robots" content="noindex, nofollow">.
netlify.toml: Added explicitContent-Type: application/xmlforsitemap.xmlto prevent Netlify GA snippet injection from breaking Google Search Console's sitemap fetch. Same fix applied torobots.txtandllms.txt(text/plain).
robots.txt: crawl directives; AI bots (GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot) explicitly allowed;/games/and/loyalty-ui/disallowed.sitemap.xml: homepage,/news-events/,/ai-tools/.llms.txt: authoritative identity file for LLM/AI search engines.- Google Search Console verification meta tag in
index.html. <link rel="canonical">on all pages.<meta name="description">on all pages.- Open Graph and Twitter Card tags on
index.html. - Person + WebSite + ProfilePage JSON-LD on
index.html; BreadcrumbList + WebPage JSON-LD on all sub-pages. - Portfolio demo banner and corrected title on
loyalty-ui/index.html. - Security headers in
netlify.toml:X-Frame-Options,X-Content-Type-Options,Referrer-Policy,Permissions-Policy,Strict-Transport-Security. - Cache-Control headers in
netlify.tomlfor CSS, JS, and images.
- Homepage title: "Pratik Padiya - Solutions Engineer | Loyalty, Fintech & Retail, APAC".
- loyalty-ui title: "Credit Card Loyalty Program UI Demo - Pratik Padiya Portfolio".
ai-tools/script.js: default model updated toopenrouter/free(removes stalemeta-llama/llama-3.1-8b-instruct:free).- Supabase
public.capital_gains: replaced permissiveFOR ALL USING(true)anon policy withUSING(false)deny policy. - Revoked
SELECTfromanonandauthenticatedon all trading tables to remove GraphQL schema exposure. News tables (articles,edb_articles,events) remain public by design.
- Light/dark theming on every sub-page (inline head script, sun/moon toggle, localStorage override, OS preference fallback). Replaces legacy checkbox toggles and force-dark code.
css/subpage.css+js/subpage-ui.js: shared sub-page chrome (theme toggle, scroll-reveal, safe-area insets).- Modular, token-driven CSS per sub-page (
news-events/css/,ai-tools/css/,games/css/,loyalty-ui/css/,PM+Framework/css/). loyalty-ui/css/tokens.css: PremiumRewards brand palette layered over shared tokens.- Archivo + Space Grotesk typography on all sub-pages.
- Responsive hardening across all pages: no horizontal scroll from 320px, 44px touch targets,
100dvh, safe-area insets. - Removed: all per-page legacy theming code, inline styles in sub-page HTML.
- Light/dark theming with sun/moon toggle (localStorage, inline head script, no flash).
- Modular mobile-first CSS:
style.cssreplaced by individual<link>tags overcss/modules driven by design tokens incss/base.css. js/reveal.js: scroll-reveal via IntersectionObserver; visible-by-default, skipped underprefers-reduced-motion.- Typography: Archivo (headings) + Space Grotesk (body).
- Full visual refresh: full-bleed hero, staggered entrance, hover-lift cards, 44px touch targets,
dvhunits, safe-area insets. - Removed: broken RSS ticker, unused
responsive-fixes.css.
- 2026-06 — NewsData.io API key moved from URL param to
X-ACCESS-KEYheader; enhancedenhance-prompterror handling. - 2026-05/06 — Netlify Node runtime bumped to 22;
fetch-newsfixed for Node 20 by passingwstransport to Supabase client. - Earlier — Security remediation: CORS scoped to deployed origin, API keys in headers,
createElement/textContentin news-events (no innerHTML).