SITE UPDATES

CHANGELOG

Complete history of updates, features, and improvements to the Bitcoin Nonprofit Directory. All changes are tracked with version IDs and deployment dates for full transparency.

122
UPDATES
5
CATEGORIES
28
PAGES
151
TESTS
April 10, 2026
Performancevpending

CSS-Only Nav Dropdowns: Removed Radix DropdownMenu from Critical Path

Replaced @radix-ui/react-dropdown-menu with a CSS-only hover/focus-within dropdown pattern in SiteNav. Both the LEARN and ADMIN desktop dropdowns now use Tailwind group + group-hover + group-focus-within utilities -- zero JavaScript for open/close state, no Radix dependency, no @floating-ui/react-dom transitive dependency. Result: radix-vendor chunk reduced from 105KB (34.2KB gzip) to 84.9KB (29.3KB gzip), saving 20KB raw / 4.9KB gzip from the first-paint critical path. Keyboard accessible via focus-within: Tab into trigger, Tab through items, focus departure closes panel. Mobile menu unchanged (already pure React state). TypeScript: 0 errors.

April 10, 2026
Performancevpending

Performance Recovery: Radix Split Reverted + Font Preloads + modulePreload Re-enabled

Three fixes after the Radix chunk split caused TBT regression (82 to 62). (1) Reverted radix-nav/radix-lazy split back to single radix-vendor chunk -- chunk fragmentation caused sequential fetch cascades on Slow 4G, increasing TBT from 510ms to 730ms. Single chunk fetches in parallel via modulepreload. (2) Re-enabled modulePreload: { polyfill: false } -- previously disabled entirely, which prevented parallel vendor chunk fetching. Now all vendor chunks (react-vendor, data-vendor, radix-vendor) preload in parallel on first visit. (3) Added font preload hints for IBM Plex Mono 600 and JetBrains Mono 400 -- Lighthouse flagged these 4 fonts (75KB total) with zero cache TTL. All 4 fonts now have explicit preload hints to eliminate render-blocking font fetch delays. TypeScript: 0 errors.

April 10, 2026
Performancevpending

Reduced Unused JS: Radix Chunk Split + Legal Comment Stripping

Two targeted fixes for Lighthouse unused JS diagnostics. (1) Split radix-vendor into radix-nav (dropdown-menu + tooltip + slot, 82KB -- needed on first paint for SiteNav) and radix-lazy (21 remaining Radix packages, 23KB -- deferred, only loads when user navigates to pages using dialogs/selects/accordions). Previously all 105KB of Radix loaded on first visit. (2) Added esbuild legalComments: none to strip @license JSDoc comment blocks from all bundles. ui-vendor (lucide-react) dropped from 26KB to 14.4KB -- the 2.4KB Lighthouse flagged as unminified was the preserved ISC license comment block. Licenses remain in package.json per npm convention. TypeScript: 0 errors.

April 10, 2026
Performancevpending

Eliminated Render-Blocking CSS Request (Est. 160ms FCP Savings)

Wrote a Vite build plugin (vite-plugin-critical-css.ts) that runs post-build to convert the render-blocking CSS stylesheet link to async loading. The plugin: (1) replaces the blocking <link rel=stylesheet> with <link rel=preload as=style onload=this.rel=stylesheet> -- the browser downloads the CSS without blocking the render tree, then swaps media to all once loaded; (2) adds a <noscript> fallback for non-JS environments; (3) extracts and inlines ~10KB of critical above-fold CSS (CSS custom properties/design tokens, @font-face declarations, @layer base resets) directly into <head> so the page renders with correct colors and typography before the async stylesheet arrives. This eliminates the 160ms render-blocking CSS request flagged by Lighthouse (index-HASH.css, 21.5KB transfer). The cloudflare-static/email-decode.min.js (490ms) is a Cloudflare Email Obfuscation feature -- disable it in Cloudflare dashboard under Speed > Optimization > Content Optimization > Email Address Obfuscation. TypeScript: 0 errors.

April 10, 2026
Bug Fixvpending

Accessibility: Fixed Heading Hierarchy Violation in SiteFooter

Replaced all four <h4> section labels (DIRECTORY, LEARN, RESOURCES, COMMUNITY) in SiteFooter.tsx with <p> elements styled identically using font-display text-sm text-primary. The footer sits below the page h1 with no intervening h2 or h3, so using h4 caused Lighthouse to flag a sequentially-descending heading order failure (Accessibility audit, NAVIGATION category). Also added aria-label attributes to each footer <nav> block for screen reader disambiguation. Visual appearance unchanged. TypeScript: 0 errors.

April 10, 2026
Performancevpending

Bundle Optimization: Main Entry 760KB → 445KB, Inflation Route 241KB → 84KB

Executed three targeted bundle optimizations to reduce TBT and initial JS parse cost. (1) Removed recharts (unused dead dependency -- only referenced by the unused shadcn chart.tsx component) and deleted chart.tsx. chart.js + react-chartjs-2 split into a separate chart-vendor chunk (157KB), reducing the Inflation route bundle from 241KB to 84KB (65% reduction). (2) Added radix-vendor manualChunk splitting all 24 @radix-ui packages into a separately cached chunk (105KB), preventing them from merging into the main entry. (3) Disabled Vite modulePreload injection (modulePreload: false) to prevent the browser from eagerly parsing all vendor chunks on every page load -- vendor chunks now load on-demand when lazy routes are first navigated to. (4) Converted Home.tsx from eager to lazy import in App.tsx, removing it and its dependency tree (nonprofits.ts, faqIndex.ts, SiteNav, NavSearch) from the synchronous entry parse path. Critical path JS on first visit reduced from ~915KB to ~640KB raw (28% reduction). TypeScript: 0 errors.

April 6, 2026
SEOvpending

dateModified Added to FAQPage JSON-LD Schema on All Org Profiles

Added a machine-readable dateModified property to the FAQPage JSON-LD schema block on all 13 organization profile pages. The value is sourced directly from each org's lastVerified field, ensuring the structured data timestamp stays in sync with the visible 'LAST VERIFIED' display. This reinforces the freshness signal to Google's crawlers and strengthens rich result eligibility for time-sensitive queries. RFUS and MFB lastVerified dates updated to 2026-04-06 to reflect today's faqOverrides enrichment. 0 TypeScript errors.

April 6, 2026
UI/UXvpending

Last Verified Timestamp Added to All Org Profile Pages

Added a visible 'LAST VERIFIED' timestamp to every organization profile page, rendered directly below the social badges in the hero section. Each org entry in nonprofits.ts now carries a lastVerified ISO date field (2026-02-12 for all current orgs). The timestamp displays with a Clock icon in monospace font, signaling data freshness to both users and search crawlers. Freshness signals are a direct ranking factor for research-oriented queries where recency matters. 0 TypeScript errors across all 13 org profiles.

April 6, 2026
SEOvpending

Precision faqOverrides Written for Brink

Added custom faqOverrides to the Brink org entry in nonprofits.ts. Brink is a bitcoin-only nonprofit supporting 7 Bitcoin Core developers with annual fellowships of approximately $100,000 per fellow. Overrides cover: bitcoin-only treasury rationale (no fiat donations accepted), fellowship program grant amounts ($700K/year total, $5M Start Small funding), Lightning and onchain donation instructions with EIN, protocol development rationale for holding Bitcoin, and treasury tracker context. 5 custom answers replace auto-generated bitcoin-only templates. 0 TypeScript errors.

April 6, 2026
SEOvpending

Precision faqOverrides Written for HRF and OpenSats

Added custom faqOverrides to Human Rights Foundation and OpenSats org entries in nonprofits.ts. HRF overrides cover: Bitcoin Development Fund grant history ($8.5M+, 1.3B sats latest round), authoritarian regime financial freedom rationale, BTCPay Server / Lightning donation instructions, and treasury tracker context. OpenSats overrides cover: 100% pass-through model, satoshi-denominated allocation tracking ($32.6M / 34.6B sats), separate operations budget structure, and Bitcoin Core / freedom tech developer grant rationale. Both orgs now have 5 custom answers replacing auto-generated templates. RFUS and MFB retain their existing overrides. 0 TypeScript errors.

