diff --git a/TODO.md b/TODO.md index 758de67..d296631 100644 --- a/TODO.md +++ b/TODO.md @@ -2,14 +2,64 @@ ## Before Production -- [ ] **Turnstile keys** - Set `NEXT_PUBLIC_TURNSTILE_SITE_KEY` and `TURNSTILE_SECRET_KEY` in production environment -- [ ] **Rate limiting** - Consider adding rate limiting to contact form (Upstash, Vercel Edge Config, etc.) +- [x] **Turnstile keys** - Set `NEXT_PUBLIC_TURNSTILE_SITE_KEY` and `TURNSTILE_SECRET_KEY` in production environment ## Nice to Have +- [ ] **Blog** - Consider adding blog/articles section (MDX, Contentlayer, or headless CMS) +- [ ] **Rate limiting** - Turnstile handles bots; add rate limiting only if abuse observed - [ ] Manual screen reader testing (NVDA, VoiceOver) - [ ] Further canvas performance optimization +## Future Projects + +- [ ] Puzzle game (mobile app with web demo) +- [ ] Decision making app (mobile app with web demo) + +--- + +## Architecture Notes (Feb 2026) + +### Blog Options + +| Option | Pros | Cons | Best For | +|--------|------|------|----------| +| **MDX in repo** | Simple, version controlled, no deps | Dev-only editing, rebuild to publish | Tech blog, infrequent posts | +| **Contentlayer** | Type-safe MDX, great DX with Next.js | Learning curve, config overhead | Structured content, many posts | +| **Headless CMS** (Sanity/Payload) | Non-dev editing, media management | External dependency, cost at scale | Team editing, media-heavy | + +Recommendation: Start with MDX in `apps/web/src/content/blog/`, add Contentlayer if it grows. + +### New App Architecture + +**Option A: Monorepo (web demos)** +``` +apps/ + web/ # such.software + puzzle-demo/ # Vite or Next.js + decision-demo/ # Vite or Next.js +packages/ + ui/ # Shared (already exists) +``` +- ✅ Share `@repo/ui`, unified CI/CD, easy cross-linking +- ❌ Coupled deploys, heavier repo + +**Option B: Separate repos + subdomains** +- `puzzle.such.software` → own repo +- `decide.such.software` → own repo +- ✅ Independent deploys, clean separation +- ❌ No shared packages, more repos to manage + +**Option C: Hybrid (recommended)** +- Web demos in this monorepo (lightweight, share UI) +- Mobile apps in separate repos (React Native/Expo needs own tooling) +- Link from such.software portfolio to demos + +### Mobile Considerations +- React Native/Expo likely needs separate repo due to tooling differences +- Web demos can use same game logic via shared `packages/` if extracted +- Consider Expo Web for code sharing between mobile and web demo + ## Completed ### Lighthouse Scores (January 2026) diff --git a/apps/web/public/images/smirk-wallet.png b/apps/web/public/images/smirk-wallet.png new file mode 100644 index 0000000..b9e9923 Binary files /dev/null and b/apps/web/public/images/smirk-wallet.png differ diff --git a/apps/web/src/app/about/page.tsx b/apps/web/src/app/about/page.tsx index 4a8e90c..e0d5a97 100644 --- a/apps/web/src/app/about/page.tsx +++ b/apps/web/src/app/about/page.tsx @@ -1,7 +1,7 @@ import { FounderSignature } from "@/components/about/founder-signature"; import { Header } from "@/components/layout/header"; import { FaMapMarkerAlt, FaPhone, FaBuilding, FaExternalLinkAlt } from "react-icons/fa"; -import { FaXTwitter, FaTelegram, FaReddit } from "react-icons/fa6"; +import { FaXTwitter, FaTelegram, FaDiscord } from "react-icons/fa6"; import type { Metadata } from "next"; export const metadata: Metadata = { @@ -79,9 +79,9 @@ export default function AboutPage() { Telegram - - - Reddit + + + Discord diff --git a/apps/web/src/components/about/founder-signature.tsx b/apps/web/src/components/about/founder-signature.tsx index 3f8eb36..e159fcd 100644 --- a/apps/web/src/components/about/founder-signature.tsx +++ b/apps/web/src/components/about/founder-signature.tsx @@ -25,7 +25,11 @@ export const FounderSignature = () => {

Founder & Principal Engineer

-

John Winter Murphy

+

+ + John Winter Murphy + +

diff --git a/apps/web/src/components/layout/footer.tsx b/apps/web/src/components/layout/footer.tsx index c643b27..26b12da 100644 --- a/apps/web/src/components/layout/footer.tsx +++ b/apps/web/src/components/layout/footer.tsx @@ -2,7 +2,7 @@ import Link from "next/link"; import { SiteLogo } from "./site-logo"; -import { FaXTwitter, FaTelegram, FaReddit, FaPhone } from "react-icons/fa6"; +import { FaXTwitter, FaTelegram, FaDiscord, FaPhone } from "react-icons/fa6"; export function Footer() { return ( @@ -52,9 +52,9 @@ export function Footer() { Telegram - - - Reddit + + + Discord diff --git a/apps/web/src/components/portfolio/bento-grid.tsx b/apps/web/src/components/portfolio/bento-grid.tsx index 5d93063..4459d1a 100644 --- a/apps/web/src/components/portfolio/bento-grid.tsx +++ b/apps/web/src/components/portfolio/bento-grid.tsx @@ -85,6 +85,25 @@ export const PortfolioGrid = () => { + + {/* Quinary: Smirk Wallet */} + + +
+

Smirk Wallet

+

Non-custodial browser wallet with encrypted social tipping.

+
+
+ Screenshot of Smirk Wallet browser extension showing multi-currency support for BTC, LTC, XMR, WOW, and GRIN +
+
+ ); }; \ No newline at end of file