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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,5 @@ deep-research-agent/data/car_price_prediction_.csv


#
go-research/external_code/
go-research/external_code/
**.pyc
132 changes: 132 additions & 0 deletions app/presentations/deep-research/[slide]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
import { getAllSlideSlugs, getSlideBySlug } from '@/lib/presentations/deep-research';
import { notFound } from 'next/navigation';
import type { Metadata } from 'next';

export const dynamic = 'error';
export const revalidate = false;

export async function generateStaticParams() {
return getAllSlideSlugs().map((slide) => ({ slide }));
}

export async function generateMetadata({
params,
}: {
params: Promise<{ slide: string }>;
}): Promise<Metadata> {
const { slide } = await params;
const slideData = getSlideBySlug(slide);
if (!slideData) return { title: 'Slide Not Found' };

return {
title: `${slideData.title} — Deep Research Agents`,
description: 'Deep Research Agents: Architecture Walkthrough — Foo Cafe Malmö, Feb 2026',
};
}

export default async function SlidePage({
params,
}: {
params: Promise<{ slide: string }>;
}) {
const { slide } = await params;
const slideData = getSlideBySlug(slide);
if (!slideData) notFound();

const slideContent = await (async () => {
switch (slide) {
case '01-title': {
const { TitleSlide } = await import('@/components/presentations/deep-research/slides/01-title');
return <TitleSlide />;
}
case '02-group-project': {
const { GroupProjectSlide } = await import('@/components/presentations/deep-research/slides/02-group-project');
return <GroupProjectSlide />;
}
case '03-the-result': {
const { TheResultSlide } = await import('@/components/presentations/deep-research/slides/03-the-result');
return <TheResultSlide />;
}
case '04-the-reveal': {
const { TheRevealSlide } = await import('@/components/presentations/deep-research/slides/04-the-reveal');
return <TheRevealSlide />;
}
case '05-about': {
const { AboutSlide } = await import('@/components/presentations/deep-research/slides/05-about');
return <AboutSlide />;
}
case '06-audience-poll': {
const { AudiencePollSlide } = await import('@/components/presentations/deep-research/slides/06-audience-poll');
return <AudiencePollSlide />;
}
case '07-timeline': {
const { TimelineSlide } = await import('@/components/presentations/deep-research/slides/07-timeline');
return <TimelineSlide />;
}
case '08-cot': {
const { CotSlide } = await import('@/components/presentations/deep-research/slides/08-cot');
return <CotSlide />;
}
case '09-react': {
const { ReactSlide } = await import('@/components/presentations/deep-research/slides/09-react');
return <ReactSlide />;
}
case '09-react-demo': {
const { ReactDemoSlide } = await import('@/components/presentations/deep-research/slides/09-react-demo');
return <ReactDemoSlide />;
}
case '08-storm-intro': {
const { StormIntroSlide } = await import('@/components/presentations/deep-research/slides/08-storm-intro');
return <StormIntroSlide />;
}
case '09-storm-architecture': {
const { StormArchitectureSlide } = await import('@/components/presentations/deep-research/slides/09-storm-architecture');
return <StormArchitectureSlide />;
}
case '10-storm-demo': {
const { StormDemoSlide } = await import('@/components/presentations/deep-research/slides/10-storm-demo');
return <StormDemoSlide />;
}
case '11-limitation': {
const { LimitationSlide } = await import('@/components/presentations/deep-research/slides/11-limitation');
return <LimitationSlide />;
}
case '12-diffusion-insight': {
const { DiffusionInsightSlide } = await import('@/components/presentations/deep-research/slides/12-diffusion-insight');
return <DiffusionInsightSlide />;
}
case '13-diffusion-architecture': {
const { DiffusionArchitectureSlide } = await import('@/components/presentations/deep-research/slides/13-diffusion-architecture');
return <DiffusionArchitectureSlide />;
}
case '14-loop-visualized': {
const { LoopVisualizedSlide } = await import('@/components/presentations/deep-research/slides/14-loop-visualized');
return <LoopVisualizedSlide />;
}
case '15-parallel-agents': {
const { ParallelAgentsSlide } = await import('@/components/presentations/deep-research/slides/15-parallel-agents');
return <ParallelAgentsSlide />;
}
case '16-diffusion-demo': {
const { DiffusionDemoSlide } = await import('@/components/presentations/deep-research/slides/16-diffusion-demo');
return <DiffusionDemoSlide />;
}
case '17-benchmarks': {
const { BenchmarksSlide } = await import('@/components/presentations/deep-research/slides/17-benchmarks');
return <BenchmarksSlide />;
}
case '18-takeaways': {
const { TakeawaysSlide } = await import('@/components/presentations/deep-research/slides/18-takeaways');
return <TakeawaysSlide />;
}
case '19-resources': {
const { ResourcesSlide } = await import('@/components/presentations/deep-research/slides/19-resources');
return <ResourcesSlide />;
}
default:
notFound();
}
})();

return slideContent;
}
106 changes: 106 additions & 0 deletions app/presentations/deep-research/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
'use client';