April 6, 2026
UI/UXvpending

SEARCH ALL Added to LEARN Dropdown Navigation

Added a SEARCH ALL entry to the LEARN dropdown in the site navigation, pointing to /search. Exposes the dedicated search page to users who do not know the Cmd+K shortcut and gives crawlers a direct nav-level crawl path to the search index. Also visible in the mobile hamburger menu via the flat allMobileNavLinks list. 0 TypeScript errors.

April 6, 2026
Featurevpending

Dedicated /search Results Page with Full Index and Category Filters

Built a full /search results page exposing all 150+ FAQ questions, 13 org profiles, and 10 site pages in a single searchable interface. URL-driven via ?q= and ?type= query params for shareable, crawlable search URLs. Category filter tabs (All, Organizations, Pages, FAQ) with per-tab result counts. SearchAction JSON-LD schema block for Google Sitelinks Searchbox eligibility. NavSearch dropdown now shows a sticky 'View all results' footer button routing to /search?q=query. /search added to sitemap.xml. 0 TypeScript errors.

April 6, 2026
Featurevpending

Precision FAQ Overrides for RFUS and MFB

Added faqOverrides field to the Nonprofit type, enabling per-org custom answer copy that replaces auto-generated FAQ templates for specific questions. OrgFAQSection now checks for overrides before falling back to category-aware templates, keeping JSON-LD answerText in sync via applyOverride helper. Wrote precision answers for Rainforest Foundation US (Treasury for the Trees 100 BTC goal, inflation hedge rationale, direct contact for large donations, MicroStrategy comparison) and My First Bitcoin (100% BTC reserves, 800+ transactions, Lightning-first payment model, bankless operations, quarterly transparency reports). All other orgs continue using auto-generated templates. 0 TypeScript errors.

April 6, 2026
Featurevpending

Org Acronym Aliases Added to Search Index

Extended the FAQ search index with an ORG_ALIASES map that registers known acronyms and short names for all 13 organizations (HRF, RFUS, MFB, BDI, OpenSats, Brink, EverGive, Coin Center, Oxfam, Save the Children, MATTER, and others). Aliases are stored as lowercase strings on each FAQIndexEntry and matched case-insensitively in runSearch alongside question text. Typing 'HRF' now surfaces all 5 Human Rights Foundation FAQ questions with ORG FAQ badges. Typing 'RFUS' surfaces Rainforest Foundation US FAQ results. Typing 'MFB' surfaces My First Bitcoin FAQ results. Alias matching uses bidirectional substring logic: the query can contain the alias or the alias can contain the query, enabling both exact acronym matches and partial alias matches. 0 TypeScript errors.

April 6, 2026
Featurevpending

Cmd+K / Ctrl+K Global Search Shortcut

Added a global keydown listener to the NavSearch component that opens the search input when the user presses Cmd+K (Mac) or Ctrl+K (Windows/Linux) from any page. The shortcut fires regardless of which element has focus, with the exception of active text inputs and textareas to prevent interference with editing. A tooltip on the collapsed search icon button now displays a 'Search ⌘K' hint on hover, surfacing the keyboard shortcut to first-time users. The tooltip uses the neo-brutalism card style with a bordered kbd element consistent with the site design system. 0 TypeScript errors.

April 6, 2026
Featurevpending

FAQ Questions Added to Global Search Index

Extended the NavSearch component to include all FAQ questions from the site-level FAQ pages and all 13 org-specific FAQ sections in the search index. A shared faqIndex.ts module aggregates ~150 questions across 7 site-level FAQ pages (Directory, Treasury Tracker, Why Hold Bitcoin, BTC vs Inflation, Bitcoin Whitepaper, Verification Methodology, Resources) and 5-7 org-specific questions per organization (91 total org FAQ entries). Queries like 'how to donate bitcoin to human rights foundation' or 'does opensats hold bitcoin' now surface the matching FAQ question with an ORG FAQ or FAQ badge and route directly to the org profile or page with a #faq anchor hash. Deduplication by question text prevents duplicate entries across overlapping FAQ arrays. Results are capped at 3 orgs, 2 pages, and 5 FAQ questions per query (10 total). All 7 site-level FAQ section containers and the OrgFAQSection component received id='faq' anchor attributes to enable direct deep-linking. 0 TypeScript errors.

April 6, 2026
Featurevpending

Global Search Bar Added to Site Navigation Header

Added a NavSearch component to the site navigation header providing instant search across all 13 organizations and 10 site pages. Desktop: a search icon button in the right column of the nav expands to a 256px input field on click, with a 320px results dropdown appearing below. Mobile: a full-width search field appears at the top of the hamburger menu above the nav links. Search matches against org name, mission, and category label, plus page title and description. Results are ranked orgs-first then pages, capped at 8, and display a Bitcoin icon (orgs) or document icon (pages) alongside the category badge. Keyboard navigation: ArrowUp/ArrowDown to move through results, Enter to navigate, Escape to close. Click-outside closes the desktop dropdown. Navigating to any result collapses the search state and closes the mobile menu. 0 TypeScript errors.

April 6, 2026
SEOvea4b8d4

Org-Specific FAQ Sections Added to All 13 Organization Profile Pages

Added a dynamically generated FAQ section to every organization profile page via a new OrgFAQSection component. Each org receives 5-7 questions tailored to its category and data: 'Does [Org] hold Bitcoin?', 'How much Bitcoin does [Org] hold?', 'How do I donate Bitcoin to [Org]?', 'Is [Org] a verified Bitcoin treasury holder?', 'Why does [Org] hold Bitcoin instead of converting to fiat?', 'Can I get a tax deduction for donating Bitcoin to [Org]?', and a conditional treasury tracker question shown only for orgs with treasury-public or direct-btc badges. Answers are category-aware across confirmed, strong-evidence, bitcoin-only, platform, and unknown tiers. Internal Link components route to Verification Methodology, Treasury Tracker, Why Hold Bitcoin, Resources, and the directory. A FAQPage JSON-LD schema block is injected into every org page head using a separate answerText field for clean schema serialization. Targets long-tail queries like 'does HRF hold Bitcoin' and 'how to donate Bitcoin to Human Rights Foundation'. 0 TypeScript errors, 158 tests passing.

April 6, 2026
SEOva30f025

Internal Links Added to All FAQ Section Answers Across 7 Pages

Converted all FAQ answer arrays site-wide from plain strings to React.ReactNode, enabling internal Link components inside answer text. Affected pages: FAQSection.tsx (homepage), TreasuryTracker.tsx, WhyHoldBitcoin.tsx, Inflation.tsx, Whitepaper.tsx, VerificationMethodology.tsx, and Resources.tsx. A dual-field pattern was adopted: answer (ReactNode for rendering) and answerText (plain string for FAQPage JSON-LD schema serialization), preserving structured data integrity across all pages. Link targets added: Treasury Tracker referenced from Verification Methodology, Resources, and FAQSection; directory home referenced from Verification Methodology, FAQSection, and Resources; Why Hold Bitcoin referenced from Verification Methodology and Resources; Bitcoin Whitepaper referenced from Resources; Resources page referenced from FAQSection; Submit form referenced from Verification Methodology. Increases internal link equity distribution and provides crawlers additional paths between FAQ cluster nodes. 0 TypeScript errors, 158 tests passing.

March 11, 2026
Featurevpending

Live On-Chain Bitcoin Wallet Data on Treasury Tracker

Treasury Tracker now shows real-time on-chain stats for organizations with verified donation wallet addresses. New getAddressStats() helper in server/mempoolApi.ts queries the mempool.space public API (no API key required) for confirmed balance, total received, total sent, and transaction count. Results are cached server-side per address for 10 minutes. New bitcoin.getAddressStats tRPC public procedure exposes the data. WalletStatsRow React component renders inline stats with a Mempool.space explorer link. Organizations without a verified wallet show a WALLET NOT DISCLOSED badge. New donationWallet column added to btc_holdings table. Admin Treasury panel updated with wallet address input field. Rainforest Foundation US seeded with verified Treasury for the Trees address. 6 new Vitest tests added; all 158 tests passing.

