- Such Software is a software studio in Kennett Square, PA. Founded by John Winter Murphy, we build accessible e-commerce websites, crypto infrastructure, and original mobile apps and games.
+ Such Software is a software studio in Kennett Square, PA, founded by John Winter Murphy, whose background is in nuclear and radiation science: a radiation-detector PhD and six years at Lawrence Livermore National Laboratory. We build accessible e-commerce websites, crypto infrastructure, and original mobile apps and games (including a series of nuclear-themed games), and offer nuclear and radiation modeling consulting.
diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx
index a6c86af..d71d51f 100644
--- a/apps/web/src/app/page.tsx
+++ b/apps/web/src/app/page.tsx
@@ -7,60 +7,89 @@ import { ServicesPreview } from "@/components/landing/services-preview";
import { Header } from "@/components/layout/header";
import { MobileNav } from "@/components/layout/mobile-nav";
import { DynamicBackground } from "@/components/landing/dynamic-background";
+import { HeroSplash } from "@/components/landing/hero-splash";
import { ScrollReveal } from "@/components/scroll-reveal";
-import Link from "next/link";
import { Button } from "@repo/ui/components/button";
-import { useRef, useState, useEffect } from "react";
+import Link from "next/link";
+import { useEffect, useLayoutEffect, useRef, useState } from "react";
+
+// Avoid the "useLayoutEffect does nothing on the server" warning during SSR.
+const useIsoLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
export default function Home() {
+ // The splash owns the first screen. Once the visitor scrolls through it (or hits
+ // "Explore"), we "enter" the site: the splash unmounts for good and the real hero,
+ // header, bottom nav, and background take over. Scrolling back up lands on the hero,
+ // never the splash again.
+ const [entered, setEntered] = useState(false);
+ const splashRef = useRef(null);
+ const restoreScroll = useRef(0);
+
+ // Deliberately place the nebula/monitor just to the left of the hero title, at any
+ // screen width (restored from the original hero).
const titleRef = useRef(null);
const [nebulaPosition, setNebulaPosition] = useState<{ x: number; y: number } | null>(null);
+ // Dismiss the splash once it has fully scrolled out of view.
+ useEffect(() => {
+ if (entered) return;
+ const el = splashRef.current;
+ if (!el) return;
+ const io = new IntersectionObserver(
+ ([entry]) => {
+ if (!entry.isIntersecting) {
+ restoreScroll.current = Math.max(0, window.scrollY - el.offsetHeight);
+ setEntered(true);
+ }
+ },
+ { threshold: 0 },
+ );
+ io.observe(el);
+ return () => io.disconnect();
+ }, [entered]);
+
+ // After the splash unmounts, keep the visitor's position in the content stable
+ // (no jump). Runs before paint.
+ useIsoLayoutEffect(() => {
+ if (entered) window.scrollTo(0, restoreScroll.current);
+ }, [entered]);
+
+ // Compute the nebula position from the title. Recompute once entered (the title is
+ // now in its final on-screen position) and on resize / font load.
useEffect(() => {
const updatePosition = () => {
- if (titleRef.current) {
- const rect = titleRef.current.getBoundingClientRect();
- const viewportWidth = window.innerWidth;
- const viewportHeight = window.innerHeight;
-
- // Position nebula to the left of the title with a comfortable margin
- // Convert pixel position to percentage of viewport
- const titleLeftPercent = (rect.left / viewportWidth) * 100;
- const titleTopPercent = (rect.top / viewportHeight) * 100;
-
- // Place the nebula 8% to the left of where the title starts
- // and vertically aligned with the title's top area
- const nebulaX = Math.max(5, titleLeftPercent - 8);
- const nebulaY = Math.max(10, titleTopPercent - 2);
-
- setNebulaPosition({ x: nebulaX, y: nebulaY });
- }
+ if (!titleRef.current) return;
+ const rect = titleRef.current.getBoundingClientRect();
+ const titleLeftPercent = (rect.left / window.innerWidth) * 100;
+ const titleTopPercent = (rect.top / window.innerHeight) * 100;
+ setNebulaPosition({
+ x: Math.max(5, titleLeftPercent - 8),
+ y: Math.max(10, titleTopPercent - 2),
+ });
};
-
updatePosition();
-
- // Update on resize
- window.addEventListener('resize', updatePosition);
-
- // Also update after fonts load (can affect title width)
+ window.addEventListener("resize", updatePosition);
document.fonts?.ready.then(updatePosition);
-
- return () => window.removeEventListener('resize', updatePosition);
- }, []);
+ return () => window.removeEventListener("resize", updatePosition);
+ }, [entered]);
+
+ const enterFromButton = () => {
+ restoreScroll.current = 0;
+ setEntered(true);
+ };
return (
-
-
-
+
+
+
-
@@ -115,7 +140,7 @@ export default function Home() {
-
+
);
-}
\ No newline at end of file
+}
diff --git a/apps/web/src/app/products/alpha-doc/opengraph-image.tsx b/apps/web/src/app/products/alpha-doc/opengraph-image.tsx
new file mode 100644
index 0000000..725a6c4
--- /dev/null
+++ b/apps/web/src/app/products/alpha-doc/opengraph-image.tsx
@@ -0,0 +1,13 @@
+import { gameOgImage, OG_SIZE, OG_CONTENT_TYPE } from "@/lib/og";
+
+export const alt = "Alpha Doc — an academic-horror roguelike";
+export const size = OG_SIZE;
+export const contentType = OG_CONTENT_TYPE;
+
+export default function Image() {
+ return gameOgImage({
+ title: "Alpha Doc",
+ tagline: "A top-down roguelike where you're the disaster. Master four kinds of radiation.",
+ accent: "#fb923c",
+ });
+}
diff --git a/apps/web/src/app/products/alpha-doc/page.tsx b/apps/web/src/app/products/alpha-doc/page.tsx
new file mode 100644
index 0000000..8d3092f
--- /dev/null
+++ b/apps/web/src/app/products/alpha-doc/page.tsx
@@ -0,0 +1,140 @@
+import { Header } from "@/components/layout/header";
+import { MobileNav } from "@/components/layout/mobile-nav";
+import { Card } from "@repo/ui/components/card";
+import Link from "next/link";
+import Image from "next/image";
+import { JsonLd, breadcrumbLd, faqLd } from "@/components/seo/json-ld";
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Alpha Doc: An Academic-Horror Roguelike | Such Software",
+ description: "Alpha Doc is a top-down roguelike where you're the irradiated PhD student. Master four kinds of radiation and descend to your thesis defense. In development.",
+ alternates: { canonical: "/products/alpha-doc" },
+ keywords: [
+ "roguelike",
+ "academic horror game",
+ "radiation game",
+ "indie roguelike",
+ "physics game",
+ "alpha doc",
+ ],
+ openGraph: {
+ title: "Alpha Doc: An Academic-Horror Roguelike",
+ description: "A top-down roguelike where you're the disaster. Master four kinds of radiation and decide if the truth matters more than your PhD. In development.",
+ type: "website",
+ url: "/products/alpha-doc",
+ },
+};
+
+const faqs = [
+ { q: "What is Alpha Doc?", a: "A top-down roguelike set in a physics research facility warped by a containment breach. You play a doctoral candidate who caused the disaster the same night as their thesis defense — now irradiated, you descend through five department wings to face the Committee." },
+ { q: "What are the four radiation types?", a: "Alpha, Beta, Gamma, and Neutron, each a distinct playstyle. Neutron is the standout: it's not a weapon but an environmental transmutation tool — you reshape the map itself, destroying cover and creating hazards before a fight even starts." },
+ { q: "Is there a morality system?", a: "Yes, but it's never an explicit choice. The aggressive play that wins fights also destroys the evidence of your culpability. Your standing is inferred from the world and reflected in four different endings — you can't quite feel good about winning." },
+ { q: "How will it be sold?", a: "Modern shareware: a free, complete first sector (the Grant Office), then a single one-time purchase to unlock the rest. No ads, no microtransactions, no energy timers." },
+ { q: "When is it out?", a: "It's in active development — a playable vertical slice exists. Follow Such Software for release news on Steam, itch.io, iOS, and Android." },
+];
+
+const jsonLd = {
+ "@context": "https://schema.org",
+ "@type": "VideoGame",
+ name: "Alpha Doc",
+ url: "https://such.software/products/alpha-doc",
+ description:
+ "A top-down academic-horror roguelike. Descend through a warped physics facility, master four types of radiation, and decide if the truth matters more than your PhD.",
+ applicationCategory: "Game",
+ genre: ["Roguelike", "Action", "Indie"],
+ gamePlatform: ["PC", "iOS", "Android"],
+ author: { "@type": "Organization", name: "Such Software" },
+ publisher: { "@type": "Organization", name: "Such Software" },
+};
+
+const features = [
+ { title: "Four-element combat", body: "Alpha, Beta, Gamma, and Neutron are four real playstyles, not reskins. Each rewards a different read of the room." },
+ { title: "Neutron reshapes the map", body: "The Neutron element transmutes the environment — destroy cover, open paths, arm dormant hazards. You change the battlefield before the battle." },
+ { title: "Instability as a dial", body: "Push instability for harder-hitting shots at a slower fire rate, or dial it back and let it decay. Tension, not a punishment cliff." },
+ { title: "Emergent morality", body: "No morality meter. Burning evidence for power quietly shifts dialogue, companion reactions, and which of four endings you reach." },
+ { title: "Academic horror", body: "Your enemies are colleagues with real grievances — the reviewer you ignored, the safety inspector you overruled, the adjuncts caught in the blast." },
+ { title: "Respectful premium design", body: "Free first sector, one-time unlock, no ads or timers. The systems are built for a complete experience, not a monetization funnel." },
+];
+
+export default function AlphaDocPage() {
+ return (
+
+
+
+
+
+
+
+ ← Back to Products
+
+
+
+
+
+
+ In Development
+
+
+ Alpha Doc
+
+
+
+
A top-down roguelike where you’re the disaster.
+
+
+
+ It is 2:07 AM. A fifth-year PhD student has just caused a catastrophic accelerator overload,
+ irradiating the building and everyone in it — and the thesis defense is at 8:00 AM. Descend
+ through five warped department wings, master four types of radiation, and decide whether to
+ bury the evidence or face the Committee. Alpha Doc is a systems-driven roguelike with dark
+ academic teeth.
+
+
+
+
What makes it different
+
+ {features.map((f) => (
+
+
{f.title}
+
{f.body}
+
+ ))}
+
+
+
Under the Hood
+
+
+
Engine: Godot 4 (.NET / C#) with a fixed 3/4 orthographic camera.
+
Procedural generation: BSP rooms and constraint-solved layouts for endless runs.
+
Structure: five sectors, four bosses plus a multi-phase thesis defense, and four endings.
+
Platforms: Steam and itch.io on desktop, plus iOS and Android.
+
+
+
+
FAQ
+
+ {faqs.map((f) => (
+
+
{f.q}
+
{f.a}
+
+ ))}
+
+
+
+ All Products
+ •
+ Get notified / Feedback
+ •
+ Contact: apps@such.software
+
+
+
+
+ );
+}
diff --git a/apps/web/src/app/products/barns-and-neutrons/opengraph-image.tsx b/apps/web/src/app/products/barns-and-neutrons/opengraph-image.tsx
new file mode 100644
index 0000000..c1ecae4
--- /dev/null
+++ b/apps/web/src/app/products/barns-and-neutrons/opengraph-image.tsx
@@ -0,0 +1,13 @@
+import { gameOgImage, OG_SIZE, OG_CONTENT_TYPE } from "@/lib/og";
+
+export const alt = "Barns & Neutrons — a game about the Table of Nuclides";
+export const size = OG_SIZE;
+export const contentType = OG_CONTENT_TYPE;
+
+export default function Image() {
+ return gameOgImage({
+ title: "Barns & Neutrons",
+ tagline: "A cozy, honest expedition across the real Table of Nuclides.",
+ accent: "#facc15",
+ });
+}
diff --git a/apps/web/src/app/products/barns-and-neutrons/page.tsx b/apps/web/src/app/products/barns-and-neutrons/page.tsx
new file mode 100644
index 0000000..eb35a82
--- /dev/null
+++ b/apps/web/src/app/products/barns-and-neutrons/page.tsx
@@ -0,0 +1,148 @@
+import { Header } from "@/components/layout/header";
+import { MobileNav } from "@/components/layout/mobile-nav";
+import { Card } from "@repo/ui/components/card";
+import Link from "next/link";
+import Image from "next/image";
+import { JsonLd, breadcrumbLd, faqLd } from "@/components/seo/json-ld";
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Barns & Neutrons: A Game About the Table of Nuclides | Such Software",
+ description: "Barns & Neutrons is a cozy exploration-puzzle game across the real Table of Nuclides. Capture neutrons, coax decays, and learn honest, cited nuclear physics. In development.",
+ alternates: { canonical: "/products/barns-and-neutrons" },
+ keywords: [
+ "table of nuclides game",
+ "nuclear physics game",
+ "edutainment game",
+ "isotope game",
+ "neutron capture",
+ "radiochemistry game",
+ "barns and neutrons",
+ ],
+ openGraph: {
+ title: "Barns & Neutrons: A Game About the Table of Nuclides",
+ description: "A cozy, honest expedition across the real Table of Nuclides — the anti-spreadsheet. In development by Such Software.",
+ type: "website",
+ url: "/products/barns-and-neutrons",
+ },
+};
+
+const faqs = [
+ { q: "What is Barns & Neutrons?", a: "A cozy exploration-puzzle game set on the real Table of Nuclides — the grid of every known isotope. You start on a small island of known nuclides and each step into the dark is a small physics puzzle: capture a neutron, coax a decay. The reward is discovery, as a new nuclide lights up and its Compendium entry unfolds." },
+ { q: "Is it educational?", a: "Yes, but through play, not lectures. Every animation reflects real physics, and discoveries unlock real-world context (Tc-99m in medical imaging, Am-241 in smoke detectors, C-14 in dating) along with half-lives, Q-values, and cornerstone papers. The data is grounded in open sources like ENDF, IAEA, and NIST." },
+ { q: "What does “Barns” mean?", a: "A barn is the real unit of nuclear cross-section (10⁻²⁴ cm²) — a measure of how likely a nucleus is to interact with a neutron. The neutron-capture puzzles are literally about tuning energy to hit that cross-section." },
+ { q: "What platforms will it be on?", a: "It is built in Godot for desktop (Windows, macOS, Linux) and mobile (iOS, Android)." },
+ { q: "When is it out?", a: "It is in active development. The first playable slice (the Mo-99 → Tc-99m neighborhood) is the current milestone. Follow Such Software for release news." },
+];
+
+const jsonLd = {
+ "@context": "https://schema.org",
+ "@type": "VideoGame",
+ name: "Barns & Neutrons",
+ url: "https://such.software/products/barns-and-neutrons",
+ description:
+ "A cozy exploration-puzzle game across the real Table of Nuclides. Capture neutrons, coax decays, and learn honest, cited nuclear physics.",
+ applicationCategory: "Game",
+ genre: ["Puzzle", "Educational", "Simulation"],
+ gamePlatform: ["PC", "iOS", "Android"],
+ author: { "@type": "Organization", name: "Such Software" },
+ publisher: { "@type": "Organization", name: "Such Software" },
+};
+
+const features = [
+ { title: "Discovery is the loop", body: "No linear tech tree. You explore a real, enormous map of ~3,300 nuclides. Completionism and pure curiosity pull you deeper, with no timers and no game-overs." },
+ { title: "Honest physics", body: "When reality and a cuter lie compete, reality wins — then we make reality beautiful. Neutron scattering is forward-peaked at fast energies because it actually is." },
+ { title: "Failure is serendipity", body: "Miss a neutron capture and the nucleus does what it really would — maybe a decay instead. You discover a different nuclide and learn real behavior. No punishment, only discovery." },
+ { title: "The Compendium", body: "Every discovered isotope unlocks a card: real uses, half-lives, Q-values, and a link to a cornerstone paper (Fermi, Chadwick, Hahn & Strassmann). You learn the history, not just the facts." },
+ { title: "A 3D tabletop, not a spreadsheet", body: "A tilted, extruded ceramic-tile board with a glowing valley of stability and dramatic discovery vignettes. Cozy, warm, and tactile." },
+ { title: "Open core", body: "The physics, data, and code are open; the art, prose, and Compendium illustrations are ours. Facts aren't copyrightable, and we cite them anyway." },
+];
+
+export default function BarnsAndNeutronsPage() {
+ return (
+
+
+
+
+
+
+
+ ← Back to Products
+
+
+
+
+
+
+ In Development
+
+
+ Barns & Neutrons
+
+
+
+
A cozy, honest expedition across the real Table of Nuclides — the anti-spreadsheet.
+
+
+
+ Barns & Neutrons is a calm puzzle game about the real Table of Nuclides. You begin on a
+ tiny lit island of known isotopes, and each step into the dark is a small, elegant physics
+ puzzle — capture a neutron, coax a decay. The reward is discovery: a new nuclide lights up
+ and its Compendium entry unfolds. It is our flagship edutainment title, and it shares its
+ DNA with our founder’s open-source{" "}
+ GEANT4 radiation labs.
+
+
+
+
What makes it different
+
+ {features.map((f) => (
+
+
{f.title}
+
{f.body}
+
+ ))}
+
+
+
Under the Hood
+
+
+
Engine: Godot 4, one codebase for desktop and mobile.
+
The board: all ~3,300 nuclides rendered in a single 3D instance, with a glowing valley of stability.
+
Ground truth: nuclear data from ENDF/B-VIII.0, IAEA, and NIST, with clickable citations in-game.
+
Honest model: real cross-sections, real decay modes, real moderation physics.
+
+
+
+
FAQ
+
+ {faqs.map((f) => (
+
+
{f.q}
+
{f.a}
+
+ ))}
+
+
+
+ Curious about the science behind it? See our{" "}
+ nuclear & radiation modeling
+ {" "}work.
+
+
+
+ All Products
+ •
+ Get notified / Feedback
+ •
+ Contact: apps@such.software
+
+
+
+
+ );
+}
diff --git a/apps/web/src/app/products/decay-theory/opengraph-image.tsx b/apps/web/src/app/products/decay-theory/opengraph-image.tsx
new file mode 100644
index 0000000..bae1733
--- /dev/null
+++ b/apps/web/src/app/products/decay-theory/opengraph-image.tsx
@@ -0,0 +1,13 @@
+import { gameOgImage, OG_SIZE, OG_CONTENT_TYPE } from "@/lib/og";
+
+export const alt = "Decay Theory — Erwin's Atomic Adventure";
+export const size = OG_SIZE;
+export const contentType = OG_CONTENT_TYPE;
+
+export default function Image() {
+ return gameOgImage({
+ title: "Decay Theory",
+ tagline: "Watch the ground dissolve beneath your feet. Atom by atom.",
+ accent: "#22d3ee",
+ });
+}
diff --git a/apps/web/src/app/products/decay-theory/page.tsx b/apps/web/src/app/products/decay-theory/page.tsx
new file mode 100644
index 0000000..43796ca
--- /dev/null
+++ b/apps/web/src/app/products/decay-theory/page.tsx
@@ -0,0 +1,140 @@
+import { Header } from "@/components/layout/header";
+import { MobileNav } from "@/components/layout/mobile-nav";
+import { Card } from "@repo/ui/components/card";
+import Link from "next/link";
+import Image from "next/image";
+import { JsonLd, breadcrumbLd, faqLd } from "@/components/seo/json-ld";
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Decay Theory: Erwin's Atomic Adventure | Such Software",
+ description: "Decay Theory is a side-scrolling platformer where the world decays atom by atom in real time. Play Erwin, a quantum cat, and learn real nuclear physics. In development.",
+ alternates: { canonical: "/products/decay-theory" },
+ keywords: [
+ "platformer",
+ "physics platformer",
+ "nuclear physics game",
+ "indie game",
+ "decay theory",
+ "Erwin atomic adventure",
+ ],
+ openGraph: {
+ title: "Decay Theory: Erwin's Atomic Adventure",
+ description: "Watch the ground dissolve beneath your feet, atom by atom. A platformer that teaches real nuclear physics. In development.",
+ type: "website",
+ url: "/products/decay-theory",
+ },
+};
+
+const faqs = [
+ { q: "What is Decay Theory?", a: "A 2D side-scrolling platformer where the entire world is made of individual atoms undergoing radioactive decay in real time. You don't see platforms vanish in bulk — you watch the ground dissolve atom by atom beneath your feet." },
+ { q: "Who is Erwin?", a: "Erwin is a quantum-coherent cat — a nod to Schrödinger — whose body is itself a particle system. Health is 'quantum coherence,' shown as particle density: a healthy Erwin is a tight cloud; near death, a ghostly shimmer." },
+ { q: "Does it actually teach physics?", a: "Yes, through mechanics rather than lectures. Decay modes, half-lives, decay chains, fission, and reactor control are things you feel. Isotopes use real half-lives and color coding." },
+ { q: "How is it released?", a: "Episode 1, 'Ground State,' is a free vertical slice — no ads, no IAP. The full game (more zones and powers) unlocks via a single one-time purchase." },
+ { q: "When is it out?", a: "Episode 1 is the current milestone, targeting iOS and Android first, with a desktop (Steam) port later. Follow Such Software for the launch." },
+];
+
+const jsonLd = {
+ "@context": "https://schema.org",
+ "@type": "VideoGame",
+ name: "Decay Theory: Erwin's Atomic Adventure",
+ alternateName: "Decay Theory",
+ url: "https://such.software/products/decay-theory",
+ description:
+ "A side-scrolling platformer where the world is simulated atom by atom, decaying in real time. Play Erwin, a quantum cat, and learn real nuclear physics.",
+ applicationCategory: "Game",
+ genre: ["Platformer", "Educational", "Indie"],
+ gamePlatform: ["iOS", "Android", "PC"],
+ author: { "@type": "Organization", name: "Such Software" },
+ publisher: { "@type": "Organization", name: "Such Software" },
+};
+
+const features = [
+ { title: "The world decays as you watch", body: "Every tile is thousands of simulated atoms with a real decay probability. Platforms erode into swiss cheese and crumble under your feet — stochastic, beautiful, and deadly." },
+ { title: "Quantum powers", body: "Observation collapses a wave function to stabilize ground; Time Rewind undoes a fatal step. Later powers — superposition, entanglement, tunneling — each teach a real concept." },
+ { title: "Erwin, a living particle system", body: "Your cat is rendered as 2,000+ particles. Coherence is health: take damage and Erwin literally comes apart at the seams." },
+ { title: "Real isotope data", body: "Isotopes carry authentic half-lives and decay chains, color-coded by family. The Geiger-counter audio tempo tracks the local decay rate." },
+ { title: "Tight, skill-based platforming", body: "Precise tilt-and-touch controls, checkpoints, and speedrun-friendly level design. A real platformer, not a quiz with jumps." },
+ { title: "Premium, not predatory", body: "Free Episode 1, one-time unlock for the rest. No ads, no loot boxes, no energy systems, no tracking." },
+];
+
+export default function DecayTheoryPage() {
+ return (
+
+
+
+
+
+
+
+ ← Back to Products
+
+
+
+
+
+
+ In Development
+
+
+ Decay Theory
+
+
+
+
Watch the ground dissolve beneath your feet. Atom by atom.
+
+
+
+ Decay Theory is a hard-sci-fi platformer where the entire world is composed of individual
+ simulated atoms decaying in real time. You play Erwin, a quantum cat navigating a world that
+ is literally evaporating at the subatomic level — and you learn real nuclear physics by
+ feeling it, not by reading it.
+
+
+
+
What makes it different
+
+ {features.map((f) => (
+
+
{f.title}
+
{f.body}
+
+ ))}
+
+
+
Under the Hood
+
+
+
Architecture: Godot renders; a Rust core runs 100% of the atom simulation.
+
Performance: tens of thousands of active, decaying atoms at a smooth frame rate on mid-range phones.
+
Powers: quantum mechanics turned into verbs — observation, time rewind, and more.
+
Platforms: iOS and Android first, desktop (Steam) to follow.
+
+
+
+
FAQ
+
+ {faqs.map((f) => (
+
+
{f.q}
+
{f.a}
+
+ ))}
+
+
+
+ All Products
+ •
+ Get notified / Feedback
+ •
+ Contact: apps@such.software
+
+
+
+
+ );
+}
diff --git a/apps/web/src/app/products/page.tsx b/apps/web/src/app/products/page.tsx
index 53e79c2..355e9e7 100644
--- a/apps/web/src/app/products/page.tsx
+++ b/apps/web/src/app/products/page.tsx
@@ -1,36 +1,35 @@
import { Header } from "@/components/layout/header";
import { MobileNav } from "@/components/layout/mobile-nav";
-import { ScrollReveal } from "@/components/scroll-reveal";
-import { Card } from "@repo/ui/components/card";
-import Image from "next/image";
-import Link from "next/link";
+import { ProductsGrid, type Product } from "@/components/portfolio/products-grid";
import type { Metadata } from "next";
export const metadata: Metadata = {
- title: "Our Products & Apps: Crypto Tools, Games & Commerce | Such Software",
- description: "Explore Such Software's products: Wownerogue Monero roguelike, Neroswap crypto aggregator, Smirk tipping wallet, headless Webshops, and our mobile games.",
+ title: "Our Products & Apps: Crypto Tools, Nuclear Games & Commerce | Such Software",
+ description: "Explore Such Software's products: Wownerogue Monero roguelike, Neroswap crypto aggregator, Smirk wallet, headless Webshops, our mobile games, and nuclear games in development.",
alternates: { canonical: "/products" },
openGraph: {
- title: "Our Products & Apps: Crypto Tools, Games & Commerce | Such Software",
- description: "Explore Such Software's products: Wownerogue Monero roguelike, Neroswap crypto aggregator, Smirk tipping wallet, headless Webshops, and our mobile games.",
+ title: "Our Products & Apps: Crypto Tools, Nuclear Games & Commerce | Such Software",
+ description: "Explore Such Software's products: Wownerogue Monero roguelike, Neroswap crypto aggregator, Smirk wallet, headless Webshops, our mobile games, and nuclear games in development.",
type: "website",
},
};
-const products = [
+const products: Product[] = [
{
slug: "webshops",
title: "Webshops",
description: "Custom online stores on revenue-share pricing. No upfront cost. Built on headless Medusa.",
color: "emerald",
icon: "/images/products/occupy-wallets.png",
+ releaseDate: "2025-01-01",
},
{
slug: "custom-websites",
title: "Custom Websites",
description: "Real-time web apps, multiplayer games, and live dashboards. Built on Next.js, Socket.io, and WebRTC.",
color: "purple",
- icon: "/images/products/neroswap.png",
+ icon: "/images/products/custom-websites.svg",
+ releaseDate: "2025-01-01",
},
{
slug: "smirk-wallet",
@@ -38,6 +37,7 @@ const products = [
description: "Non-custodial browser wallet for social tipping. BTC, LTC, XMR, WOW, GRIN.",
color: "amber",
icon: "/images/products/smirk-wallet.png",
+ releaseDate: "2026-03-01",
},
{
slug: "bauhaus-echo",
@@ -45,6 +45,7 @@ const products = [
description: "Visual memory puzzle game inspired by Bauhaus design. Android, iOS, Web.",
color: "blue",
icon: "/images/products/bauhaus-echo.png",
+ releaseDate: "2026-04-01",
},
{
slug: "suchoice",
@@ -52,6 +53,7 @@ const products = [
description: "Stop overthinking decisions. Snap a photo, let AI read the options, spin the wheel. Plus coin flip and adventure mode. Android and iOS.",
color: "pink",
icon: "/images/products/suchoice.png",
+ releaseDate: "2026-04-01",
},
{
slug: "vegan-iq",
@@ -59,6 +61,7 @@ const products = [
description: "Test your plant-based knowledge with 1,000+ trivia questions across 8 categories, plus a daily challenge and weekly quiz. Android and iOS.",
color: "green",
icon: "/images/products/vegan-iq.png",
+ releaseDate: "2026-04-01",
},
{
slug: "such-moon-launch",
@@ -66,6 +69,7 @@ const products = [
description: "Vry rocket. Much landing. Wow! Wownero-themed pixel rocket arcade. 11 levels, 4 weapons, tilt-to-steer, endless mode. Android, iOS, Web, Desktop.",
color: "amber",
icon: "/images/products/such-moon-launch.png",
+ releaseDate: "2026-05-01",
},
{
slug: "wownerogue",
@@ -73,38 +77,45 @@ const products = [
description: "A provably-fair multiplayer roguelike synced to Monero and Wownero block times. Play free in the browser, escape the dungeon, earn on-chain payouts.",
color: "orange",
icon: "/images/products/privacy-labs.png",
+ releaseDate: "2026-06-01",
},
{
slug: "neroswap",
title: "Neroswap",
description: "Aggregated DEX & CEX orderbook data. Compare Monero, Wownero, and Bitcoin prices across 6 exchanges in real time.",
color: "yellow",
- icon: "/images/products/neroswap.png",
+ icon: "/images/products/neroswap.svg",
+ releaseDate: "2026-03-01",
+ },
+ {
+ slug: "barns-and-neutrons",
+ title: "Barns & Neutrons",
+ description: "A cozy exploration-puzzle game across the real Table of Nuclides—the anti-spreadsheet. Capture neutrons, coax decays, and light up the chart while learning honest nuclear physics. Desktop and mobile.",
+ color: "yellow",
+ icon: "/images/products/barns-and-neutrons.svg",
+ releaseDate: null,
+ comingSoon: true,
+ },
+ {
+ slug: "alpha-doc",
+ title: "Alpha Doc",
+ description: "A top-down academic-horror roguelike. You're the irradiated PhD student—master four kinds of radiation and descend through a warped physics facility to your thesis defense. Desktop and mobile.",
+ color: "orange",
+ icon: "/images/products/alpha-doc.svg",
+ releaseDate: null,
+ comingSoon: true,
+ },
+ {
+ slug: "decay-theory",
+ title: "Decay Theory",
+ description: "A side-scrolling platformer where the world is simulated atom by atom, decaying in real time. Play Erwin, a quantum cat, and learn real nuclear physics. Episode 1 coming to iOS and Android.",
+ color: "cyan",
+ icon: "/images/products/decay-theory.svg",
+ releaseDate: null,
+ comingSoon: true,
},
];
-const colorClasses: Record = {
- emerald: "border-emerald-500/30 hover:border-emerald-500/60",
- purple: "border-purple-500/30 hover:border-purple-500/60",
- amber: "border-amber-500/30 hover:border-amber-500/60",
- blue: "border-blue-500/30 hover:border-blue-500/60",
- pink: "border-pink-500/30 hover:border-pink-500/60",
- orange: "border-orange-500/30 hover:border-orange-500/60",
- yellow: "border-yellow-500/30 hover:border-yellow-500/60",
- green: "border-green-500/30 hover:border-green-500/60",
-};
-
-const titleColors: Record = {
- emerald: "text-emerald-600 dark:text-emerald-400",
- purple: "text-purple-600 dark:text-purple-400",
- amber: "text-amber-600 dark:text-amber-400",
- blue: "text-blue-600 dark:text-blue-400",
- pink: "text-pink-600 dark:text-pink-400",
- orange: "text-orange-600 dark:text-orange-400",
- yellow: "text-yellow-600 dark:text-yellow-400",
- green: "text-green-600 dark:text-green-400",
-};
-
export default function ProductsPage() {
return (
@@ -115,35 +126,12 @@ export default function ProductsPage() {
Portfolio
- Tools we have built, from commerce infrastructure to consumer apps.
+ Tools we have built, from commerce infrastructure to consumer apps—plus a trio of
+ nuclear games in development.
-
- {products.map((product, i) => (
-
-
-
-
-
-
- {product.title}
-
-
-
- {product.description}
-
-
-
-
- ))}
-
+
- Focused expertise in commerce, crypto, and custom web applications.
+ Focused expertise in commerce and custom web apps, plus consulting: from payments
+ and crypto to nuclear and radiation modeling.
@@ -73,8 +75,8 @@ export default function ServicesPage() {
Flexible Architecture
- Model your exact business logic—subscriptions, bundles, B2B pricing,
- multi-warehouse inventory—without platform constraints.
+ Model your exact business logic (subscriptions, bundles, B2B pricing,
+ multi-warehouse inventory) without platform constraints.
@@ -87,7 +89,7 @@ export default function ServicesPage() {
Performance-First Frontend
Custom Next.js storefronts optimized for Core Web Vitals, accessibility,
- and conversion—not template bloat.
+ and conversion, not template bloat.
+ Beyond build work, we consult where specialized, hard-won expertise matters. We
+ advise on payment architecture and orchestration, and on cryptocurrency and Monero
+ integration. Most distinctively, we take on nuclear and radiation modeling.
+
+
+ The nuclear work is our standout: PhD-led Monte Carlo transport, shielding analysis,
+ detector design, and training, grounded in years at a national lab. Details below.
+
+
+
+
{/* Crypto Section */}
-
Cryptocurrency & Payment Consulting
+
Cryptocurrency & Payments
Bridge traditional payments and decentralized protocols with secure, auditable infrastructure.
@@ -145,6 +163,84 @@ export default function ServicesPage() {
+ PhD-led radiation transport and nuclear expertise, available for select engagements.
+ From Monte Carlo modeling to shielding analysis, we bring lab-grade rigor to hard
+ problems: modeling, analysis, and consulting.
+
+
+
+
+
Monte Carlo Transport
+
+ Radiation transport modeling in MCNP{" "}
+ (multiple peer-reviewed papers)
+ and GEANT4, for
+ detectors, sources, and complex geometries.
+
+
+
+
Shielding & Dose
+
+ Shielding calculations and dose analysis, including spent-fuel handling and
+ dry-cask storage optimization.
+
+
+
+
Detectors & Isotopes
+
+ Radiation detector design and characterization, plus radioisotope power
+ (RTG / betavoltaic) modeling.
+
+ PhD in radiation-detector materials, UT-Dallas (2014)
+
+
+ Lawrence Livermore National Laboratory (2015–2021): detector systems, radioisotope battery program, MCNP5 publications
+
+
+ Holtec International: radiation shielding and spent-fuel-to-dry-cask optimization
+
+
+ College-level instructor: author of open-source GEANT4 radiation labs
+
+
+
+ Select engagements, PhD-led.{" "}
+
+ Contact us for rates
+ .
+
+
+ We provide modeling, analysis, and consulting. We are not a licensed
+ professional-engineering (PE) firm and do not provide stamped engineering deliverables.
+
- John Winter Murphy holds a PhD in Materials Engineering from UT-Dallas (2014), focused on semiconductor device fabrication for radiation detectors. From 2015 to 2021 he was a scientist at Lawrence Livermore National Laboratory, developing radiation detector systems and the lab's nuclear battery program.
+ John Winter Murphy holds a PhD in Materials Engineering from UT-Dallas (2014), focused on semiconductor devices for radiation detection. From 2015 to 2021 he was a scientist at Lawrence Livermore National Laboratory, developing radiation detector systems and the lab's radioisotope battery program. He brings that same lab-bench rigor to software, and an insistence that it stay accessible to everyone, audited to WCAG 2.2.
- He previously co-founded Patrn LLC (art101.io), a series of art-history NFT drops, and Tabby Labs, which was developing a cryptocurrency wallet with an interactive world inside.
+ He previously co-founded Patrn LLC (art101.io), a series of art-history NFT drops, and Tabby Labs, which was developing a cryptocurrency wallet with an interactive world inside.
He most recently taught engineering at Cecil College and senior-level materials engineering (microfabrication, nanomaterials) at Frostburg State University. Active in cryptocurrency since 2014, with a public track record on GitHub.
diff --git a/apps/web/src/components/landing/dynamic-background.tsx b/apps/web/src/components/landing/dynamic-background.tsx
index 1941a81..dc75950 100644
--- a/apps/web/src/components/landing/dynamic-background.tsx
+++ b/apps/web/src/components/landing/dynamic-background.tsx
@@ -15,9 +15,11 @@ const NebulaField = dynamic(
interface DynamicBackgroundProps {
nebulaPosition?: { x: number; y: number } | null;
+ /** When false, the nebula stays hidden (e.g. while the home splash is active). */
+ visible?: boolean;
}
-export function DynamicBackground({ nebulaPosition }: DynamicBackgroundProps) {
+export function DynamicBackground({ nebulaPosition, visible = true }: DynamicBackgroundProps) {
const { resolvedTheme, systemTheme } = useTheme();
const [mounted, setMounted] = useState(false);
const [showNebula, setShowNebula] = useState(false);
@@ -54,15 +56,19 @@ export function DynamicBackground({ nebulaPosition }: DynamicBackgroundProps) {
const effectiveTheme = resolvedTheme || systemTheme || 'dark';
const themeMode = effectiveTheme === 'dark' ? 'dark' : 'light';
- if (!showNebula) {
+ // While the splash is active (visible === false) keep the nebula/monitor hidden —
+ // the splash provides its own Cherenkov glow. Reveal it once the visitor enters.
+ if (!showNebula || !visible) {
return
+
+ {/* Cover tagline (the real page H1 lives in the hero revealed after entering) */}
+
+ Precision Engineering for Everyone
+
+
+ A software studio in Kennett Square, PA. Custom e-commerce, apps, games,
+ payments, and consulting.
+
+
+ {/* Nav buttons in the four corners (all breakpoints) */}
+ {navButtons.map((b) => (
+
+ {b.label}
+
+ ))}
+
+ {/* Enter-the-site affordance */}
+
+
+ );
+}
diff --git a/apps/web/src/components/landing/services-preview.tsx b/apps/web/src/components/landing/services-preview.tsx
index 70d2361..4865fa0 100644
--- a/apps/web/src/components/landing/services-preview.tsx
+++ b/apps/web/src/components/landing/services-preview.tsx
@@ -6,7 +6,8 @@ export function ServicesPreview() {
What We Do
- We build high-performance e-commerce stores, develop custom apps, and ship our own titles.
+ We build high-performance e-commerce stores, develop custom apps, and ship our own
+ titles, engineered with atomic precision by a studio that sweats the details.
Whether you need a storefront, a bespoke tool, or a full product build, we handle the engineering end to end.
diff --git a/apps/web/src/components/layout/header.tsx b/apps/web/src/components/layout/header.tsx
index 1716019..b32b467 100644
--- a/apps/web/src/components/layout/header.tsx
+++ b/apps/web/src/components/layout/header.tsx
@@ -5,9 +5,20 @@ import { usePathname } from "next/navigation";
import { SiteLogo } from "./site-logo";
import { ThemeToggle } from "@/components/theme-toggle";
-export function Header() {
+/**
+ * On the home page the splash owns the first screen, so the header is `floating`
+ * (fixed) and only shown once the visitor has `visible`-entered the site. Other
+ * pages use the default always-on sticky header.
+ */
+export function Header({ floating = false, visible = true }: { floating?: boolean; visible?: boolean }) {
const pathname = usePathname();
+ const positionClasses = floating
+ ? `fixed top-0 inset-x-0 transition-all duration-500 ${
+ visible ? "translate-y-0 opacity-100" : "-translate-y-full opacity-0 invisible"
+ }`
+ : "sticky top-0";
+
return (
<>
Skip to main content
-
+