import { useRouter, usePathname } from 'next/navigation';
import { useEffect, useState, useCallback, createContext, useContext } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import {
getAllSlides,
getSlideIndex,
getAdjacentSlugs,
getSlideSteps,
} from '@/lib/presentations/deep-research';

const SlideStepContext = createContext<number>(0);

export function useSlideStep() {
return useContext(SlideStepContext);
}

function SlideStepProvider({
pathname,
children,
}: {
pathname: string;
children: React.ReactNode;
}) {
const router = useRouter();
const currentSlug = pathname.split('/').pop() ?? '';
const { prev, next } = getAdjacentSlugs(currentSlug);
const maxSteps = getSlideSteps(currentSlug);
const [step, setStep] = useState(0);

const handleKeyDown = useCallback(
(e: KeyboardEvent) => {
if (e.key === 'ArrowRight' || e.key === ' ') {
e.preventDefault();
if (step < maxSteps) {
setStep((s) => s + 1);
} else if (next) {
router.push(`/presentations/deep-research/${next}`);
}
} else if (e.key === 'ArrowLeft') {
e.preventDefault();
if (step > 0) {
setStep((s) => s - 1);
} else if (prev) {
router.push(`/presentations/deep-research/${prev}`);
}
}
},
[step, maxSteps, router, prev, next],
);

useEffect(() => {
window.addEventListener('keydown', handleKeyDown);
return () => window.removeEventListener('keydown', handleKeyDown);
}, [handleKeyDown]);

return (
<SlideStepContext.Provider value={step}>
{children}
</SlideStepContext.Provider>
);
}

export default function PresentationLayout({ children }: { children: React.ReactNode }) {
const pathname = usePathname();
const slides = getAllSlides();
const currentSlug = pathname.split('/').pop() ?? '';
const currentIndex = getSlideIndex(currentSlug);

return (
<div className="fixed inset-0 z-50 bg-background grid-bg overflow-hidden">
{/* Progress bar */}
<div className="fixed top-0 left-0 right-0 h-1 bg-muted/50 z-50">
<div
className="h-full bg-primary transition-all duration-300 ease-out"
style={{
width: `${((currentIndex + 1) / slides.length) * 100}%`,
boxShadow: '0 0 8px var(--primary), 0 0 16px var(--primary)',
}}
/>
</div>

{/* Slide content with fade transition — key resets step state on route change */}
<SlideStepProvider key={currentSlug} pathname={pathname}>
<AnimatePresence mode="wait">
<motion.div
key={pathname}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.2 }}
className="h-full w-full flex items-center justify-center"
>
{children}
</motion.div>
</AnimatePresence>
</SlideStepProvider>

{/* Slide counter */}
<div className="fixed bottom-4 right-6 text-sm text-primary/40 z-50 font-mono">
{currentIndex + 1} / {slides.length}
</div>
</div>
);
}
7 changes: 7 additions & 0 deletions app/presentations/deep-research/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { redirect } from 'next/navigation';

export const dynamic = 'error';

export default function PresentationIndex() {
redirect('/presentations/deep-research/01-title');
}
94 changes: 94 additions & 0 deletions app/presentations/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import Link from 'next/link';
import { Presentation, MapPin, Calendar, ArrowRight } from 'lucide-react';
import {
Card,
CardHeader,
CardTitle,
CardDescription,
CardContent,
CardFooter,
} from '@/components/ui/card';
import type { Metadata } from 'next';

export const dynamic = 'error';
export const revalidate = false;

export const metadata: Metadata = {
title: 'Presentations | addcommitpush.io',
description:
'Talks and presentations by Emil Wåreus on deep research agents, AI architecture, and software engineering.',
};