March 4, 2026
UI/UXvpending

Changelog Hero: 2-Column Layout with Stat Grid and CTA Buttons

Restructured the /changelog hero section to match the homepage and other content pages. Left column: SITE UPDATES badge, CHANGELOG headline, description text, EXPLORE DIRECTORY (orange fill) and VIEW ROADMAP (outlined) CTA buttons. Right column: 2x2 stat grid with live counts for UPDATES, CATEGORIES, PAGES, and TESTS, top-aligned using items-start. Removed the separate Stats Summary section that previously sat below the hero. Mobile: single column stack. Desktop: side-by-side grid.

March 4, 2026
UI/UXvc3368b1

Research Date Badge: Dynamic CST Date

Replaced the hardcoded RESEARCH: FEB 28, 2026 badge on the homepage with a live date computed at render time. Added getCSTDate() helper using the browser Intl API with timeZone: America/Chicago, month: short, day: 2-digit, year: numeric. Badge now reads RESEARCH: MMM DD, YYYY in CST and auto-advances each day. Correctly handles CST/CDT transitions without any manual edits.

March 4, 2026
UI/UXvcaf2b88

Homepage Org Cards: WEBSITE, DONATE, VIEW FULL PROFILE Buttons Full-Width on Mobile

WEBSITE and DONATE buttons now stack full-width on mobile (flex-col on mobile, flex-row on sm+), centered text, 3px border-foreground border replacing the 4px brutalist-border. VIEW FULL PROFILE button gains w-full on mobile, w-auto on sm+. All three buttons now form a clean full-width stack on mobile that matches the badges and Citations pill above them. Desktop layout unchanged.

March 4, 2026
UI/UXvd3bbcc8

Homepage Org Cards: Citations Pill Full-Width on Mobile with 3px Border

Replaced the shadcn Badge component used for the Citations count with a custom div. On mobile: full-width, centered text, solid 3px border-foreground border. On sm+: inline auto-width, left-aligned. Visually consistent with the badge stack above it. OrganizationPage has no pill in the header (it renders a full CitationsList section in the body), so no change was needed there.

March 4, 2026
UI/UXv030c5fd

Homepage Org Cards: Badges and Stat Boxes Full-Width on Mobile

Badges (Verified by Community, Treasury Policy Public, Direct Bitcoin Donations) switched from flex-wrap to grid-cols-1 on mobile so each badge spans full width with centered text; reverts to flex-wrap on sm+. Added mobileFullWidth prop to Badge component. Stat boxes use grid-cols-2 on mobile; when the count is odd the last box gets col-span-2 to fill the full row instead of leaving a half-empty gap. Same stat box fix applied to OrganizationPage stats bar. Desktop layout unchanged.

March 4, 2026
Bug Fixvpending

Scroll-to-Top Fixed on All Pages

Fixed an issue where navigating to pages via the nav menu (e.g., White Paper, Methodology, Resources) would land mid-page instead of at the top. Root cause: wouter's client-side router does not automatically reset scroll position on route changes. Fix: added a global ScrollToTop component in App.tsx that calls window.scrollTo(0, 0) on every location change via useLocation. Applies to all 20+ routes site-wide with no per-page changes required.

March 4, 2026
Bug Fixv4eca9a4

OG Share Image Permanently Fixed (Self-Hosted with Correct MIME Type)

Root cause of broken social share previews identified: the CDN serving the OG image returned content-type: application/octet-stream instead of image/png. Facebook, Twitter/X, and LinkedIn all require a valid image MIME type to render share previews. Fix: moved og-image.btcnpdir.png into client/public/ so it is served directly from www.bitcoinnonprofit.directory/og-image.btcnpdir.png with the correct image/png content-type. Updated og:image and twitter:image in index.html and SEOHead.tsx default fallback to the new self-hosted URL. Added og:image:alt and twitter:image:alt tags.

March 4, 2026
Featurevc0b9bd9

Research Citations and Stat Boxes Added for Coin Center, Oxfam, Save the Children

Added 5 research citations each for Coin Center, Oxfam America, and Save the Children directly into the database. Citations include official donation pages, ProPublica tax filing records, EverGive partnership documentation, and media coverage. Added 4-box stat grids to all three org pages: Coin Center (Founded 2014, 501(c)(3), Policy Focus, EIN), Oxfam America (Founded 1970, $83M+ Revenue, Giving Block, EverGive), Save the Children (First BTC Charity 2013, 100+ Countries, EverGive, 501(c)(3)).

March 4, 2026
UI/UXv4eca9a4

Lucide Icons Added to Hero Stat Boxes on Resources, Methodology, and Submit Organization

Added orange Lucide icons above the stat numbers in all three newly added 4-square hero stat grids. Resources icons: Shield (custody), Calculator (accounting), Building (legal), Users (nonprofits). Methodology icons: Layers (tiers), Search (research), FileText (evidence types), BookOpen (citations). Submit Organization icons: List (orgs listed), CheckCircle (confirmed holders), Layers (verification tiers), Clock (review timeline). Matches the icon treatment used on the homepage hero stat boxes.

March 4, 2026
UI/UXv8f67366

4-Square Stat Grids Added to Resources and Methodology Hero Sections

Converted both the Treasury Resources and Verification Methodology hero sections from single-column to md:grid-cols-2 layout with a 4-box stat grid on the right side, matching the Why Hold BTC and BTC vs Inflation hero pattern. Resources stats: 12+ Custody Solutions, 5 Accounting Tools, 3 Legal Frameworks, 1500+ Nonprofits Accepting Crypto. Methodology stats: 5 Verification Tiers, 12 Orgs Researched, 3 Evidence Types, 85+ Citations Reviewed. All boxes use brutalist borders with dark background.

March 4, 2026
UI/UXvd2b6c1d

4-Square Stat Grid Added to Submit Organization Hero Section

Converted the Submit Organization hero from single-column to md:grid-cols-2 layout with a 4-box stat grid. Stats: 12 Orgs Listed (List icon), 3 Confirmed Holders (CheckCircle icon), 5 Verification Tiers (Layers icon), 30-Day Review Timeline (Clock icon). All four public content pages now have consistent 2-column hero layouts with stat grids: Resources, Methodology, Submit Organization, and Why Hold BTC.

March 4, 2026
Bug Fixvdbd989b

APPLY TO DIRECTORY Nav Button Border Restored on Submit Page

