Skip to content

mrmetaverse/theinterop

Repository files navigation

The Interop

Content for Builders, Founders, and Funders

A minimal, neumorphic personal site for The Interop newsletter β€” weekly insights at the intersection of AI, business transformation, and emerging technology.

🌐 Live Sites

✨ Features

  • Neumorphic Design β€” Soft, modern UI with tasteful shadows and depth
  • Three.js Hero β€” Interactive constellation visualization (progressive enhancement)
  • Dark/Light Mode β€” System-aware with manual toggle
  • MDX Blog β€” Rich content with code highlighting and embeds
  • SEO Optimized β€” Sitemap, RSS, OpenGraph, structured data
  • Reduced Motion Support β€” Respects user preferences
  • Git-First Authoring β€” Write in Cursor/IDE, push to publish
  • Content Validation β€” CI fails on broken frontmatter or missing assets

πŸš€ Quick Start

# Install dependencies
npm install

# Start development server
npm run dev

# Build for production (includes content validation)
npm run build

# Start production server
npm start

πŸ“ Authoring Workflow

Creating a New Post

# Interactive mode
npm run new:post

# With arguments
npm run new:post "Your Post Title" --category=ai-strategy --tags=agents,interop

This creates:

  • content/posts/YYYY/YYYY-MM-DD-your-post-title.mdx
  • public/images/blog/YYYY/your-post-title/ (asset folder)

Post File Structure

Posts use the canonical format:

content/posts/
β”œβ”€β”€ 2025/
β”‚   β”œβ”€β”€ 2025-12-29-call-tracking-is-dead.mdx
β”‚   └── 2025-10-01-on-ai-modernization.mdx
└── 2024/
    └── 2024-04-03-we-ask-ai-to-do-things.mdx

Frontmatter Schema

---
title: "Your Post Title"                    # Required
date: "2025-12-29"                          # Required, ISO format
slug: "your-post-title"                     # Required, kebab-case, unique
excerpt: "One to three sentence summary."   # Required
category: "ai-strategy"                     # Required, from controlled list
tags: ["agents", "interop"]                 # Optional but recommended
coverImage: "/images/blog/2025/slug/cover.png"  # Optional
featured: false                             # Optional
draft: true                                 # Optional, excludes from production
canonicalUrl: ""                            # Optional, for Substack legacy URLs
updatedDate: "2025-12-30"                   # Optional
series: "Interop Notes"                     # Optional, for grouped navigation
---

Valid Categories

Slug Label
ai-strategy AI Strategy
business-transformation Business Transformation
agent-development Agent Development
future-tech Future Tech
case-studies Case Studies

Draft Posts

Set draft: true in frontmatter to exclude a post from production builds. Draft posts still appear in development mode.

Publishing Workflow

  1. Create post: npm run new:post "Title"
  2. Edit in Cursor/IDE
  3. Preview: npm run dev
  4. Set draft: false when ready
  5. Commit and push to GitHub
  6. Vercel deploys automatically

βœ… Content Validation

The build validates all posts for:

  • Required frontmatter fields
  • Valid ISO date format (YYYY-MM-DD)
  • Unique slugs (no duplicates)
  • Valid category (from controlled list)
  • Existing cover image files (if specified)

Manual Validation

# Run content validation only
npm run lint:content

CI Integration

The npm run build command runs content validation first. CI will fail if:

  • Required fields are missing or empty
  • Date format is invalid
  • Slug is duplicated
  • Category is not in the controlled list

🧩 MDX Components

Posts support standard Markdown plus these MDX components:

Callout

<Callout type="info" title="Note">
  Important information here.
</Callout>

Types: note, info, warn, success, tip

Figure

<Figure 
  src="/images/blog/2025/slug/diagram.png" 
  alt="Architecture diagram"
  caption="System architecture overview"
/>

PullQuote

<PullQuote author="Jesse Alton" source="The Interop">
  The future belongs to those who can make different systems work together.
</PullQuote>

Embed

<Embed type="youtube" id="dQw4w9WgXcQ" title="Video title" />
<Embed type="twitter" id="1234567890" />
<Embed type="loom" id="abc123" />

πŸ”„ Migrating from Substack

  1. Export your Substack data:

    • Go to Settings β†’ Exports β†’ Export posts
    • Download and unzip the export
  2. Run the migration script:

    npm run migrate ./path/to/substack-export
  3. Review and validate:

    npm run lint:content
  4. Preview the site:

    npm run dev