interface PresentationEntry {
title: string;
description: string;
href: string;
venue: string;
date: string;
}

const presentations: PresentationEntry[] = [
{
title: 'Deep Research Agents — Architecture Walkthrough',
description:
'An exploration of STORM, ReACT, and diffusion-based architectures for autonomous deep research agents. Includes live demos and benchmark comparisons.',
href: '/presentations/deep-research',
venue: 'Foo Cafe, Malmö',
date: 'February 5, 2026',
},
];

export default function PresentationsPage() {
return (
<main className="min-h-screen">
<div className="container mx-auto px-4 sm:px-6 py-12 md:py-20">
<div className="max-w-4xl mx-auto">
<div className="mb-16 md:mb-24">
<h1 className="text-4xl sm:text-5xl md:text-6xl lg:text-7xl font-bold mb-6 md:mb-8 text-balance">
<span className="text-primary neon-glow flex items-center gap-4">
<Presentation className="w-10 h-10 md:w-14 md:h-14" />
Presentations
</span>
</h1>
<p className="text-lg sm:text-xl md:text-2xl text-muted-foreground max-w-3xl text-pretty leading-relaxed">
Talks and walkthroughs on AI, software architecture, and engineering leadership.
</p>
</div>

<div className="space-y-8 md:space-y-10">
{presentations.map((p) => (
<Link key={p.href} href={p.href} className="block group">
<Card className="transition-colors hover:border-primary/50">
<CardHeader>
<CardTitle className="text-xl md:text-2xl group-hover:text-primary transition-colors">
{p.title}
</CardTitle>
<CardDescription className="flex flex-wrap gap-4 mt-1 text-sm">
<span className="flex items-center gap-1.5">
<MapPin className="w-3.5 h-3.5" />
{p.venue}
</span>
<span className="flex items-center gap-1.5">
<Calendar className="w-3.5 h-3.5" />
{p.date}
</span>
</CardDescription>
</CardHeader>
<CardContent>
<p className="text-muted-foreground">{p.description}</p>
</CardContent>
<CardFooter>
<span className="text-sm text-primary flex items-center gap-1.5 group-hover:gap-2.5 transition-all">
View presentation
<ArrowRight className="w-4 h-4" />
</span>
</CardFooter>
</Card>
</Link>
))}
</div>
</div>
</div>
</main>
);
}
6 changes: 3 additions & 3 deletions app/status/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import { SpotifyCard } from './components/spotify-card';
export const revalidate = 14400; // 4 hours in seconds

export const metadata = {
title: 'Status - Emil Wareus',
title: 'Status - Emil Wåreus',
description: "What I'm working on, listening to, and doing right now.",
openGraph: {
title: 'Status - Emil Wareus',
title: 'Status - Emil Wåreus',
description: 'Real-time view into my current activities.',
url: 'https://addcommitpush.io/status',
images: [
Expand All @@ -27,7 +27,7 @@ export const metadata = {
},
twitter: {
card: 'summary_large_image',
title: 'Status - Emil Wareus',
title: 'Status - Emil Wåreus',
description: 'Real-time view into my current activities.',
images: ['https://addcommitpush.io/og-status.png'],
},
Expand Down
8 changes: 4 additions & 4 deletions components/animations/diffusion/diffusion-overview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ interface DiffusionOverviewProps {
}

const diffusionLoopStages = [
'Identify Gaps → ask research questions',
'Conduct Research in parallel + citations',
'Refine Draft Report → assess completeness',
'Supervisor identifies gaps → calls ConductResearch tool',
'ReAct sub-agents search in parallel → compress findings',
'Refine draft with evidence → supervisor assesses completeness',
];

// Per-phase dwell times (ms): brief, initial draft, diffusion loop (slower), final report (faster)
Expand All @@ -28,7 +28,7 @@ const phases: { label: string; icon: LucideIcon; text: string; isLoop?: boolean
{
label: 'Initial Draft',
icon: FilePenLine,
text: 'Creates a noisy draft from model knowledge only—no external facts yet, just structure and placeholders.',
text: 'Creates a noisy draft from LLM knowledge only (high temperature)—no search yet, intentionally speculative.',
},
{
label: 'Diffusion Loop',
Expand Down
Loading
Loading