Fixed the APPLY TO DIRECTORY nav CTA button losing its white border when viewed on the /submit-organization page. Root cause: the active-state conditional class included border-primary, which replaced the base border-[#fafafa] class with an orange border -- rendering invisible against the orange button background. Fix: removed border-primary from the active state in SiteNav.tsx so the white border persists on all pages including the active submit-organization route.

March 4, 2026
Bug Fixv447708b

OG Image Restored with Permanent CDN URL

Fixed broken Open Graph image that prevented social sharing previews on Facebook, Twitter/X, and LinkedIn. Root cause: the OG image URL in index.html pointed to an expired manuscdn.com session file URL, and the image was injected via JavaScript which social crawlers cannot execute. Fix: regenerated a 1200x630px neo-brutalist OG image and uploaded it to the permanent CloudFront CDN. Updated both og:image and twitter:image meta tags in index.html to the permanent URL. Updated SEOHead.tsx default image fallback to the same permanent URL. Added og:image:width, og:image:height, and og:image:type meta tags for improved crawler compatibility.

March 3, 2026
UI/UXvd08bc23

LEARN Dropdown: Neo-Brutalist Styling + Mobile Hamburger Flush-Right Fix

Applied full neo-brutalist treatment to the LEARN dropdown: 3px #fafafa border, rounded-none, black background, monospace uppercase labels, orange hover fill, 4px white offset box-shadow, and dividers between items. Fixed mobile hamburger button alignment -- was drifting left due to flex layout; corrected to justify-end so it stays flush right on all mobile viewports.

March 3, 2026
UI/UXvaa7cc33

APPLY TO DIRECTORY Button Border Weight + Desktop Nav Gap Tightened

Increased APPLY TO DIRECTORY CTA button border from 2px to 3px to match the hero badge border weight and maintain visual consistency across the nav. Tightened desktop nav link gap from gap-6 to gap-5 for a more compact, intentional spacing rhythm.

March 3, 2026
UI/UXvbc2d0c2

Nav: SUBMIT Renamed to APPLY TO DIRECTORY + ADMIN Moved to Center Group

Renamed the desktop nav CTA from SUBMIT to APPLY TO DIRECTORY with updated sizing (text-base, px-5 py-2.5). Moved the ADMIN dropdown from the right column into the center nav group, positioned right of LEARN. Right column now contains only the APPLY TO DIRECTORY CTA button for visual clarity. Mobile nav unchanged.

March 3, 2026
UI/UXv5e64134

Desktop Nav: Full-Width Split Layout + Typography Tightening

Restructured desktop nav to a full-width split: logo pinned left, nav links centered, SUBMIT and ADMIN pinned right. Bumped nav font to text-sm with tracking-widest and gap-6 for a more authoritative typographic presence. Inactive nav text hardcoded to #fafafa on both desktop and mobile for consistent white rendering regardless of theme context.

March 3, 2026
UI/UXv9cd0517

Desktop Nav: Three-Column Grid Centering + White Inactive Text

Centered desktop nav links using a three-column CSS grid layout (logo | links | actions). Changed inactive nav link text from text-foreground/60 (dimmed) to text-foreground/80 (white) on both desktop and mobile, matching the neo-brutalist border color. Active state remains orange.

March 3, 2026
UI/UXvee2966c

LEARN Dropdown Added: White Paper, Methodology, Resources Grouped

Grouped WHITE PAPER, METHODOLOGY, and RESOURCES under a LEARN dropdown on the desktop nav. Desktop nav now shows DIRECTORY, BTC VS INFLATION, WHY HOLD BTC as primary text links, plus LEARN dropdown, SUBMIT CTA, and ADMIN dropdown. Mobile nav unchanged -- full flat list with all 6 links plus SUBMIT.

March 3, 2026
UI/UXv23c111a

Nav: SUBMIT CTA Border, Mobile SUBMIT Link, Admin Logout Option

Added 2px white border to the desktop SUBMIT CTA button. Added SUBMIT link to the mobile menu with orange highlight for visual distinction. Added Logout option (LogOut icon + separator) to the Admin dropdown on desktop and Admin section on mobile -- both call trpc.auth.logout and redirect to the homepage on success.

March 3, 2026
UI/UXvcf6cd0e

Nav: SUBMIT Converted to Orange CTA Button + Typography Tightened

Converted the SUBMIT nav link from a plain text link to an orange bordered CTA button on desktop. Reduced nav font from text-sm to text-xs with tracking-wide. Tightened nav link gap from gap-6 to gap-4. Mobile nav unchanged. This was the first step in the nav redesign sequence completed on March 3.

February 28, 2026
UI/UXvfa34712

Mobile Centering: Changelog & Category Page Heroes

Applied text-center md:text-left to Changelog and CategoryPage hero containers. Added mx-auto md:mx-0 to constrained paragraphs and justify-center md:justify-start to button rows. Migrated CategoryPage hero buttons to btn-primary and btn-secondary with w-full sm:w-auto. All hero sections now center on mobile and left-align on md+ consistently.

February 28, 2026
Bug Fixv46409db

Secondary Button Background Override Fix

Fixed .btn-secondary rendering orange instead of black. Root cause: shadcn Button default variant injects bg-primary as a Tailwind utility class at a higher cascade layer than @layer components, overriding the CSS rule. Added !important to background-color and color in both base and :hover states so all secondary buttons consistently render black background with white text and hover to white with black text.

February 28, 2026
UI/UXvc179cc1

Organization Profile Hero Audit & Standardization

Audited /org/[slug] hero section and applied six fixes: replaced shadcn Badge with standardized inline-block div carrying 3px solid #f9f9f9 border; added text-center md:text-left to hero container; added mx-auto md:mx-0 to mission paragraph; added justify-center md:justify-start to social badges row; converted button row to flex-col sm:flex-row with full-width mobile buttons; migrated DONATE BTC button from brutalist-border inline styles to .btn-secondary class.

February 28, 2026
UI/UXvf0cb311

Mobile Centering: Roadmap Hero Section

Applied text-center md:text-left to the Roadmap hero container, mx-auto md:mx-0 to the paragraph, and justify-center md:justify-start to the button row. Roadmap hero now centers on mobile and left-aligns on md+, matching the pattern used across all other pages.

February 28, 2026
UI/UXveac45f1

Roadmap Hero: EXPLORE DIRECTORY Primary CTA Added

Added EXPLORE DIRECTORY primary CTA button (btn-primary, links to /) to the Roadmap hero section alongside the existing REQUEST FEATURE button. Buttons wrapped in flex-col sm:flex-row gap-4 row, full-width on mobile and auto-width on sm+. Roadmap hero now follows the two-button primary + secondary pattern consistent with all other pages.

February 28, 2026
UI/UXvac13258

Roadmap Hero: REQUEST FEATURE Button Migrated to btn-secondary

Applied .btn-secondary utility class to the REQUEST FEATURE button on the Roadmap hero, replacing the default shadcn Button styling. Button now uses dark background, 8px white border, hover-to-white transition, and -2px lift effect, consistent with all other secondary hero CTAs across the site.

February 28, 2026
UI/UXv159d6d1

Design System Standardization: Hero Badges & Secondary Buttons

Completed full design system pass across all pages. Standardized all hero badges to use 3px solid #f9f9f9 border (fixed Roadmap, CaseStudyMFB, CaseStudyRFUS, Changelog, CategoryPage). Added .btn-secondary utility class to index.css with dark background, 8px white border, hover-to-white with -2px lift. Replaced all inline secondary button style blocks across Home, Inflation, Resources, SubmitOrganization, VerificationMethodology, and WhyHoldBitcoin with the single .btn-secondary class.

February 27, 2026
UI/UXv6890abe

Inflation Page Button Layout Matched to Homepage

Replaced full-width stacked button layout on the BTC vs Inflation hero with the exact side-by-side pattern used on the homepage. Both Explore Directory and Historical Performance buttons are now auto-sized to content on sm+ breakpoints, stack full-width on mobile, and share identical padding, border weight, and hover behavior as the homepage CTA buttons.

February 27, 2026
UI/UXvc88a77f

Inflation Page Hero CTA Buttons Added

Added two CTA buttons to the BTC vs Inflation hero section: Explore Directory (orange fill, brutalist border, links to main directory) and Historical Performance (dark fill, brutalist border, smooth scrolls to the charts section). Both buttons stack full-width and center on mobile, side-by-side on larger screens. Styling matches homepage CTA buttons exactly.

February 27, 2026
UI/UXv098bd0b

Inflation Page Hero Mobile Centering + Real-Time Data Badge Border

Applied full mobile centering to the BTC vs Inflation hero section: badge, Bitcoin icon, H1 title, and paragraph all center on small screens and shift left-aligned on md+ breakpoints. Added 3px solid #f9f9f9 border to the REAL-TIME DATA badge matching the Research badge style on the homepage.

February 27, 2026
UI/UXv6cff4b1

Orange Ambient Glow Applied to Directory Org Cards

Extended the orange ambient glow treatment (box-shadow: 0 4px 18px rgba(247,147,26, 0.10)) to all nonprofit directory listing cards. The entire page now shares a unified orange glow language from the hero stat cards and CTA buttons down through every org card in the directory.

February 27, 2026
UI/UXvb326305

Back to Top Button

Added a fixed-position Back to Top button (bottom-right corner) with orange fill, 4px #f9f9f9 brutalist border, and strong orange ambient glow. Button appears after scrolling 400px, inverts to white/black on hover, and uses the same lift animation as the CTA buttons. Passive scroll listener keeps performance clean.

February 27, 2026
UI/UXv311cef4

Explore Directory Hover Invert + Stat Cards Hover Lift

Explore Directory button now inverts to white fill with black text on hover, mirroring the Read Insights invert treatment. All 4 hero stat cards (Confirmed Holders, BTC Treasury Goal, BTC Payments, Accept Crypto) now lift 4px on hover with 150ms transition, consistent with button and org card behavior.

February 27, 2026
UI/UXv7ef162f

Read Insights Hover Invert + Global #f9f9f9 Border Color

Read Insights button now flips to white fill with black text on hover. Updated brutalist-border and brutalist-border-thick CSS classes globally from oklch(0.98 0 0) to #f9f9f9, propagating the exact border color to all bordered elements site-wide without inline overrides.

February 27, 2026
UI/UXv55a9a9c

Orange Ambient Glow on Hero Stat Cards

Applied matching orange ambient glow (box-shadow: 0 4px 18px rgba(247,147,26, 0.15)) to all 4 hero stat cards. Combined with the CTA button glow treatment, the entire above-the-fold section now shares a unified orange shadow language tied to the Bitcoin brand color.

February 27, 2026
UI/UXvad54d9b

Box-Shadow Added to CTA Buttons

Added color-matched ambient shadows to both hero CTA buttons. Explore Directory receives an orange glow (rgba(247,147,26, 0.35)) reinforcing the Bitcoin brand color. Read Insights receives a soft white glow (rgba(249,249,249, 0.12)) that lifts it off the dark background without competing with the primary button.

February 27, 2026
UI/UXvb0f6b19

Hover Lift Animation on Directory Org Cards

Applied transition-transform duration-150 hover:-translate-y-1 to all nonprofit directory cards, creating consistent interactive feedback across the full page. Org cards now lift 4px on hover matching the CTA button behavior.

February 27, 2026
UI/UXvebed15d

Hover Lift Animation on CTA Buttons

Added subtle lift animation (-translate-y-1, 150ms ease) to both Explore Directory and Read Insights buttons. Buttons lift 4px on hover and snap back on click (active:translate-y-0). Fast, clean, consistent with the neo-brutalist aesthetic.

February 27, 2026
UI/UXv323a68a

Hero Description Paragraph Centered on Mobile

Added text-center md:text-left to the hero description paragraph, completing the full mobile centering treatment across the hero section. All hero elements (badge, title, paragraph, buttons) now center on mobile and shift left-aligned on md+ breakpoints.

February 27, 2026
UI/UXv4c11808

Full Mobile Centering Pass on Homepage Hero

Applied comprehensive mobile centering to the homepage hero: Research badge centers, H1 title centers, both CTA buttons stack full-width and center, all mobile nav items center. Desktop layout unchanged. Buttons are equal width on mobile using w-full.

February 27, 2026
UI/UXv3f597ae

Prominent Mobile Hamburger Menu

Replaced the default ghost icon button with a custom 44x44px bordered square hamburger button. Uses strokeWidth=3 on both Menu and X icons (size 7), 2px solid border, and an invert hover state (white fill / dark icon). Matches the neo-brutalist design language and is clearly visible on all mobile breakpoints.

February 28, 2026
UI/UXvd023be9

DATA UPDATED HOURLY Label on Why Hold Bitcoin Hero

Added a pulsing orange dot and 'DATA UPDATED HOURLY — YAHOO FINANCE & FRED' label below the four stat boxes in the /why-hold-bitcoin hero section. Label uses monospace uppercase styling matching the site's data-source attribution pattern, confirming to readers that all live metrics refresh on a one-hour server-side cache cycle.

February 28, 2026
Featurev29e9f75

Live Stat Boxes Added to Why Hold Bitcoin Hero

Added four live data stat boxes to the right column of the /why-hold-bitcoin hero section, matching the BTC vs Inflation page design exactly. Box 1: BTC Price (live from Yahoo Finance). Box 2: 4-Year CAGR (calculated from 4-year price history). Box 3: Dollar Lost Since 2009 (cumulative CPI change from FRED CPIAUCSL series). Box 4: BTC Supply Left (static approximation: 21M minus estimated mined supply). Hero restructured to two-column grid layout. New server helper whyHoldBitcoinData.ts with 1-hour in-memory cache. New tRPC procedure whyHoldBitcoin.getStats. 5 new vitest tests added (78 total).

February 28, 2026
UI/UXv9b1c176

Research Citations Filter Desktop Layout Standardized

Replaced the outer bordered card container on the Research Citations filter with individual brutalist-bordered pills using flex-wrap layout, exactly matching the homepage directory filter pattern. Active state renders orange fill; inactive renders dark background. Mobile stacked layout inside the bordered card is unchanged. Hero badge date updated from FEB 27 to FEB 28, 2026.

February 27, 2026
UI/UXv5ddd203

Research Badge Date Updated to Feb 27, 2026

Updated the RESEARCH badge in the homepage hero from FEB 12, 2026 to FEB 27, 2026 to reflect the current audit date.

February 27, 2026
UI/UXv82f403b

Research Badge and CTA Buttons Border Color Unified to #f9f9f9

Research badge updated to 4px solid #f9f9f9 border. Read Insights button updated to match Explore Directory's 8px brutalist-border thickness, also in #f9f9f9. Both CTA buttons now have identical border weight and color.

February 27, 2026
UI/UXv4a6b0f9

Logo Redesigned to Text-Only BTCNPDIR Wordmark

Replaced the SVG Bitcoin B glyph logo with a clean text-only wordmark. BTC and DIR render in white, NP renders in orange (#f7931a) matching the site's primary brand color. Uses Space Mono bold for sharp, legible rendering at all sizes. Eliminates SVG rendering inconsistencies across browsers.

February 27, 2026
UI/UXv6b23bb5

Logo Height Increased to 42px

Bumped the BTCNPDIR wordmark height in the nav from 28px to 42px for stronger visual presence. The wordmark now reads sharp and bold in the navigation bar.

February 27, 2026
Featurevlatest

Added MATTER NGO – Tier 1 Confirmed Bitcoin Holder

Added MATTER, a Minnesota-based global NGO founded in 2002, as a Tier 1 Confirmed Bitcoin Holder. MATTER explicitly states on their donation page: 'We plan to HODL all Bitcoin contributions as an investment and we are not interested in flipping these funds for fiat.' This unambiguous public HODL policy meets the directory's confirmed-holder criteria. Profile includes full organization details, treasury timeline, donation instructions, stats ($848M+ in aid distributed), and contact information. Sitemap updated with /org/matter-ngo URL at priority 0.9.

February 27, 2026
UI/UXv4eaf7cb

Bitcoin ATH Timeline Update

Added October 2025 Bitcoin all-time high milestone ($126,000-$126,198) to inflation page timeline. New entry positioned chronologically between June 2025 My First Bitcoin operations and February 2026 directory launch. Timeline now contains 15 events spanning 2009 genesis block through 2026, documenting complete Bitcoin evolution from peer-to-peer cash to institutional reserve asset and nonprofit treasury adoption.

February 27, 2026
SEOvce7975c

Robots.txt Admin Blocking Enhancement

Enhanced robots.txt with wildcard Disallow: /admin/* rule to complement existing /admin and /admin/ blocks, ensuring comprehensive crawler blocking of all admin subpages. Added both www and non-www domain sitemaps for complete coverage. Verified proper formatting with User-agent, Disallow, Sitemap, and Crawl-delay directives. Combined with noindex meta tags, sitemap exclusion, and server-side sitemap route, admin pages now have four-layer defense against search engine indexing.

February 27, 2026
SEOv443e2c6

Admin Pages Noindex Meta Tags

Implemented defense-in-depth SEO protection for admin pages by adding noindex/nofollow meta tags. Created NoIndexMeta component using useEffect for client-side meta tag injection (compatible with SPA architecture). Added component to all 6 admin pages: AdminOverview, AdminSubmissions, AdminRoadmap, AdminAnalytics, AdminRankings, and AdminLogs. Installed react-helmet-async and configured HelmetProvider in main.tsx. Meta tags inject via JavaScript after page load, ensuring modern search engines (Google, Bing) that execute JavaScript will respect noindex directives.

February 27, 2026
SEOv63ff3ec

Sitemap Admin URL Fix

Fixed sitemap.xml serving admin URLs by adding explicit Express route to serve static sitemap file before catch-all handler. The deployed site was using a dynamic sitemap generator that auto-discovered routes from App.tsx, including admin routes. Added app.get('/sitemap.xml') route in server/_core/index.ts that explicitly serves the static sitemap.xml file from client/public, preventing dynamic generation. Verified local sitemap now serves 27 public URLs with zero admin routes.

February 27, 2026
Featurevb582b43

Organization Submission Backend with Admin Approval Workflow

Built full admin approval workflow with database schema enhancements (reviewedBy, reviewedAt, rejectionReason, adminNotes fields), tRPC procedures for approve/reject/delete operations with admin-only access control, modal-based UI for submission review, email notifications for status changes, and comprehensive audit logging. All 21 vitest tests passing. Enables scalable directory growth through community submissions with proper verification controls. Admin can approve submissions with optional notes, reject with required reason, or delete spam. Submitters receive email notifications on status changes.

February 27, 2026
SEOv9eec422

Article Schema Compliance Fix

Fixed Article schema compliance on Resources and SubmitOrganization pages by adding required author and datePublished fields. All 7 Article schemas now meet Google Search Console requirements. FAQPage schema verified with matching visible FAQ content (5 Q&A pairs). Site is fully compliant with structured data best practices for improved search engine visibility and rich results eligibility.

February 27, 2026
UI/UXv7464bc7

Changelog Consolidation

Consolidated CHANGELOG.md by merging 5 separate mobile fix entries into single comprehensive Mobile Responsiveness section, unified 2 admin navigation entries into Admin Navigation Architecture entry, removed redundant verification notes. Reduced from 150 to 119 lines while preserving all unique information.

February 27, 2026
Featurev67086b1

Admin Activity Logging System

Comprehensive audit trail for all admin panel actions. Created admin_activity_logs database table with userId, userName, action, entityType, entityId, details, timestamp columns. Implemented logAdminActivity() helper function for consistent logging. Instrumented logging for submission actions (approve, reject, delete), roadmap actions (status changes), and keyword ranking actions (add, delete). Created Activity Logs viewer page at /admin/logs with search, filter, and sortable table. Added Activity Logs link to Admin dropdown menu.

February 27, 2026
UI/UXvfdb3915

Active State Highlighting in Admin Dropdown

Added visual indication of current page in Admin dropdown menu. Current page menu item highlighted with orange background using useLocation hook for route detection. Implemented on both desktop dropdown and mobile expandable menu. Provides clear visual feedback showing user's current location within admin section.

February 27, 2026
UI/UXv1fe70e5

Breadcrumb Navigation for Admin Pages

Added breadcrumb navigation to all admin pages for better user orientation. Created reusable Breadcrumb component with Home icon, clickable path links, and ChevronRight separators. Breadcrumbs display 'Home > Admin > [Page Name]' hierarchy on all 6 admin pages. Styled with neo-brutalist design: font-mono, muted-foreground colors, primary hover states.

February 27, 2026
Featurev14f0d64

Route-Based Admin Pages

Converted state-based admin views to dedicated route-based pages. Split monolithic /admin page into 6 separate pages: /admin (Overview), /admin/submissions, /admin/roadmap, /admin/analytics, /admin/rankings, /admin/logs. Each admin page has dedicated URL, proper browser history support, and direct linking capability. Fixed 404 errors on /admin/analytics, /admin/submissions, and /admin/roadmap routes.

February 27, 2026
UI/UXv8590c14

Admin Navigation Consolidation

Unified admin navigation into SiteNav header dropdown. Added Admin dropdown to SiteNav (desktop + mobile) with role-based visibility (only shows when user.role === 'admin'). Dropdown menu items: Overview, Submissions, Roadmap, Analytics, Rankings, Activity Logs. Removed DashboardLayout wrapper and custom sidebars from all admin pages. Eliminated nested sidebar problem on mobile (previously had two competing navigation systems).

February 16, 2026
Bug Fixv9b264a5

Feature Recovery After Git Conflict

Recovered features lost during git conflict resolution: AI-Powered badge (purple, Sparkles icon) added to Badge component and My First Bitcoin organization. Restored CitationsList component with full filtering logic and added Research Citations section to organization profile pages. Fixed RFUS organization profile routing (slug mismatch). Restored FAQ section centering (text-center, mx-auto classes). Extracted code from git commits b71cb30 and 0c3e15c. All 49 tests passing after recovery.

February 16, 2026
SEOv958570d

Case Study Pages and Advanced SEO Infrastructure

Created two Bitcoin treasury case study pages: RFUS Treasury for the Trees (/case-studies/rainforest-foundation-treasury-for-trees) and MFB 100% Bitcoin Operations (/case-studies/my-first-bitcoin-operations). Both link to specific whitepaper sections (Incentive, Privacy, Introduction) to build supporting content cluster. Added whitepaper link to Resources page Education & Research section as third internal link pathway. Updated sitemap.xml with whitepaper (0.9 priority) and case studies (0.8 priority). Case studies capture long-tail keywords like 'Bitcoin nonprofit treasury case study' and 'nonprofit Bitcoin operations' while reinforcing topical authority.

February 15, 2026
SEOvTBD

Whitepaper SEO Optimization

Added internal links from homepage hero (READ WHITEPAPER button) and Why Hold Bitcoin sidebar to /bitcoin-whitepaper page. Updated sitemap.xml with whitepaper route at 0.9 priority. Implemented Article structured data with author (Satoshi Nakamoto), publication date (2008-10-31), and publisher info for rich search results. Internal link equity now flows from two high-authority pages to whitepaper.

February 15, 2026
UI/UXvTBD

Whitepaper Viewer Layout Refinement

Changed title to 'READ BITCOIN WHITEPAPER' and centered above viewport for better SEO keyword inclusion and visual hierarchy. Removed duplicate top navigation controls to reduce clutter. Retained only bottom full-width controls (PREVIOUS/1/9/NEXT) in mobile thumb-friendly zone. Cleaner, more focused user experience on both desktop and mobile.

February 15, 2026
Bug FixvTBD

Whitepaper Navigation and Mobile Viewport Fix

Fixed section navigation buttons to control embedded iframe using JavaScript (useRef + onClick) instead of opening new tabs. Added prev/next page controls with page counter positioned above iframe for desktop and below for mobile. Mobile users can now advance through all 9 pages using touch-friendly buttons. Implemented responsive iframe heights: 600px mobile, 800px tablet, 1000px desktop.

February 15, 2026
FeaturevTBD

WebP Image-Based Whitepaper Viewer

Replaced iframe PDF viewer with WebP image-based viewer after iframe security restrictions prevented hash navigation. Converted whitepaper to 9 optimized images (1.35MB total, 90% quality). Built custom React viewer with working PREV/NEXT buttons, keyboard navigation (arrow keys), and mobile swipe gestures. Fixed mobile viewport scroll issues with full-width images and native pinch-to-zoom. Changed URL from /whitepaper to /bitcoin-whitepaper for SEO optimization.

February 14, 2026
FeaturevTBD

Bitcoin vs Inflation Tracker with Historical Charts

Built real-time data dashboard at /inflation comparing Bitcoin performance against US CPI inflation and traditional assets (S&P 500, Real Estate, Gold). Integrates free APIs: FRED (Federal Reserve CPI data), Yahoo Finance (Bitcoin prices + market indices). 5 metric cards plus interactive Chart.js visualizations with dual Y-axis showing Bitcoin vs CPI over 1/5/10-year periods. Left Y-axis displays Bitcoin percentage change (orange), right Y-axis displays CPI inflation (white), allowing both datasets to use full chart height for optimal visibility. Neo-brutalist design with time period selector, 1-hour server-side caching, and mobile responsive layout. Provides data-driven context for nonprofits evaluating Bitcoin treasury strategies.

February 14, 2026
FeaturevTBD

Social Proof Badges for Organizations

Added trust indicators to organization cards and profile pages. Three badge types: Verified by Community (green checkmark), Treasury Policy Public (blue document), Direct Bitcoin Donations (orange Bitcoin icon). 8 organizations display badges based on verification status and treasury transparency. Badges increase credibility and help users identify trustworthy nonprofits at a glance.

February 14, 2026
Featurevef28bdd

Dynamic Changelog Stats

Made all stats auto-calculate: Updates count (changelog.length = 28), Categories count (unique categories = 5), Pages count (dynamic route counting excluding /admin = 20), Tests count (manual constant = 38). Moved stats section above changelog entries for better visibility. Stats now update automatically with each checkpoint instead of requiring manual updates.

February 14, 2026
Bug FixvTBD

Admin Panel Authentication Redirect

Fixed admin panel login redirect on production. Unauthenticated users now properly redirected to Manus OAuth portal instead of homepage.

February 14, 2026
SEOv9f62745

Page Title Length Optimization

Fixed Verification Methodology page title from 61 to 59 characters to meet Google's 60-character recommendation. All site pages now compliant.

February 14, 2026
UI/UXv26a5626

Roadmap Cleanup

Deleted test feature request from In Progress column. Roadmap now shows 4 planned items, 0 in progress, 1 completed (Admin Dashboard).

February 14, 2026
Featurev573bae0

Admin Dashboard for Organization Management

Built comprehensive admin panel at /admin with role-based access control. Includes 4 sections: Overview, Submissions, Roadmap, and Analytics. 38 vitest tests passing.

February 14, 2026
Featurev14770b5

Roadmap Seeded with 5 Initial Items

Populated roadmap with 5 strategic features. Demonstrates active development and encourages community voting.

February 14, 2026
Featurev07fe8f6

Community Roadmap with Voting

Built public roadmap page at /roadmap with Kanban layout (Planned, In Progress, Completed). Users can vote on features, submit requests (auth required), and track development progress. Database-backed with roadmap_items and roadmap_votes tables, duplicate vote prevention, and owner notifications. 24 vitest tests passing.

February 14, 2026
SEOv422371d

Meta Description Optimization

Fixed all 11 organization page meta descriptions to meet Google's 50-160 character recommendation. Reduced 9 violations (164-200 chars) to compliant lengths (128-155 chars) by removing filler words and using BTC abbreviation.

February 14, 2026
Featurevcc1ef8b

Changelog Page

Created /changelog page documenting all site updates with version IDs, dates, and categories (Feature, SEO, Performance, Bug Fix, UI/UX). Added Changelog link to footer navigation and updated sitemap.

February 14, 2026
UI/UXve0cb695

FAQ Section Added

Added visible FAQ accordion section to homepage with 5 common questions about nonprofits holding Bitcoin. Matches existing FAQ schema for SEO alignment with neo-brutalist design and animated expand/collapse.

February 14, 2026
Bug Fixvda3ece8

Code Splitting Fix

Fixed black screen issue caused by incorrectly lazy-loading the Toaster component. Kept Toaster as regular import while maintaining lazy loading for all page components.

February 13, 2026
Performanceva647234

Self-Hosted Fonts

Eliminated 750ms render-blocking CSS request by self-hosting Google Fonts (Orbitron, Space Mono) on CDN. Reduced critical request chain depth and improved PageSpeed score to 85+ desktop.

February 13, 2026
UI/UXv87bfba4

Button Sizing & Touch Targets

Increased hero CTA buttons, VIEW FULL PROFILE buttons, nav links, filter buttons, and footer links to meet 48px minimum touch target requirement. Improved mobile usability across all pages.

February 13, 2026
SEOvfbe044f

Domain Standardization

Updated all domain references from bitcoinnonprofit.directory to www.bitcoinnonprofit.directory across canonical tags, Open Graph URLs, Twitter Cards, sitemap.xml (16 URLs), robots.txt, and structured data.

February 13, 2026
Featurev03770a2

Community Submission System

Upgraded to web-db-user. Added organization_submissions database table, tRPC API routes for create/list/updateStatus, connected frontend form to backend, implemented owner notifications, and wrote 12 passing vitest tests.

February 13, 2026
Featurevf56f5a4

Supporting Content Pages

Added 4 new pages: /why-hold-bitcoin (educational), /verification-methodology (transparency), /submit-organization (community form), /resources (curated tools). Created shared SiteNav and SiteFooter components.

February 13, 2026
Featurev55d69d9

Individual Organization Pages

Added 11 dedicated pages at /org/{slug} with expanded profiles, treasury timelines, donation instructions, related organizations, and per-page JSON-LD structured data. Updated sitemap with all org URLs.

February 13, 2026
SEOvd4c5ae9

Dynamic Document Title

Added dynamic document.title updates via useEffect on all pages for proper browser tab titles.

April 6, 2026
SEOvpending

inLanguage Added to All 7 Cluster Page Schemas

Added inLanguage: 'en' to all 7 cluster page schemas (Home, TreasuryTracker, WhyHoldBitcoin, Inflation, Whitepaper, VerificationMethodology, Resources). Explicit language declaration improves multilingual disambiguation for Google's entity graph and satisfies Schema.org completeness requirements. 0 TypeScript errors.

April 6, 2026
SEOvpending

keywords Property Added to All Org Profile Schemas

Added a dynamic keywords property to the Organization schema on all 13 org profile pages via OrganizationPage.tsx. Keywords are generated from org name, category, and donation context (e.g., 'HRF bitcoin, HRF bitcoin donation, HRF bitcoin treasury, bitcoin nonprofit confirmed holder, donate bitcoin to HRF'). Extends the keyword signal layer from cluster pages to individual org profiles. 0 TypeScript errors.

April 6, 2026
SEOvpending

Rich Results Test: Fixed 5 Non-Critical Article Schema Issues

Resolved all 5 non-critical warnings flagged by Google Rich Results Test on the Verification Methodology page. Fixes applied across all 4 Article schemas (WhyHoldBitcoin, Whitepaper, VerificationMethodology, Resources) and all 7 cluster page schemas: (1) datePublished and dateModified upgraded from date-only format (YYYY-MM-DD) to ISO 8601 datetime with UTC timezone (YYYY-MM-DDT00:00:00+00:00) -- Google requires timezone for valid datetime parsing; (2) image property added as ImageObject (1200x630 OG image) to all 4 Article schemas -- resolves 'Missing field image (optional)' warning. Also fixed lastVerified-derived dateModified on all 13 org profile FAQPage schemas. TypeScript: 0 errors.

April 6, 2026
SEOvpending

Whitepaper Article Schema: Upgraded image to ImageObject

Fixed the remaining non-critical Article schema warning on the Whitepaper page. Root cause: the image property was a bare string URL instead of an ImageObject. Google's Rich Results validator requires @type, url, width, and height on the image object for Article schemas. Upgraded to ImageObject with url (whitepaper-page-1.webp), width: 816, height: 1056. All 7 cluster pages now show 0 non-critical Article schema warnings. TypeScript: 0 errors.

April 8, 2026
SEOvpending

Critical Fix: Canonical Domain Conflict Causing Google 403 Indexing Block

Root cause of Google Search Console 403 indexing block identified and resolved. The server (Cloudflare) redirects www.bitcoinnonprofit.directory to bitcoinnonprofit.directory (non-www is the server canonical). However, all canonical tags, Open Graph URLs, Twitter Card URLs, sitemap.xml (30 URLs), and robots.txt sitemap references were pointing to www.bitcoinnonprofit.directory. This created a three-way conflict: Google followed sitemap to www URL, server 301 redirected to non-www, page canonical pointed back to www -- a redirect loop that produced the 403 block. Fix: updated all 18 affected files (18 pages, SEOHead component, sitemap.xml, robots.txt) to use https://bitcoinnonprofit.directory (non-www) as the canonical domain. Also removed duplicate Sitemap entry in robots.txt. TypeScript: 0 errors.

April 8, 2026
Performancevpending

Core Web Vitals: Font CDN Migration, Preload Hints, and Chunk Splitting

Implemented PageSpeed audit recommendations to reduce LCP and eliminate render-blocking font latency. (1) Migrated all 7 font files (Space Grotesk 700, IBM Plex Mono 400/500/600, JetBrains Mono 400/600/700) from path-based CDN URLs to content-hashed CDN URLs (e.g. space-grotesk-700-latin_e3be01fc.woff2) enabling immutable Cache-Control headers and eliminating cache TTL: None. (2) Added preload hints in index.html for Space Grotesk 700 and IBM Plex Mono 400 -- the two fonts used above-fold in the hero headline and body text -- reducing LCP font blocking. (3) Expanded Vite manualChunks to split react-vendor, data-vendor (tRPC + React Query + superjson), ui-vendor (lucide-react + framer-motion), and router-vendor (wouter) into separate cacheable chunks. Route-based code splitting via React.lazy was already in place across all 25+ routes. Build target es2020 was already set. email-decode.min.js was not present in the codebase. TypeScript: 0 errors.

April 10, 2026
Performancevpending

Removed email-decode.min.js Render Blocker: Email Text Replaced with Mail Icon Buttons

Eliminated Cloudflare's email-decode.min.js render-blocking script (160ms FCP/LCP penalty) by removing all raw email address text from the DOM. Previously, the CONTACTS section on homepage org cards and individual org profile pages rendered email addresses as visible text (e.g. 'Beth Duncan: [email protected]'), triggering Cloudflare Email Address Obfuscation which injects email-decode.min.js as a blocking script on every page load. Fix: replaced all contact email text with mail icon + name buttons (mailto: href). The email address is now only in the href attribute -- never rendered as visible text -- so Cloudflare has nothing to obfuscate. Changes applied to Home.tsx (org card CONTACTS section) and OrganizationPage.tsx (sidebar CONTACTS card). Cloudflare Email Address Obfuscation can now be safely disabled in Cloudflare Dashboard > Speed > Optimization > Content Optimization. TypeScript: 0 errors.

April 10, 2026
UI/UXvpending

Donate Bitcoin Button Added to All Org Cards in Directory

Added a prominent orange DONATE BITCOIN button to every organization card in the homepage directory. Previously, only 6 of 13 orgs showed a DONATE button (those with an explicit donationPage field). The new button uses donationPage when available and falls back to the org's website for the remaining 7 orgs, ensuring 100% of cards have a direct donation CTA. Button is styled in primary orange (bg-primary text-primary-foreground) with a Bitcoin icon to visually distinguish it from the WEBSITE button. On hover, it inverts to an outlined state. TypeScript: 0 errors.

April 10, 2026
Featurevpending

Donation Page URLs Added for All 7 Previously Missing Orgs

Researched and added verified donationPage URLs for the 7 organizations that previously lacked them: Rainforest Foundation US (rainforestfoundation.org/give/bitcoin/), My First Bitcoin (pay.zaprite.com/pl_s2HGn0M9zn -- their official Zaprite Bitcoin/Lightning crowdfunding page), Bitcoin District Initiative (geyser.fund/project/bitcoindc), EverGive (app.evergive.com/donate/select), The Bitcoin Endowment (thebitcoinendowment.org/for-nonprofits/), Save the Children (savethechildren.org/us/ways-to-help/donate-bitcoin-to-charity), and Oxfam America (oxfamamerica.org/donate/donate-crypto/). All 13 orgs in the directory now have explicit donationPage fields. The DONATE BITCOIN button on each card now links directly to each org's dedicated donation page rather than falling back to the general website. TypeScript: 0 errors.

April 10, 2026
Bug Fixvpending

LEARN and ADMIN Dropdowns Now Work on iPad and Touch Devices

The desktop nav dropdowns (LEARN and ADMIN) were CSS-only hover-based and completely non-functional on touch devices including iPad, where hover events never fire. Refactored NavDropdown component to use a hybrid approach: CSS group-hover continues to handle mouse devices with seamless hover behavior, while a new onClick toggle state handles tap interactions on touch screens. Added click-outside-to-close via mousedown/touchstart document listeners that are attached only when the dropdown is open (no passive listeners on every render). The chevron icon rotates correctly on both hover and tap. Both LEARN and ADMIN dropdowns share the same NavDropdown component so the fix applies to both simultaneously. TypeScript: 0 errors.

April 10, 2026
UI/UXvpending

Desktop Nav Restructured: DIRECTORY | LEARN | RESOURCES

Restructured the desktop navigation from a 6-item crowded layout (DIRECTORY, BTC VS INFLATION, WHY HOLD BTC, LEARN dropdown, ADMIN dropdown, APPLY button) to a clean 3-item structure: DIRECTORY (direct link), LEARN dropdown (White Paper, BTC vs Inflation, Why Hold BTC, Treasury Tracker, Methodology), and RESOURCES dropdown (Case Studies, Roadmap, Changelog, Search All). BTC vs Inflation and Why Hold BTC moved from top-level nav items to sub-items under LEARN where they belong as educational content. Case Studies, Roadmap, and Changelog are now accessible directly from the nav for the first time. Mobile hamburger menu was not changed. TypeScript: 0 errors.

April 11, 2026
Bug Fixvpending

Security Hardening: Full Audit -- SQL Injection, CVE Patches, HTTP Headers, Rate Limiting

Comprehensive security audit and remediation. (1) SQL Injection: replaced all sql.raw() string interpolation in admin procedures (submissions.approve, reject, delete; treasury.upsert, delete) with parameterized Drizzle sql template literals -- values now bind at the driver level, not via fragile manual escaping. (2) Axios updated from 1.12.2 to 1.15.0 -- fixed 3 critical CVEs: SSRF via NO_PROXY bypass, CSRF via cross-origin redirect, and prototype pollution. (3) drizzle-orm updated from 0.44.7 to 0.45.2 -- fixed CVE for SQL injection via improperly escaped SQL identifiers. (4) AWS SDK updated -- fixed fast-xml-parser CVEs affecting S3 XML response parsing. (5) HTTP security headers added via helmet: Content-Security-Policy, X-Frame-Options (DENY), X-Content-Type-Options, Strict-Transport-Security (HSTS), Referrer-Policy, Permissions-Policy. (6) Body parser limit reduced from 50MB to 1MB -- prevents request body DoS attacks on public endpoints. TypeScript: 0 errors.

April 11, 2026
Bug Fixvpending

Security Hardening: SQL Injection Fix and Rate Limiting

Fixed two SQL injection vulnerabilities in public-facing procedures: citations.getByOrganization and resourceClicks.track were using sql.raw() with manual string escaping (fragile, bypassable). Replaced with Drizzle parameterized sql template literals which bind values safely at the driver level. Added IP-based rate limiting to the submissions.create endpoint: 5 submissions per IP per hour with a sliding window, automatic stale-entry cleanup every 10 minutes, and X-Forwarded-For support for proxy environments. CSRF analysis: session cookies are httpOnly (no JS access) and sameSite:none is required for the OAuth flow; tRPC uses credentials:include so the CSRF risk on public endpoints is low. TypeScript: 0 errors.

April 10, 2026
Featurevpending

New Page: /case-studies Index Page

Built a new /case-studies index page that lists all published case studies with summary cards, key metrics, and READ CASE STUDY CTAs. The page matches the site's neo-brutalist design language with the RESOURCES category badge, hero section, stats bar, and article cards with 4-metric grids. Both existing case studies are listed: Treasury for the Trees (RFUS) and 100% Bitcoin Operations (MFB). A 'More Case Studies Coming' section at the bottom links back to the directory. Route registered in App.tsx as a lazy-loaded chunk. TypeScript: 0 errors.