From 7bf53ab75498ffed8e52b2e92b9a89b3fc3daa51 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Mon, 9 Feb 2026 18:20:06 -0800 Subject: [PATCH] Add talk thumbnail rendering for slides and download --- app/components/TalkThumbnail.tsx | 204 + app/submit-talk/page.tsx | 32 +- app/talk-thumbnail-gen/page.tsx | 501 ++ package.json | 1 + public/images/devx-thumbnail-bg.png | Bin 0 -> 90392 bytes .../metadata.json | 8 +- .../slides.html | 336 +- .../slides.html | 4919 +++++++++++++++-- 8 files changed, 5283 insertions(+), 718 deletions(-) create mode 100644 app/components/TalkThumbnail.tsx create mode 100644 app/talk-thumbnail-gen/page.tsx create mode 100644 public/images/devx-thumbnail-bg.png diff --git a/app/components/TalkThumbnail.tsx b/app/components/TalkThumbnail.tsx new file mode 100644 index 0000000..2007b7c --- /dev/null +++ b/app/components/TalkThumbnail.tsx @@ -0,0 +1,204 @@ +"use client" +import styled from "styled-components" + +// +// Types +// + +export type TalkThumbnailData = { + speakerName: string + talkTitle: string + profilePhotoUrl?: string +} + +export type TalkThumbnailProps = TalkThumbnailData & { + /** Width in pixels; height is derived for 16:9 (YouTube thumbnail). */ + width?: number + className?: string +} + +// +// Constants +// + +const ASPECT_RATIO = 16 / 9 +const DEFAULT_WIDTH = 640 +const BG_IMAGE_PATH = "/images/devx-thumbnail-bg.png" +const LOGO_IMAGE_PATH = "/images/sd-devx-brand.png" + +// +// Components +// + +/** + * Renders a DEVx-style talk video thumbnail matching the DEVxYouTubeThumbnail.svg + * template layout: talk title on the left, circular speaker photo on the right, + * DEVxSD branding at bottom-left, dark silk texture background. + * + * 16:9 aspect ratio (YouTube standard 1280x720). + */ +export function TalkThumbnail({ + speakerName, + talkTitle, + profilePhotoUrl, + width = DEFAULT_WIDTH, + className +}: TalkThumbnailProps) { + const height = Math.round(width / ASPECT_RATIO) + + // Layout proportions matching the template + const pad = width * 0.06 + const photoRadius = Math.round(height * 0.3) + const photoBackdropRadius = photoRadius + Math.round(width * 0.01) + const photoCx = width - pad - photoBackdropRadius + const photoCy = height * 0.44 + const titleX = pad + const photoLeftEdge = photoCx - photoBackdropRadius + const titleGap = width * 0.04 + const titleMaxWidth = photoLeftEdge - pad - titleGap + const titleFontSize = Math.round(width * 0.058) + const titleY = height * 0.38 + const logoWidth = Math.round(width * 0.18) + const logoHeight = Math.round(logoWidth * (582 / 2772)) + const logoX = pad + const logoY = height - pad - logoHeight + + const titleLines = wrapText(talkTitle || "Your Talk Title", titleMaxWidth, titleFontSize) + + return ( + + + + {profilePhotoUrl ? ( + + + + ) : null} + + + {/* Dark silk texture background */} + + + {/* Speaker photo circle with light backdrop — right side */} + {profilePhotoUrl ? ( + <> + + + + ) : ( + + )} + + {/* Talk title — large bold white, left side */} + + {titleLines.map((line, i) => ( + + {line} + + ))} + + + {/* DEVxSD branding — bottom left */} + + + + ) +} + +const Wrapper = styled.div<{ $width: number; $height: number }>` + width: ${(p) => p.$width}px; + max-width: 100%; + aspect-ratio: 16 / 9; + overflow: hidden; + border-radius: 0.5rem; + border: 1px solid rgba(255, 255, 255, 0.1); + background: #0a0a0a; + + svg { + display: block; + width: 100%; + height: auto; + } +` + +// +// Functions +// + +/** Wrap text into lines that fit within maxWidth, max 3 lines. */ +function wrapText(text: string, maxWidth: number, fontSize: number): string[] { + if (!text.trim()) return ["Your Talk Title"] + const words = text.trim().split(/\s+/) + const approxCharWidth = fontSize * 0.52 + const maxLines = 3 + const lines: string[] = [] + let current = "" + + for (const word of words) { + const candidate = current ? `${current} ${word}` : word + if (candidate.length * approxCharWidth <= maxWidth) { + current = candidate + } else { + if (current) lines.push(current) + if (lines.length >= maxLines) { + const last = lines[lines.length - 1] + if (last && word) { + lines[lines.length - 1] = last + "..." + } + return lines + } + current = word + } + } + if (current && lines.length < maxLines) lines.push(current) + return lines +} diff --git a/app/submit-talk/page.tsx b/app/submit-talk/page.tsx index 3849fac..4840601 100644 --- a/app/submit-talk/page.tsx +++ b/app/submit-talk/page.tsx @@ -11,6 +11,7 @@ import { TextareaInput } from "../components/TextareaInput" import { RadioInput } from "../components/RadioInput" import { PageContainer } from "../components/PageContainer" import { SuccessMessage as SuccessMessageComponent } from "../components/SuccessMessage" +import { TalkThumbnail } from "../components/TalkThumbnail" import Link from "next/link" export default function SubmitTalk() { @@ -23,6 +24,7 @@ export default function SubmitTalk() { const [userEmail, setUserEmail] = useState("") const [userFullName, setUserFullName] = useState("") const [userHandle, setUserHandle] = useState(null) + const [profilePhotoUrl, setProfilePhotoUrl] = useState(null) const [profileId, setProfileId] = useState(null) const [profilePhoneNumber, setProfilePhoneNumber] = useState(null) const [isEditingPhone, setIsEditingPhone] = useState(false) @@ -63,15 +65,16 @@ export default function SubmitTalk() { const { handle } = getProfileFromCache(user) setUserHandle(handle) - // Load profile to get full name, profile_id, and phone number + // Load profile to get full name, profile_id, phone number, and profile photo (for thumbnail) const { data: profile } = await supabaseClient .from("profiles") - .select("id, full_name, phone_number") + .select("id, full_name, phone_number, profile_photo") .eq("user_id", user.id) .single() if (profile) { setUserFullName(profile.full_name) + setProfilePhotoUrl(profile.profile_photo || null) setProfileId(profile.id) setProfilePhoneNumber(profile.phone_number) // If profile has phone number, use it; otherwise start with empty @@ -400,6 +403,26 @@ export default function SubmitTalk() { required /> + + + + This is how your talk could look as a YouTube thumbnail. Update your{" "} + {userHandle ? ( + nametag + ) : ( + nametag + )}{" "} + to change your name and photo. + + + + + @@ -579,6 +602,11 @@ const InfoLink = styled(Link)` } ` +const ThumbnailPreviewWrap = styled.div` + max-width: 100%; + margin-top: 0.5rem; +` + const Label = styled.label` font-size: 0.875rem; font-weight: 700; diff --git a/app/talk-thumbnail-gen/page.tsx b/app/talk-thumbnail-gen/page.tsx new file mode 100644 index 0000000..3a773cd --- /dev/null +++ b/app/talk-thumbnail-gen/page.tsx @@ -0,0 +1,501 @@ +"use client" +import styled from "styled-components" +import { useState, useRef, useCallback } from "react" +import { supabaseClient } from "../../lib/supabaseClient" +import { TalkThumbnail } from "../components/TalkThumbnail" +import { TextInput } from "../components/TextInput" +import { Button } from "../components/Button" +import { PotionBackground } from "../components/PotionBackground" +import { PageContainer } from "../components/PageContainer" + +// +// Constants +// + +const THUMBNAIL_WIDTH = 1280 +const THUMBNAIL_HEIGHT = 720 + +// +// Components +// + +export default function TalkThumbnailGen() { + const [talkTitle, setTalkTitle] = useState("") + const [handle, setHandle] = useState("") + const [photoUrl, setPhotoUrl] = useState(null) + const [photoSource, setPhotoSource] = useState<"none" | "upload" | "handle">("none") + const [handleLoading, setHandleLoading] = useState(false) + const [handleError, setHandleError] = useState(null) + const fileInputRef = useRef(null) + const svgContainerRef = useRef(null) + + const handleFileUpload = useCallback( + (e: React.ChangeEvent) => { + const file = e.target.files?.[0] + if (!file) return + + if (photoUrl && photoSource === "upload") { + URL.revokeObjectURL(photoUrl) + } + + const blobUrl = URL.createObjectURL(file) + setPhotoUrl(blobUrl) + setPhotoSource("upload") + setHandle("") + setHandleError(null) + }, + [photoUrl, photoSource] + ) + + const handleLookup = useCallback(async () => { + if (!handle.trim()) return + + setHandleLoading(true) + setHandleError(null) + + try { + const { data: profile, error } = await supabaseClient + .from("profiles") + .select("full_name, profile_photo") + .eq("handle", handle.trim().toLowerCase()) + .single() + + if (error || !profile) { + setHandleError(`No profile found for @${handle.trim()}`) + return + } + + if (profile.profile_photo) { + if (photoUrl && photoSource === "upload") { + URL.revokeObjectURL(photoUrl) + } + setPhotoUrl(profile.profile_photo) + setPhotoSource("handle") + } else { + setHandleError(`@${handle.trim()} has no profile photo`) + } + } catch { + setHandleError("Failed to look up profile") + } finally { + setHandleLoading(false) + } + }, [handle, photoUrl, photoSource]) + + const clearPhoto = useCallback(() => { + if (photoUrl && photoSource === "upload") { + URL.revokeObjectURL(photoUrl) + } + setPhotoUrl(null) + setPhotoSource("none") + if (fileInputRef.current) { + fileInputRef.current.value = "" + } + }, [photoUrl, photoSource]) + + const downloadRaster = useCallback( + async (format: "png" | "jpg") => { + const svgEl = svgContainerRef.current?.querySelector("svg") + if (!svgEl) return + + const svgString = await buildEmbeddedSvgString(svgEl) + const svgBlob = new Blob([svgString], { type: "image/svg+xml" }) + const svgBlobUrl = URL.createObjectURL(svgBlob) + + const img = new Image() + img.width = THUMBNAIL_WIDTH + img.height = THUMBNAIL_HEIGHT + + img.onload = () => { + const canvas = document.createElement("canvas") + canvas.width = THUMBNAIL_WIDTH + canvas.height = THUMBNAIL_HEIGHT + const ctx = canvas.getContext("2d") + if (!ctx) return + + // JPG has no transparency — fill white first + if (format === "jpg") { + ctx.fillStyle = "#000000" + ctx.fillRect(0, 0, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT) + } + + ctx.drawImage(img, 0, 0, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT) + URL.revokeObjectURL(svgBlobUrl) + + const mimeType = format === "jpg" ? "image/jpeg" : "image/png" + // Quality 0.92 for JPG keeps it well under 2 MB + const quality = format === "jpg" ? 0.92 : undefined + + canvas.toBlob( + (blob) => { + if (!blob) return + const url = URL.createObjectURL(blob) + const a = document.createElement("a") + a.href = url + a.download = makeFilename(talkTitle, format) + a.click() + URL.revokeObjectURL(url) + }, + mimeType, + quality + ) + } + + img.src = svgBlobUrl + }, + [talkTitle] + ) + + return ( + <> + + + + + + Talk Thumbnail Generator + Create a YouTube thumbnail for your DEVx talk + + + + + setTalkTitle(e.target.value)} + placeholder="Enter your talk title" + /> + + + + + + + + + or + + + + + @ + setHandle(e.target.value)} + placeholder="username" + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault() + handleLookup() + } + }} + /> + + + {handleError && {handleError}} + + + + {photoUrl && ( + + + Photo loaded + {photoSource === "handle" ? ` from @${handle}` : " from upload"} + + + + )} + + + + + + + + + + + 1280 x 720 px · under 2 MB · YouTube ready + + + + ) +} + +// +// Styled Components +// + +const BackgroundContainer = styled.section` + background-color: #0a0a0a; + position: fixed; + height: 100vh; + width: 100vw; + top: 0; + left: 0; + z-index: -1; +` + +const WidePageContainer = styled(PageContainer)` + max-width: 960px; +` + +const Container = styled.main` + min-height: 100vh; + display: flex; + align-items: flex-start; + justify-content: center; + padding: 2rem 1rem; +` + +const Title = styled.h1` + font-size: 2rem; + font-weight: 700; + color: white; + margin: 0; + text-align: center; +` + +const Subtitle = styled.p` + color: rgba(255, 255, 255, 0.7); + margin: -1rem 0 0 0; + text-align: center; +` + +const FormSection = styled.div` + display: flex; + flex-direction: column; + gap: 1rem; + width: 100%; +` + +const PhotoRow = styled.div` + display: flex; + align-items: flex-end; + gap: 1.5rem; + width: 100%; + + & > div { + flex: 1; + } + + @media (max-width: 600px) { + flex-direction: column; + align-items: stretch; + } +` + +const PhotoStatusRow = styled.div` + display: flex; + align-items: center; + gap: 1rem; +` + +const Preview = styled.div` + width: 100%; + border-radius: 0.5rem; + overflow: hidden; + + & > div { + width: 100% !important; + } +` + +const Field = styled.div` + display: flex; + flex-direction: column; + gap: 0.375rem; +` + +const Label = styled.label` + font-size: 0.875rem; + font-weight: 700; + color: rgba(255, 255, 255, 0.9); +` + +const FileInput = styled.input` + padding: 0.5rem; + background-color: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 0.5rem; + color: white; + font-size: 0.875rem; + cursor: pointer; + + &::file-selector-button { + padding: 0.375rem 0.75rem; + margin-right: 0.75rem; + background-color: rgba(156, 163, 255, 0.2); + border: 1px solid rgba(156, 163, 255, 0.4); + border-radius: 0.375rem; + color: white; + cursor: pointer; + font-size: 0.8125rem; + transition: all 0.2s ease; + + &:hover { + background-color: rgba(156, 163, 255, 0.3); + } + } +` + +const HandleRow = styled.div` + display: flex; + align-items: center; + gap: 0.5rem; + + input { + flex: 1; + } +` + +const HandlePrefix = styled.span` + color: rgba(255, 255, 255, 0.5); + font-size: 1rem; + font-weight: 600; + flex-shrink: 0; +` + +const ErrorText = styled.p` + margin: 0; + color: #ff6b6b; + font-size: 0.8125rem; +` + +const PhotoStatus = styled.p` + margin: 0; + color: rgba(156, 163, 255, 0.9); + font-size: 0.8125rem; +` + +const OrDivider = styled.div` + text-align: center; + color: rgba(255, 255, 255, 0.4); + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.1em; + flex-shrink: 0; + padding-bottom: 0.5rem; + + @media (max-width: 600px) { + padding-bottom: 0; + } +` + +const DownloadRow = styled.div` + display: flex; + justify-content: center; + gap: 0.75rem; +` + +const SpecNote = styled.p` + margin: -1rem 0 0 0; + text-align: center; + color: rgba(255, 255, 255, 0.4); + font-size: 0.75rem; +` + +// +// Functions +// + +function makeFilename(title: string, ext: string): string { + const slug = (title || "talk-thumbnail") + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-|-$/g, "") + .slice(0, 50) + return `${slug}-thumbnail.${ext}` +} + +/** + * Convert an image URL (relative, absolute, or blob) to a base64 data URL + * by drawing it onto a temporary canvas. + */ +async function urlToDataUrl(src: string): Promise { + // Already a data URL — return as-is + if (src.startsWith("data:")) return src + + // Resolve relative paths to absolute + const resolved = src.startsWith("/") ? `${window.location.origin}${src}` : src + + const response = await fetch(resolved) + const blob = await response.blob() + + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onloadend = () => resolve(reader.result as string) + reader.onerror = reject + reader.readAsDataURL(blob) + }) +} + +/** + * Clone the live SVG element, convert every `` to an + * embedded base64 data URL, and return the serialized SVG string. + * This makes the exported SVG/PNG fully self-contained. + */ +async function buildEmbeddedSvgString(svgEl: SVGSVGElement): Promise { + const clone = svgEl.cloneNode(true) as SVGSVGElement + const images = clone.querySelectorAll("image") + + await Promise.all( + Array.from(images).map(async (img) => { + const href = + img.getAttribute("href") || img.getAttributeNS("http://www.w3.org/1999/xlink", "href") + if (!href || href.startsWith("data:")) return + try { + const dataUrl = await urlToDataUrl(href) + img.setAttribute("href", dataUrl) + // Remove xlink:href if present to avoid duplicates + img.removeAttributeNS("http://www.w3.org/1999/xlink", "href") + } catch { + // If an image fails to convert, leave the original href + } + }) + ) + + const serializer = new XMLSerializer() + return serializer.serializeToString(clone) +} diff --git a/package.json b/package.json index d2a2fd2..c8c457d 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "type": "module", "scripts": { "dev": "next dev", + "dev:supabase": "supabase start", "build": "next build", "start": "next start", "lint": "next lint", diff --git a/public/images/devx-thumbnail-bg.png b/public/images/devx-thumbnail-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b527d92a0b225ab67eb7ac1c46e40544ddc2aa GIT binary patch literal 90392 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

