Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 32 additions & 21 deletions manualtasksforsparsh.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,26 @@

---

## Domain & DNS
## WEBSITE COPY REVIEW (NEW)

From latest session:
- [ ] **Review homepage copy** — Verify all 6 sections render correctly:
1. Hero ("Proof without surrender.")
2. Who uses OpenProof (8 audiences)
3. How it works (3 steps)
4. When to timestamp (4 scenarios)
5. What a proof means (proves vs doesn't prove)
6. Privacy by design (4 pillars)
- [ ] **Review About page** — New "Who uses" and "When to use" sections
- [ ] **Review Create/Verify pages** — Updated header copy
- [ ] **Check for hydration errors** — Open DevTools Console, should be clean
- [ ] **Check offline notice** — Should NOT appear on localhost
- [ ] **Deploy to production** — Push latest changes to main triggers Vercel deploy
- [ ] **Verify production** — Visit https://proof.kovina.org, check copy and console

---

## DOMAIN & DNS

- [x] Cloudflare CNAME `proof → cname.vercel-dns.com` — DONE
- [x] Vercel domain `proof.kovina.org` registered — DONE
Expand All @@ -111,26 +130,18 @@

---

## v0.9.0 What Was Done (Automated)

These tasks were completed automatically this session:
- [x] Windows MSIX: Updated AppxManifest.xml version to 0.9.0.0
- [x] Windows MSIX: Generated splash screens (620x300, 868x420, 1116x540) with centered icon on black
- [x] PWA: Updated manifest theme_color to #0081CC (brand), background_color to #000000 (black)
- [x] PWA: Added `theme-color` meta tag to layout
- [x] PWA: Created `PwaInstallPrompt` component (beforeinstallprompt handling + update flow notification)
- [x] PWA: Added `/proof/` and `/bundle/` routes to SW static cache
- [x] Android: Initialized Capacitor project with `npx cap add android`
- [x] Android: Created `scripts/cap-build.sh` for static export + Capacitor sync
- [x] Android: Updated capacitor.config.json with 4 plugins (Filesystem, Keyboard, Share, SplashScreen)
- [x] Android: Dynamic routes support static export via `generateStaticParams`
- [x] Icons: All platform icons regenerated from canonical SVG
- [x] Footer: Version updated to v0.9.0
- [x] Lint: 0 errors (6 pre-existing warnings) ✅
- [x] Typecheck: Pass ✅
- [x] Build (Vercel mode): Pass ✅
- [x] Build (Capacitor static export): Pass ✅
- [x] Updated PLATFORM_READINESS.md to v0.9.0
## v0.9.0 — Completed (Automated)

- [x] Windows MSIX: AppxManifest.xml v0.9.0.0, splash screens (620×300, 868×420, 1116×540)
- [x] PWA: manifest theme #0081CC, background #000000, theme-color meta tag
- [x] PWA: PwaInstallPrompt component (beforeinstallprompt + update notification)
- [x] PWA: SW cache extended to /proof/ and /bundle/ routes
- [x] Android: Capacitor project initialized, build script created, 4 plugins configured
- [x] Website copy: Homepage rewritten with 6 sections, About page enhanced, SEO metadata enriched
- [x] Hydration fix: suppressHydrationWarning on <html>, offline hook rewritten with useSyncExternalStore
- [x] Icons: All platform variants regenerated from SVG
- [x] Version references: Footer, create page, about page all v0.9.0
- [x] Lint / typecheck / build: All passing

---

Expand Down
2 changes: 1 addition & 1 deletion src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
<html lang="en" className={`${geistMono.variable} h-full antialiased`}>
<html lang="en" className={`${geistMono.variable} h-full antialiased`} suppressHydrationWarning>
<body className="min-h-full flex flex-col bg-bg-base text-text-primary">
<link rel="manifest" href="/manifest.json" />
<script
Expand Down
6 changes: 5 additions & 1 deletion src/components/offline-notice.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ export function OfflineNotice() {
if (isOnline) return null;

return (
<div className="fixed bottom-4 left-4 right-4 z-50 mx-auto max-w-lg rounded-full bg-error/90 px-6 py-3 text-sm font-semibold text-white text-center shadow-lg backdrop-blur-sm">
<div
aria-live="assertive"
className="fixed bottom-4 left-4 right-4 z-50 mx-auto max-w-lg rounded-full bg-error/90 px-6 py-3 text-sm font-semibold text-white text-center shadow-lg backdrop-blur-sm"
role="alert"
>
You are offline. Onchain verification requires an internet connection.
</div>
);
Expand Down
31 changes: 14 additions & 17 deletions src/lib/offline.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
"use client";

import { useEffect, useState } from "react";
import { useSyncExternalStore } from "react";

export function useOnlineStatus() {
const [isOnline, setIsOnline] = useState(
typeof navigator !== "undefined" ? navigator.onLine : true,
);

useEffect(() => {
function handleOnline() { setIsOnline(true); }
function handleOffline() { setIsOnline(false); }
function getOnlineSnapshot() {
return typeof navigator !== "undefined" ? navigator.onLine : true;
}

window.addEventListener("online", handleOnline);
window.addEventListener("offline", handleOffline);
return () => {
window.removeEventListener("online", handleOnline);
window.removeEventListener("offline", handleOffline);
};
}, []);
function subscribeToOnline(callback: () => void) {
window.addEventListener("online", callback);
window.addEventListener("offline", callback);
return () => {
window.removeEventListener("online", callback);
window.removeEventListener("offline", callback);
};
}

return isOnline;
export function useOnlineStatus() {
return useSyncExternalStore(subscribeToOnline, getOnlineSnapshot, () => true);
}
Loading