πŸ“ Project Structure

theinterop/
β”œβ”€β”€ content/
β”‚   └── posts/              # MDX blog posts (by year)
β”‚       β”œβ”€β”€ 2025/
β”‚       └── 2024/
β”œβ”€β”€ public/
β”‚   └── images/
β”‚       └── blog/           # Post assets (by year/slug)
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ new-post.ts         # Post scaffolding CLI
β”‚   β”œβ”€β”€ validate-content.ts # Content validation
β”‚   └── migrate-substack.ts # Migration tool
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ app/                # Next.js App Router pages
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ layout/         # Header, Footer
β”‚   β”‚   β”œβ”€β”€ mdx/            # Callout, Figure, PullQuote, Embed
β”‚   β”‚   β”œβ”€β”€ three/          # Three.js scenes
β”‚   β”‚   └── ui/             # Reusable UI components
β”‚   └── lib/                # Utilities and types
└── ...config files

🎨 Design System

The site uses a neumorphic design system with CSS custom properties:

Colors

Variable Light Dark
--color-background hsl(240 10% 96%) hsl(240 15% 8%)
--color-foreground hsl(240 10% 10%) hsl(240 10% 95%)
--color-accent-primary hsl(220 90% 56%) Same

Typography

  • Display: Sora
  • Body: Inter
  • Mono: JetBrains Mono

Key Components

  • .neu-card β€” Neumorphic card with hover elevation
  • .neu-button β€” Neumorphic button with press effect
  • .neu-input β€” Inset input fields
  • .text-gradient β€” Accent gradient text

πŸ”§ Configuration

Site Config (src/lib/types.ts)

export const siteConfig: SiteConfig = {
  name: 'The Interop',
  description: 'Content for Builders, Founders, and Funders...',
  url: 'https://jessealton.com',
  // ... more config
};

Environment Variables

# Optional: Analytics
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX

🌐 Deployment

Vercel (Recommended)

  1. Push to GitHub
  2. Import project to Vercel
  3. Add domains:
    • jessealton.com (primary)
    • theinterop.com (redirect to primary)

Domain Redirects

vercel.json configures 301 redirects from theinterop.com β†’ jessealton.com.


πŸ“Š Performance Targets

Metric Target
Performance β‰₯ 90
Accessibility β‰₯ 90
Best Practices β‰₯ 90
SEO β‰₯ 90

πŸ›  Tech Stack

  • Framework: Next.js 16 (App Router)
  • Language: TypeScript
  • Styling: Tailwind CSS v4
  • 3D Graphics: Three.js + React Three Fiber
  • Content: MDX with gray-matter
  • Icons: Lucide React
  • Deployment: Vercel

πŸ“„ Scripts Reference

Command Description
npm run dev Start development server
npm run build Build for production (validates content first)
npm run start Start production server
npm run lint Run ESLint
npm run lint:content Validate all posts
npm run new:post Scaffold a new post
npm run migrate Migrate Substack export
npm run type-check TypeScript type check

πŸ”’ Security

This repository implements several security measures:

  • Rate Limiting: Admin login limited to 5 attempts per 15 minutes per IP
  • HTTP-Only Cookies: Session tokens protected from XSS
  • Environment Variables: All secrets stored as env vars, never in code
  • Session Expiry: Admin sessions expire after 7 days
  • Bearer Token Auth: Newsletter API protected with API key
  • No Sensitive Data: Database credentials only in Vercel environment

Environment Variables Required

# Database (Vercel Postgres)
POSTGRES_URL=
POSTGRES_PRISMA_URL=
POSTGRES_URL_NON_POOLING=

# Email (Resend)
RESEND_API_KEY=

# Admin System
ADMIN_PASSWORD=              # Generate with: npm run admin:password
NEWSLETTER_API_KEY=          # For newsletter automation

Admin Dashboard

Access at /admin with credentials:

  • Email: jesse@alton.tech
  • Password: Set via ADMIN_PASSWORD environment variable

Generate secure password: npm run admin:password


πŸ“„ License

AltonTech Proprietary License β€” This code is available for viewing and reference purposes ONLY. No use, copying, or modification permitted without explicit written permission. See LICENSE.md for full terms.

Violations result in automatic assignment of all derivative works to AltonTech, Inc.

For licensing inquiries: legal@virgent.ai


Built with β˜• by Jesse Alton

About

The Interop by Jesse Alton - Content for Builders, Founders, and Funders

Resources

License

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published