wxfLdB`eQ_w#t?mJAZv0U&~ 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 + - - - - Houdini Overview and Custom Properties Dive - - - -

-
- Slide 1 -
-
- Slide 2 -
-
- Slide 3 -
-
- Slide 4 -
-
- Slide 5 -
-
- Slide 6 -
-
- Slide 7 -
-
- Slide 8 -
- -
- -
- 1 / 8 -
- -
-
- - - - \ No newline at end of file + + + + Houdini Overview and Custom Properties Dive + + + +
+
+ Slide 1 +
+
+ Slide 2 +
+
+ Slide 3 +
+
+ Slide 4 +
+
+ Slide 5 +
+
+ Slide 6 +
+
+ Slide 7 +
+
+ Slide 8 +
+ +
+ +
+ 1 / 8 +
+ +
+
+ + + + diff --git a/public/slides/opencode-ai-coding-agent-sam-holmes/slides.html b/public/slides/opencode-ai-coding-agent-sam-holmes/slides.html index 0c39d6b..b326b93 100644 --- a/public/slides/opencode-ai-coding-agent-sam-holmes/slides.html +++ b/public/slides/opencode-ai-coding-agent-sam-holmes/slides.html @@ -1,4 +1,816 @@ -Getting Started +
code { + min-width: 328px; + } + div#\:\$p > svg > foreignObject > section table { + border-collapse: collapse; + margin: 0 auto 15px; + } + div#\:\$p > svg > foreignObject > section table > tbody > tr > td, + div#\:\$p > svg > foreignObject > section table > tbody > tr > th, + div#\:\$p > svg > foreignObject > section table > thead > tr > td, + div#\:\$p > svg > foreignObject > section table > thead > tr > th { + padding: 0.15em 0.5em; + } + div#\:\$p > svg > foreignObject > section table > thead > tr > td, + div#\:\$p > svg > foreignObject > section table > thead > tr > th { + border-bottom: 3px solid; + } + div#\:\$p > svg > foreignObject > section table > tbody > tr:not(:last-child) > td, + div#\:\$p > svg > foreignObject > section table > tbody > tr:not(:last-child) > th { + border-bottom: 1px solid; + } + div#\:\$p > svg > foreignObject > section blockquote { + font-size: 90%; + line-height: 1.3; + padding: 0 2em; + position: relative; + z-index: 0; + } + div#\:\$p > svg > foreignObject > section blockquote:after, + div#\:\$p > svg > foreignObject > section blockquote:before { + content: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBkPSJNNDQgMTkuMyAzOC45NCAwQzguMTQgOS41OSAwIDQwLjA1IDAgNTQuODNWMTAwaDQxLjQ3VjU0LjgzaC0yM2MtLjA0LS4yOC4yNS0yNy42NiAyNS41My0zNS41M201NiAwTDk0Ljk0IDBDNjQuMTQgOS41OSA1NiA0MC4wNSA1NiA1NC44M1YxMDBoNDEuNDdWNTQuODNoLTIzYy0uMDQtLjI4LjI1LTI3LjY2IDI1LjUzLTM1LjUzIiBzdHlsZT0iZmlsbDojODg4O29wYWNpdHk6LjMzIi8+PC9zdmc+"); + height: auto; + pointer-events: none; + position: absolute; + width: 1em; + z-index: -1; + } + div#\:\$p > svg > foreignObject > section blockquote:before { + left: 0; + top: 0; + } + div#\:\$p > svg > foreignObject > section blockquote:after { + bottom: 0; + right: 0; + transform: rotate(180deg); + } + div#\:\$p > svg > foreignObject > section blockquote > :last-child { + margin-bottom: 0; + } + div#\:\$p > svg > foreignObject > section mark { + background: transparent; + color: var(--color-highlight); + } + div#\:\$p > svg > foreignObject > :where(section):not([\20 root]) { + --color-background: #110e0b; + --color-foreground: #ffffff; + --color-highlight: #ffffff; + --color-dimmed: #737373; + } + div#\:\$p > svg > foreignObject > section { + background: #110e0b; + font-family: "IBM Plex Mono", "SF Mono", "Menlo", "Monaco", "Consolas", monospace; + letter-spacing: 0.02em; + } + div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) { + color: #ffffff; + font-weight: 600; + font-family: "IBM Plex Mono", monospace; + letter-spacing: 0.05em; + } + div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) { + color: #ffffff; + font-weight: 500; + font-family: "IBM Plex Mono", monospace; + letter-spacing: 0.03em; + } + div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) { + color: #a3a3a3; + font-weight: 500; + font-family: "IBM Plex Mono", monospace; + } + div#\:\$p > svg > foreignObject > section p { + color: #d4d4d4; + } + div#\:\$p > svg > foreignObject > section code { + background: #1a1714; + color: #ffffff; + padding: 0.2em 0.4em; + border-radius: 4px; + font-family: "IBM Plex Mono", monospace; + border: 1px solid #2a2420; + } + div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) { + background: #0a0908; + border: 1px solid #2a2420; + border-radius: 8px; + padding: 1em; + } + div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code { + background: transparent; + color: #e5e5e5; + border: none; + } + div#\:\$p > svg > foreignObject > section a { + color: #ffffff; + text-decoration: underline; + text-underline-offset: 3px; + } + div#\:\$p > svg > foreignObject > section a:hover { + color: #a3a3a3; + } + div#\:\$p > svg > foreignObject > section strong { + color: #ffffff; + font-weight: 600; + } + div#\:\$p > svg > foreignObject > section ul, + div#\:\$p > svg > foreignObject > section ol { + text-align: left; + color: #d4d4d4; + } + div#\:\$p > svg > foreignObject > section li { + margin: 0.5em 0; + } + div#\:\$p > svg > foreignObject > section li::marker { + color: #525252; + } + div#\:\$p > svg > foreignObject > section blockquote { + border-left: 2px solid #4a4238; + padding-left: 1em; + color: #737373; + font-style: normal; + } + div#\:\$p > svg > foreignObject > section table { + border-collapse: collapse; + width: 100%; + } + div#\:\$p > svg > foreignObject > section th { + background: #0a0908; + color: #ffffff; + font-weight: 500; + border-bottom: 1px solid #2a2420; + } + div#\:\$p > svg > foreignObject > section td { + border-bottom: 1px solid #1a1714; + color: #d4d4d4; + } + div#\:\$p > svg > foreignObject > section .columns { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 2em; + } + div#\:\$p > svg > foreignObject > section .highlight { + color: #ffffff; + font-weight: 600; + } + div#\:\$p > svg > foreignObject > section .dimmed { + color: #525252; + } + div#\:\$p > svg > foreignObject > section img { + border-radius: 8px; + } + div#\:\$p > svg > foreignObject > section::after { + color: #525252; + font-family: "IBM Plex Mono", monospace; + font-size: 0.6em; + } + div#\:\$p > svg > foreignObject > section::after { + --marpit-root-font-size: 0.6em; + } + div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] { + columns: initial !important; + display: block !important; + padding: 0 !important; + } + div#\:\$p + > svg + > foreignObject + > section[data-marpit-advanced-background="background"]::before, + div#\:\$p + > svg + > foreignObject + > section[data-marpit-advanced-background="background"]::after, + div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, + div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after { + display: none !important; + } + div#\:\$p + > svg + > foreignObject + > section[data-marpit-advanced-background="background"] + > div[data-marpit-advanced-background-container] { + all: initial; + display: flex; + flex-direction: row; + height: 100%; + overflow: hidden; + width: 100%; + } + div#\:\$p + > svg + > foreignObject + > section[data-marpit-advanced-background="background"] + > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"] { + flex-direction: column; + } + div#\:\$p + > svg + > foreignObject + > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] + > div[data-marpit-advanced-background-container] { + width: var(--marpit-advanced-background-split, 50%); + } + div#\:\$p + > svg + > foreignObject + > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] + > div[data-marpit-advanced-background-container] { + margin-left: calc(100% - var(--marpit-advanced-background-split, 50%)); + } + div#\:\$p + > svg + > foreignObject + > section[data-marpit-advanced-background="background"] + > div[data-marpit-advanced-background-container] + > figure { + all: initial; + background-position: center; + background-repeat: no-repeat; + background-size: cover; + flex: auto; + margin: 0; + } + div#\:\$p + > svg + > foreignObject + > section[data-marpit-advanced-background="background"] + > div[data-marpit-advanced-background-container] + > figure + > figcaption { + position: absolute; + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + white-space: nowrap; + width: 1px; + } + div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], + div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"] { + background: transparent !important; + } + div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], + div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"] { + pointer-events: none !important; + } + div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split] { + width: 100%; + height: 100%; + } + + + +
+ +
+
+ +
-

-

Presented by Sam Holmes

-
-
+

+

Presented by Sam Holmes

+
+
+
-

What is OpenCode?

-

An open source AI coding agent available as:

-
    -
  • Terminal-based interface (TUI)
  • -
  • Desktop app
  • -
  • IDE extension
  • -
-
-

Work with any LLM provider on your projects

-
-
-
+

What is OpenCode?

+

An open source AI coding agent available as:

+
    +
  • Terminal-based interface (TUI)
  • +
  • Desktop app
  • +
  • IDE extension
  • +
+
+

Work with any LLM provider on your projects

+
+
+
+
What is OpenCode? font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="3" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Why OpenCode?

-
    -
  • Open Source - Community-driven development
  • -
  • Provider Agnostic - Any LLM provider
  • -
  • Customizable - Themes, keybinds, agents
  • -
  • Extensible - MCP servers & plugins
  • -
  • Polished - High-quality TUI compared to other tools
  • -
-
-
+

Why OpenCode?

+
    +
  • Open Source - Community-driven development
  • +
  • Provider Agnostic - Any LLM provider
  • +
  • Customizable - Themes, keybinds, agents
  • +
  • Extensible - MCP servers & plugins
  • +
  • Polished - High-quality TUI compared to other tools
  • +
+
+
+
Why OpenCode? font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="4" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Getting Started

-
-
+

Getting Started

+
+
+
Getting Started font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="5" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Installation

-
# Install script (easiest)
-curl -fsSL https://opencode.ai/install | bash
+"
+						lang="en-US"
+						class="invert"
+						data-marpit-pagination="5"
+						style="
+							--class: invert;
+							--paginate: true;
+							--theme: uncover;
+							--style: @import
+								url("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap");
+						"
+						data-marpit-pagination-total="36"
+					>
+						

Installation

+
+							# Install script (easiest)
+								curl -fsSL https://opencode.ai/install | bash
 
-# Or via package managers
-brew install anomalyco/tap/opencode  # macOS/Linux
-npm install -g opencode-ai           # Node.js
-choco install opencode               # Windows
-
-
-
# Or via package managers + brew install anomalyco/tap/opencode + # macOS/Linux npm install -g opencode-ai + # Node.js choco install opencode + # Windows + + +
+
+
Installation font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="6" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Configuration

-

Connect to your LLM provider:

-
/connect
-
-

Choose from:

-
    -
  • OpenCode Zen - Curated models (recommended for beginners)
  • -
  • Anthropic, OpenAI, Google, and more
  • -
-
-
+

Configuration

+

Connect to your LLM provider:

+
/connect 
+

Choose from:

+
    +
  • OpenCode Zen - Curated models (recommended for beginners)
  • +
  • Anthropic, OpenAI, Google, and more
  • +
+
+
+
Configuration font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="7" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Initialize Your Project

-
cd /path/to/project
-opencode
-
-

Then run:

-
/init
-
-

Creates an AGENTS.md file with project context

-
-
+

Initialize Your Project

+
+							cd /path/to/project opencode
+							
+						
+

Then run:

+
/init 
+

Creates an AGENTS.md file with project context

+
+
+
Initialize Your Project font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="8" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Core Features

-
-
+

Core Features

+
+
+
Core Features font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="9" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

File References

-

Use @ to reference files in your prompts:

-
How is auth handled in @src/api/auth.ts?
-
-

Fuzzy file search built-in

-
-
+

File References

+

Use @ to reference files in your prompts:

+
+							How is auth handled in @src/api/auth.ts? 
+						
+

Fuzzy file search built-in

+
+
+
File References font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="10" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Undo & Redo

-

Made a mistake? No problem:

-
/undo    # Revert changes + restore files
-/redo    # Restore undone changes
-
-

Uses Git under the hood for file restoration

-
-
+

Undo & Redo

+

Made a mistake? No problem:

+
+							/undo # Revert changes + restore files /redo # Restore undone changes 
+						
+

Uses Git under the hood for file restoration

+
+
+
Undo & Redo font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="11" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Shell Commands

-

Run commands directly with !:

-
!npm test
-!git status
-!ls -la
-
-

Output is added to the conversation context

-
-
+

Shell Commands

+

Run commands directly with !:

+
+							!npm test !git status !ls -la 
+						
+

Output is added to the conversation context

+
+
+
Shell Commands font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="12" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Agents

-
-
+

Agents

+
+
+
Agents font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="13" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Built-in Agents

-

Primary Agents (Tab to switch):

-
    -
  • Build - Full development access
  • -
  • Plan - Read-only analysis
  • -
-

Subagents (@ to invoke):

-
    -
  • General - Multi-step research tasks
  • -
  • Explore - Fast codebase exploration
  • -
-
-
+

Built-in Agents

+

Primary Agents (Tab to switch):

+
    +
  • Build - Full development access
  • +
  • Plan - Read-only analysis
  • +
+

Subagents (@ to invoke):

+
    +
  • General - Multi-step research tasks
  • +
  • Explore - Fast codebase exploration
  • +
+
+
+
Built-in Agents font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="14" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Custom Agents

-

Create specialized agents in ~/.config/opencode/agent/:

-
---
-description: Reviews code for security issues
-mode: subagent
-tools:
-  write: false
-  edit: false
----
+"
+						lang="en-US"
+						class="invert"
+						data-marpit-pagination="14"
+						style="
+							--class: invert;
+							--paginate: true;
+							--theme: uncover;
+							--style: @import
+								url("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap");
+						"
+						data-marpit-pagination-total="36"
+					>
+						

Custom Agents

+

Create specialized agents in ~/.config/opencode/agent/:

+
+							--- description: Reviews code for security issues mode: subagent tools: write:
+								false
+								 edit: false ---
 
-You are a security auditor. Focus on:
-- Input validation
-- Authentication flaws
-- Data exposure risks
-
-
-
- Input validation + - Authentication flaws + - Data exposure risks + + +
+
+
Custom Agents font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="15" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Agent Permissions

-

Fine-grained control:

-
{
-  "agent": {
-    "plan": {
-      "permission": {
-        "edit": "deny",
-        "bash": "ask"
-      }
-    }
-  }
-}
-
-

allow | ask | deny

-
-
+

Agent Permissions

+

Fine-grained control:

+
+							{
+								"agent": {
+								"plan": {
+								"permission": {
+								"edit":
+								"deny",
+								"bash":
+								"ask"
+								}
+								}
+								}
+								}
+							
+						
+

allow | ask | deny

+
+
+
Agent Permissions font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="16" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

MCP Servers

-

Model Context Protocol

-
-
+

MCP Servers

+

Model Context Protocol

+
+
+
MCP Servers font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="17" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

What is MCP?

-

Add external tools to OpenCode:

-
    -
  • Local - Run commands on your machine
  • -
  • Remote - Connect to web services
  • -
-

Tools become available to the LLM automatically

-
-
+

What is MCP?

+

Add external tools to OpenCode:

+
    +
  • Local - Run commands on your machine
  • +
  • Remote - Connect to web services
  • +
+

Tools become available to the LLM automatically

+
+
+
What is MCP? font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="18" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Remote MCP Example

-
{
-  "mcp": {
-    "sentry": {
-      "type": "remote",
-      "url": "https://mcp.sentry.dev/mcp"
-    }
-  }
-}
-
-

Auth: opencode mcp auth sentry

-
-
+

Remote MCP Example

+
+							{
+								"mcp": {
+								"sentry": {
+								"type":
+								"remote",
+								"url":
+								"https://mcp.sentry.dev/mcp"
+								}
+								}
+								}
+							
+						
+

Auth: opencode mcp auth sentry

+
+
+
Remote MCP Example font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="19" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Local MCP Example

-
{
-  "mcp": {
-    "my-tools": {
-      "type": "local",
-      "command": ["npx", "-y", "my-mcp-server"],
-      "environment": {
-        "API_KEY": "{env:MY_API_KEY}"
-      }
-    }
-  }
-}
-
-
-
+

Local MCP Example

+
+							{
+								"mcp": {
+								"my-tools": {
+								"type":
+								"local",
+								"command": ["npx",
+								"-y",
+								"my-mcp-server"],
+								"environment": {
+								"API_KEY":
+								"{env:MY_API_KEY}"
+								}
+								}
+								}
+								}
+							
+						
+
+
+
Local MCP Example font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="20" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Commands & Keybinds

-
-
+

Commands & Keybinds

+
+
+
Commands & Keybinds font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="21" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Essential Commands

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CommandDescription
/helpShow help dialog
/initCreate AGENTS.md
/newStart new session
/sessionsList all sessions
/shareShare conversation
/compactSummarize session
-
-
+

Essential Commands

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CommandDescription
/helpShow help dialog
/initCreate AGENTS.md
/newStart new session
/sessionsList all sessions
/shareShare conversation
/compactSummarize session
+
+
+
Essential Commands font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="22" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Default Keybinds

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyAction
TabSwitch agent mode
ctrl+x hHelp
ctrl+x nNew session
ctrl+x uUndo
ctrl+x rRedo
ctrl+x sShare
-
-
+

Default Keybinds

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyAction
TabSwitch agent mode
ctrl+x hHelp
ctrl+x nNew session
ctrl+x uUndo
ctrl+x rRedo
ctrl+x sShare
+
+
+
Default Keybinds font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="23" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Customization

-
-
+

Customization

+
+
+
Customization font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="24" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Themes

-
/themes
-
-

Or configure in opencode.json:

-
{
-  "theme": "opencode"
-}
-
-
-
+

Themes

+
/themes 
+

Or configure in opencode.json:

+
+							{
+								"theme":
+								"opencode"
+								}
+							
+						
+
+
+
Themes font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="25" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Configuration File

-

~/.config/opencode/opencode.json:

-
{
-  "$schema": "https://opencode.ai/config.json",
-  "provider": {
-    "default": "anthropic"
-  },
-  "model": {
-    "default": "anthropic/claude-sonnet-4"
-  }
-}
-
-
-
+

Configuration File

+

~/.config/opencode/opencode.json:

+
+							{
+								"$schema":
+								"https://opencode.ai/config.json",
+								"provider": {
+								"default":
+								"anthropic"
+								},
+								"model": {
+								"default":
+								"anthropic/claude-sonnet-4"
+								}
+								}
+							
+						
+
+
+
Configuration File font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="26" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Project Rules

-

Create .opencode/AGENTS.md or AGENTS.md:

-
# Project Guidelines
+"
+						lang="en-US"
+						class="invert"
+						data-marpit-pagination="26"
+						style="
+							--class: invert;
+							--paginate: true;
+							--theme: uncover;
+							--style: @import
+								url("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap");
+						"
+						data-marpit-pagination-total="36"
+					>
+						

Project Rules

+

Create .opencode/AGENTS.md or AGENTS.md:

+
+							# Project Guidelines
 
-- Use TypeScript for all new files
-- Follow existing code patterns
-- Run tests before committing
-
-
-
- Use TypeScript for all new files + - Follow existing code patterns + - Run tests before committing + + +
+
+
Project Rules font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="27" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Sharing & Collaboration

-
-
+

Sharing & Collaboration

+
+
+
Sharing & Collaboration font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="28" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Share Conversations

-
/share
-
-

Creates a shareable link:
-https://opencode.ai/s/abc123

-

Unshare with /unshare

-
-
+

Share Conversations

+
/share 
+

Creates a shareable link:
https://opencode.ai/s/abc123

+

Unshare with /unshare

+
+
+
Share Conversations font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="29" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Export Conversations

-
/export
-
-

Opens conversation as Markdown in your editor

-

Set your editor:

-
export EDITOR="code --wait"
-
-
-
+

Export Conversations

+
/export 
+

Opens conversation as Markdown in your editor

+

Set your editor:

+
+							export EDITOR="code --wait"
+							
+						
+
+
+
Export Conversations font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="30" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Pro Tips

-
-
+

Pro Tips

+
+
+
Pro Tips font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="31" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Effective Prompting

-
    -
  1. Be specific - Reference files with @
  2. -
  3. Provide context - Explain the "why"
  4. -
  5. Use images - Drag & drop into terminal
  6. -
  7. Iterate - Plan first, then build
  8. -
-
-
+

Effective Prompting

+
    +
  1. Be specific - Reference files with @
  2. +
  3. Provide context - Explain the "why"
  4. +
  5. Use images - Drag & drop into terminal
  6. +
  7. Iterate - Plan first, then build
  8. +
+
+
+
Effective Prompting font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="32" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Workflow Example

-
<Tab to Plan mode>
-
-When a user deletes a note, flag it as deleted.
-Create a screen showing recently deleted notes.
-Allow undelete or permanent delete.
-
-<Review plan, provide feedback>
-
-<Tab to Build mode>
-
-Sounds good! Make the changes.
-
-
-
+

Workflow Example

+
+							<Tab to Plan mode> When a user deletes a note, flag it as deleted. Create a
+								screen showing recently deleted notes. Allow undelete or permanent delete.
+								<Review plan, provide feedback> <Tab to Build mode> Sounds good! Make
+								the changes.
+							
+						
+
+
+
Workflow Example font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="33" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Best Practices

-
    -
  • Commit AGENTS.md to your repo
  • -
  • Use Plan mode for complex features
  • -
  • Run /compact to reduce context size
  • -
  • Create custom agents for repetitive tasks
  • -
-
-
+

Best Practices

+
    +
  • Commit AGENTS.md to your repo
  • +
  • Use Plan mode for complex features
  • +
  • Run /compact to reduce context size
  • +
  • Create custom agents for repetitive tasks
  • +
+
+
+
Best Practices font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="34" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Demo

-
-
+

Demo

+
+
+
Demo font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="35" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

One More Thing...

-
-
+

One More Thing...

+
+
+
One More Thing... font-family: 'IBM Plex Mono', monospace; font-size: 0.6em; } -" lang="en-US" class="invert" data-marpit-pagination="36" style="--class:invert;--paginate:true;--theme:uncover;--style:@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap') -;" data-marpit-pagination-total="36"> -

Thank You!

-

Questions?

-
-

- Welcome everyone -- Today we're walking through OpenCode -- Open source AI coding agent -- Show you how to get started and key features

- OpenCode is an AI coding assistant -- Multiple interfaces: terminal, desktop, IDE -- Works with ANY LLM provider - not locked in

Why OpenCode? -- Fully open source on GitHub -- Use Claude, GPT, Gemini, local models - your choice -- Everything is customizable (and if it isn't it is cause it's open source) -- Extend with MCP protocol for external tools -- Actually polished and stable - Best terminal experience of any AI coding tool

- Let's dive into setup -- Very quick to get running

- One-liner install script is easiest -- Also available via Homebrew, npm, Chocolatey -- Cross-platform: Mac, Linux, Windows -- Takes about 30 seconds

- First thing: connect to a provider -- /connect command in the TUI -- OpenCode Zen is their managed service - easy start -- Or bring your own API keys -- Supports all major providers

- Navigate to your project -- Run opencode to start the TUI -- /init analyzes your codebase -- Creates AGENTS.md with project context -- Commit this file to your repo -- Helps the AI understand your project

- Now let's look at the key features -- Things you'll use every day

- @ symbol triggers file search -- Fuzzy matching - don't need exact path -- File content automatically added to context -- Great for asking questions about specific code

- AI made wrong changes? Just /undo -- Reverts conversation AND file changes -- Uses Git internally for file restoration -- Project must be a Git repo -- Can undo multiple times -- /redo brings changes back

- Bang prefix runs shell commands -- Output goes into conversation -- AI can see the results -- Great for running tests, checking status -- Stays in context for follow-up questions

- Agents are a powerful feature -- Specialized AI assistants for different tasks

- Two types: Primary and Subagents -- Build mode: full access, can edit files -- Plan mode: read-only, just analyzes and suggests -- Tab key switches between them -- Subagents invoked with @ mention -- General for complex research -- Explore for quick codebase navigation

- Create your own agents -- Markdown files with frontmatter config -- Define what tools they can access -- Write custom system prompts -- Example: security auditor, code reviewer -- Disable write/edit for read-only agents

- Three permission levels -- Allow: just do it -- Ask: prompt before executing -- Deny: completely blocked -- Configure per-agent -- Great for safety guardrails

- MCP extends OpenCode with external tools -- Standard protocol for AI tool integration

- Model Context Protocol -- Two types: local and remote -- Local: run commands, scripts -- Remote: connect to APIs, services -- Once configured, AI can use them -- No extra prompting needed

- Remote MCP connects to web services -- Example: Sentry for error tracking -- Add to opencode.json config -- OAuth authentication supported -- Run mcp auth command to connect -- Then ask AI about your Sentry issues

- Local MCP runs on your machine -- Specify command to start server -- Pass environment variables -- Can use env: syntax for secrets -- Many community MCP servers available

- Quick reference for common commands -- Keyboard shortcuts for power users

- /help shows all available commands -- /init creates project context file -- /new starts fresh conversation -- /sessions to resume previous work -- /share creates shareable link -- /compact summarizes to reduce context

- Tab switches Build/Plan mode -- ctrl+x is the leader key -- All shortcuts start with ctrl+x -- Fully customizable in config -- h for help, n for new, u for undo -- Learn these for faster workflow

- OpenCode is highly customizable -- Make it your own

- Multiple built-in themes -- /themes command to browse -- Set in config for persistence -- Community themes available too

- Main config in ~/.config/opencode/ -- JSON with schema for autocomplete -- Set default provider and model -- Configure everything here -- Keybinds, themes, agents, MCP servers

- Project-specific instructions -- Goes in root or .opencode folder -- AI reads this for context -- Define coding standards -- Specify conventions -- Commit to your repo

- Share your AI conversations -- Great for team collaboration

- /share creates public link -- Anyone with link can view -- Great for code reviews -- Share debugging sessions -- /unshare to revoke access -- Not shared by default

- Export to Markdown file -- Opens in your configured editor -- Set EDITOR environment variable -- Use --wait flag for GUI editors -- Good for documentation

- Tips from power users -- Get the most out of OpenCode

- Reference specific files with @ -- Give context: why you need this -- Can drag images into terminal -- Start in Plan mode, review, then Build -- Treat it like a junior developer

- Real workflow example -- Start in Plan mode -- Describe the feature clearly -- Review the suggested approach -- Give feedback, iterate -- Switch to Build when ready -- Confirm to implement

- AGENTS.md should be in version control -- Plan mode prevents accidental changes -- /compact when context gets too long -- Custom agents save time on repeated work

- Live demonstration -- Show actual usage -- Walk through a real task

- One more exciting thing to share -- [Add your surprise content here]

- Thanks for attending -- Install command on screen -- Happy to answer questions -- Resources: opencode.ai/docs -- GitHub: github.com/anomalyco/opencode -- Discord: opencode.ai/discord

\ No newline at end of file +" + lang="en-US" + class="invert" + data-marpit-pagination="36" + style=" + --class: invert; + --paginate: true; + --theme: uncover; + --style: @import + url("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap"); + " + data-marpit-pagination-total="36" + > +

Thank You!

+

Questions?

+ + + + +
+

+ - Welcome everyone - Today we're walking through OpenCode - Open source AI coding agent - + Show you how to get started and key features +

+
+
+

+ - OpenCode is an AI coding assistant - Multiple interfaces: terminal, desktop, IDE - Works + with ANY LLM provider - not locked in +

+
+
+

+ Why OpenCode? - Fully open source on GitHub - Use Claude, GPT, Gemini, local models - your + choice - Everything is customizable (and if it isn't it is cause it's open source) - Extend + with MCP protocol for external tools - Actually polished and stable - Best terminal + experience of any AI coding tool +

+
+
+

- Let's dive into setup - Very quick to get running

+
+
+

+ - One-liner install script is easiest - Also available via Homebrew, npm, Chocolatey - + Cross-platform: Mac, Linux, Windows - Takes about 30 seconds +

+
+
+

+ - First thing: connect to a provider - /connect command in the TUI - OpenCode Zen is their + managed service - easy start - Or bring your own API keys - Supports all major providers +

+
+
+

+ - Navigate to your project - Run opencode to start the TUI - /init analyzes your codebase - + Creates AGENTS.md with project context - Commit this file to your repo - Helps the AI + understand your project +

+
+
+

- Now let's look at the key features - Things you'll use every day

+
+
+

+ - @ symbol triggers file search - Fuzzy matching - don't need exact path - File content + automatically added to context - Great for asking questions about specific code +

+
+
+

+ - AI made wrong changes? Just /undo - Reverts conversation AND file changes - Uses Git + internally for file restoration - Project must be a Git repo - Can undo multiple times - + /redo brings changes back +

+
+
+

+ - Bang prefix runs shell commands - Output goes into conversation - AI can see the results - + Great for running tests, checking status - Stays in context for follow-up questions +

+
+
+

- Agents are a powerful feature - Specialized AI assistants for different tasks

+
+
+

+ - Two types: Primary and Subagents - Build mode: full access, can edit files - Plan mode: + read-only, just analyzes and suggests - Tab key switches between them - Subagents invoked + with @ mention - General for complex research - Explore for quick codebase navigation +

+
+
+

+ - Create your own agents - Markdown files with frontmatter config - Define what tools they + can access - Write custom system prompts - Example: security auditor, code reviewer - + Disable write/edit for read-only agents +

+
+
+

+ - Three permission levels - Allow: just do it - Ask: prompt before executing - Deny: + completely blocked - Configure per-agent - Great for safety guardrails +

+
+
+

- MCP extends OpenCode with external tools - Standard protocol for AI tool integration

+
+
+

+ - Model Context Protocol - Two types: local and remote - Local: run commands, scripts - + Remote: connect to APIs, services - Once configured, AI can use them - No extra prompting + needed +

+
+
+

+ - Remote MCP connects to web services - Example: Sentry for error tracking - Add to + opencode.json config - OAuth authentication supported - Run mcp auth command to connect - + Then ask AI about your Sentry issues +

+
+
+

+ - Local MCP runs on your machine - Specify command to start server - Pass environment + variables - Can use env: syntax for secrets - Many community MCP servers available +

+
+
+

- Quick reference for common commands - Keyboard shortcuts for power users

+
+
+

+ - /help shows all available commands - /init creates project context file - /new starts + fresh conversation - /sessions to resume previous work - /share creates shareable link - + /compact summarizes to reduce context +

+
+
+

+ - Tab switches Build/Plan mode - ctrl+x is the leader key - All shortcuts start with ctrl+x + - Fully customizable in config - h for help, n for new, u for undo - Learn these for faster + workflow +

+
+
+

- OpenCode is highly customizable - Make it your own

+
+
+

+ - Multiple built-in themes - /themes command to browse - Set in config for persistence - + Community themes available too +

+
+
+

+ - Main config in ~/.config/opencode/ - JSON with schema for autocomplete - Set default + provider and model - Configure everything here - Keybinds, themes, agents, MCP servers +

+
+
+

+ - Project-specific instructions - Goes in root or .opencode folder - AI reads this for + context - Define coding standards - Specify conventions - Commit to your repo +

+
+
+

- Share your AI conversations - Great for team collaboration

+
+
+

+ - /share creates public link - Anyone with link can view - Great for code reviews - Share + debugging sessions - /unshare to revoke access - Not shared by default +

+
+
+

+ - Export to Markdown file - Opens in your configured editor - Set EDITOR environment + variable - Use --wait flag for GUI editors - Good for documentation +

+
+
+

- Tips from power users - Get the most out of OpenCode

+
+
+

+ - Reference specific files with @ - Give context: why you need this - Can drag images into + terminal - Start in Plan mode, review, then Build - Treat it like a junior developer +

+
+
+

+ - Real workflow example - Start in Plan mode - Describe the feature clearly - Review the + suggested approach - Give feedback, iterate - Switch to Build when ready - Confirm to + implement +

+
+
+

+ - AGENTS.md should be in version control - Plan mode prevents accidental changes - /compact + when context gets too long - Custom agents save time on repeated work +

+
+
+

- Live demonstration - Show actual usage - Walk through a real task

+
+
+

- One more exciting thing to share - [Add your surprise content here]

+
+
+

+ - Thanks for attending - Install command on screen - Happy to answer questions - Resources: + opencode.ai/docs - GitHub: github.com/anomalyco/opencode - Discord: opencode.ai/discord +

+
+ + + +