1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-04-26 04:45:22 -04:00

offload videos to vercel blob storage

This commit is contained in:
Jake Jarvis 2025-03-19 16:14:10 -04:00
parent c134ae76fd
commit d714e6e99b
Signed by: jake
SSH Key Fingerprint: SHA256:nCkvAjYA6XaSPUqc4TfbBQTpzr8Xj7ritg/sGInCdkc
47 changed files with 204 additions and 418 deletions

View File

@ -17,7 +17,14 @@ const Page = () => {
<>
<PageTitle canonical="/birthday">1996.mov</PageTitle>
<Video src={["/static/birthday/birthday.webm", "/static/birthday/birthday.mp4"]} poster={thumbnail.src} />
<Video
src={[
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/birthday/birthday-9HG65MrSNWJjzg679VtirX7MLPpAaV.webm",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/birthday/birthday-8iayCEy1jfEHpNGZkdBPvxPFOuGz0g.mp4",
]}
poster={thumbnail.src}
crossOrigin="anonymous"
/>
</>
);
};

View File

@ -16,7 +16,7 @@
.input.textarea {
margin-bottom: 0;
line-height: 1.5;
min-height: 136px; /* approx 5 lines, to avoid severe layout shifting */
min-height: calc(5 * 1.5rem + 1.5em); /* avoid layout shift when textarea-autosize loads */
resize: vertical;
}

View File

@ -20,11 +20,12 @@ const Page = () => {
<Video
src={[
"/static/hillary/convention-720p.webm",
"/static/hillary/convention-720p.mp4",
"/static/hillary/subs.en.vtt",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/hillary/convention-720p-JbNlxyfqE3nz4ACjtfbpbjcR2gOY89.webm",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/hillary/convention-720p-YLGreYE59PzmPo4epB21HQG6jXgYL5.mp4",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/hillary/subs.en-k2txNECkQvwxWP8DjfP6GPBPo20vnO.vtt",
]}
poster={thumbnail.src}
crossOrigin="anonymous"
/>
<p

View File

@ -42,7 +42,7 @@ const jsonLd: WithContext<Person> = {
],
};
const RootLayout = ({ children }: { children: React.ReactNode }) => {
const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => {
return (
<html lang={config.siteLocale} suppressHydrationWarning>
<head>

View File

@ -18,7 +18,15 @@ const Page = () => {
<>
<PageTitle canonical="/leo">TheLab.mov</PageTitle>
<Video src={["/static/leo/leo.webm", "/static/leo/leo.mp4", "/static/leo/subs.en.vtt"]} poster={thumbnail.src} />
<Video
src={[
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/leo/leo-lVkSAtUWCqQaDCMqo3SGcuBiSlNWod.webm",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/leo/leo-x4E4eG4YPo22KSTJuZwAk6fpNF1NgG.mp4",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/leo/subs.en-HRGnRBH8w8CEyM644OV3qmCdm9Aj61.vtt",
]}
poster={thumbnail.src}
crossOrigin="anonymous"
/>
<p
style={{

BIN
app/not-found.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 KiB

View File

@ -1,7 +1,9 @@
import Image from "../components/Image";
import Link from "../components/Link";
import Video from "../components/Video";
import type { Metadata } from "next";
import notFoundGif from "./not-found.gif";
export const metadata: Metadata = {
title: "Page Not Found",
description: null,
@ -14,14 +16,7 @@ export const metadata: Metadata = {
const Page = () => {
return (
<div style={{ textAlign: "center" }}>
<Video
src={["/static/not-found/angry-panda.webm", "/static/not-found/angry-panda.mp4"]}
autoplay
responsive={false}
style={{
maxWidth: "400px",
}}
/>
<Image src={notFoundGif} alt="Angry panda" placeholder="empty" unoptimized />
<h1 style={{ margin: "0.2em auto" }}>Page Not Found 😢</h1>

View File

@ -19,7 +19,7 @@ const Image = ({ src, height, width, placeholder, className, ...rest }: ImagePro
src,
height,
width: constrainWidth(width || (src as StaticImageData).width),
placeholder: placeholder || (typeof src === "string" ? "empty" : "blur"),
placeholder: placeholder || (typeof src === "object" && "blurDataURL" in src ? "blur" : "empty"),
...rest,
};

View File

@ -1,6 +1,6 @@
import type { NextConfig } from "next";
import createMDX from "@next/mdx";
import createBundleAnalyzer from "@next/bundle-analyzer";
import withBundleAnalyzer from "@next/bundle-analyzer";
import withMDX from "@next/mdx";
import * as mdxPlugins from "./lib/helpers/remark-rehype-plugins";
const nextConfig: NextConfig = {
@ -15,6 +15,7 @@ const nextConfig: NextConfig = {
images: {
formats: ["image/avif", "image/webp"],
remotePatterns: [
{ protocol: "https", hostname: "bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com" },
{ protocol: "https", hostname: "pbs.twimg.com" },
{ protocol: "https", hostname: "abs.twimg.com" },
],
@ -122,45 +123,50 @@ const nextConfig: NextConfig = {
],
};
const withBundleAnalyzer = createBundleAnalyzer({
enabled: process.env.ANALYZE === "true",
});
const withMDX = createMDX({
options: {
remarkPlugins: [
mdxPlugins.remarkFrontmatter,
mdxPlugins.remarkMdxFrontmatter,
[mdxPlugins.remarkGfm, { singleTilde: false }],
[
mdxPlugins.remarkSmartypants,
{
quotes: true,
dashes: "oldschool",
backticks: false,
ellipses: false,
},
],
],
rehypePlugins: [
mdxPlugins.rehypeUnwrapImages,
mdxPlugins.rehypeSlug,
[
mdxPlugins.rehypePrettyCode,
{
theme: {
light: "material-theme-lighter",
dark: "material-theme-darker",
const nextPlugins = [
withBundleAnalyzer({
enabled: process.env.ANALYZE === "true",
}),
withMDX({
options: {
remarkPlugins: [
mdxPlugins.remarkFrontmatter,
mdxPlugins.remarkMdxFrontmatter,
[mdxPlugins.remarkGfm, { singleTilde: false }],
[
mdxPlugins.remarkSmartypants,
{
quotes: true,
dashes: "oldschool",
backticks: false,
ellipses: false,
},
bypassInlineCode: true,
defaultLang: "plaintext",
grid: false,
keepBackground: false,
},
],
],
mdxPlugins.rehypeMdxImportMedia,
],
},
});
rehypePlugins: [
mdxPlugins.rehypeUnwrapImages,
mdxPlugins.rehypeSlug,
[
mdxPlugins.rehypePrettyCode,
{
theme: {
light: "material-theme-lighter",
dark: "material-theme-darker",
},
bypassInlineCode: true,
defaultLang: "plaintext",
grid: false,
keepBackground: false,
},
],
mdxPlugins.rehypeMdxImportMedia,
],
},
}),
];
export default withBundleAnalyzer(withMDX(nextConfig));
// my own macgyvered version of next-compose-plugins (RIP)
// eslint-disable-next-line import/no-anonymous-default-export
export default () => {
return nextPlugins.reduce((acc, plugin) => plugin(acc), { ...nextConfig });
};

View File

@ -44,10 +44,11 @@ Here's one of the instructional videos provided internally to volunteers:
<Video
src={[
"/static/bernie-sanders-bern-app-data/friend-to-friend.webm",
"/static/bernie-sanders-bern-app-data/friend-to-friend.mp4",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/bernie-sanders-bern-app-data/friend-to-friend-XVB7UJRIMIwRtjQPOQZ4eCR9kM5F1g.webm",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/bernie-sanders-bern-app-data/friend-to-friend-nLG3RzuKzNpKmeYTjFT08DnMdJW509.mp4",
]}
poster="/static/bernie-sanders-bern-app-data/poster-friend-to-friend.png"
poster="https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/bernie-sanders-bern-app-data/poster-friend-to-friend-YYltrrTUoFbqyx1X00DVh0ylem59Ir.png"
crossOrigin="anonymous"
/>
...and a few privacy-related questions about the friend-to-friend feature were answered by campaign staff in a separate closed webinar for volunteers this week:

View File

@ -118,11 +118,7 @@ You can [download their software here](https://foldingathome.org/start-folding/)
**Fun fact:** The team behind Folding@home has seen a [**huge** spike in computational power](https://www.reddit.com/r/pcmasterrace/comments/flgm7q/ama_with_the_team_behind_foldinghome_coronavirus/) this month after cryptominers started mining coronavirus proteins instead of boring, old Ethereum with their insanely overpowered GPUs! 👏
<Video
src={["/static/coronavirus-open-source/folding.webm", "/static/coronavirus-open-source/folding.mp4"]}
poster="/static/coronavirus-open-source/folding-thumb.png"
autoplay
/>
<YouTube id="O-uwljuMp7w" />
## [Coronavirus Tracker API](https://coronavirus-tracker-api.herokuapp.com/v2/locations) <OctocatLink repo="ExpDev07/coronavirus-tracker-api" />

View File

@ -31,8 +31,12 @@ Decisions made by the top folks at Dropbox gave me an increasingly sour taste in
- ...and as a bonus, making the process of canceling Dropbox Pro incredibly convoluted, annoying, and sketchy. Here's a video demonstration via [Justin Dunham](https://twitter.com/jwyattd):
<Video
src={["/static/dropping-dropbox/cancel.webm", "/static/dropping-dropbox/cancel.mp4"]}
poster="/static/dropping-dropbox/cancel.png"
src={[
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/dropping-dropbox/cancel-Ni4NNhWbCTHS3VkMegvqJBPULTiYJY.webm",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/dropping-dropbox/cancel-6VfXLzILWfJ3HQ8AO0is6Eii4X5A7W.mp4",
]}
poster="https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/dropping-dropbox/cancel-xOR5hSpuiRZVH1au7Z0Wf2swcdWH2e.png"
crossOrigin="anonymous"
/>
## Seeking an alternative...

View File

@ -48,5 +48,10 @@ As [Bill Maher](https://medium.com/u/cdc04a9799f6) (an avid Bernie supporter) [s
**Update:** The campaign has included my snowy New Hampshire interaction with her in one of the DNC convention videos! See a few short seconds of my joy at 1:24.
<Video
src={["/static/hillary/convention-720p.webm", "/static/hillary/convention-720p.mp4", "/static/hillary/subs.en.vtt"]}
src={[
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/hillary/convention-720p-JbNlxyfqE3nz4ACjtfbpbjcR2gOY89.webm",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/hillary/convention-720p-YLGreYE59PzmPo4epB21HQG6jXgYL5.mp4",
"https://bcm6wnmyyzj1p5ls.public.blob.vercel-storage.com/videos/hillary/subs.en-k2txNECkQvwxWP8DjfP6GPBPo20vnO.vtt",
]}
crossOrigin="anonymous"
/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 KiB

View File

@ -26,13 +26,7 @@ I'm a _huge_ sucker for Kate McKinnon's spot-on impression of Warren on Saturday
Although the designer who selected this GIF likely had _thousands_ of choices when searching "[Bernie finger wagging GIF](https://www.google.com/search?q=Bernie+finger+wagging+GIF&tbm=isch&tbs=itp:animated)," the text beside it is well-written and funny — even though we both know putting a page at [berniesanders.com/zxcliaosid](https://berniesanders.com/zxcliaosid/) probably won't be a top priority of a President Sanders.
<Video
src={[
"/static/presidential-candidates-404-pages/sanders.webm",
"/static/presidential-candidates-404-pages/sanders.mp4",
]}
autoplay
/>
![Bernie Sanders](./sanders.gif)
## 3. Joe Biden — [joebiden.com](https://joebiden.com/asdfasdf404)
@ -44,25 +38,13 @@ Uncle Joe has a nice and simple 404 page. I like it, along with the Ray-Bans and
A ballsy move, considering Beto's infamous [DUI arrest](https://www.politifact.com/texas/statements/2019/mar/14/club-growth/beto-orourke-arrested-dwi-flee-scene/) in the '90s — but still a clever ask for a donation and a great use of a GIF, even if it's left over from his Senate campaign.
<Video
src={[
"/static/presidential-candidates-404-pages/orourke.webm",
"/static/presidential-candidates-404-pages/orourke.mp4",
]}
autoplay
/>
![Beto O'Rourke](./orourke.gif)
## 5. Kamala Harris — [kamalaharris.org](https://kamalaharris.org/asdfasdf404)
Another clean and simple page with a top-notch GIF. It injected some emotion into visiting [kamalaharris.com/alskdjf](https://kamalaharris.com/alskdjf).
<Video
src={[
"/static/presidential-candidates-404-pages/harris.webm",
"/static/presidential-candidates-404-pages/harris.mp4",
]}
autoplay
/>
![Kamala Harris](./harris.gif)
## 6. Pete Buttigeg — [peteforamerica.com](https://peteforamerica.com/asdfasdf404/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 819 KiB

View File

@ -22,9 +22,9 @@
"@giscus/react": "^3.1.0",
"@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "15.3.0-canary.10",
"@next/mdx": "15.3.0-canary.10",
"@next/third-parties": "15.3.0-canary.10",
"@next/bundle-analyzer": "15.3.0-canary.13",
"@next/mdx": "15.3.0-canary.13",
"@next/third-parties": "15.3.0-canary.13",
"@octokit/graphql": "^8.2.1",
"@octokit/graphql-schema": "^15.26.0",
"@prisma/client": "^6.5.0",
@ -36,9 +36,9 @@
"feed": "^4.2.2",
"geist": "^1.3.1",
"html-entities": "^2.5.2",
"lucide-react": "0.482.0",
"lucide-react": "0.483.0",
"modern-normalize": "^3.0.1",
"next": "15.3.0-canary.10",
"next": "15.3.0-canary.13",
"obj-str": "^1.1.0",
"polished": "^4.3.1",
"prop-types": "^15.8.1",
@ -75,12 +75,12 @@
"@types/mdx": "^2.0.13",
"@types/node": "^22.13.10",
"@types/prop-types": "^15.7.14",
"@types/react": "^19.0.10",
"@types/react": "^19.0.12",
"@types/react-dom": "^19.0.4",
"@types/react-is": "^19.0.0",
"cross-env": "^7.0.3",
"eslint": "^9.22.0",
"eslint-config-next": "15.3.0-canary.10",
"eslint-config-next": "15.3.0-canary.13",
"eslint-config-prettier": "^10.1.1",
"eslint-plugin-css-modules": "^2.12.0",
"eslint-plugin-import": "^2.31.0",
@ -106,7 +106,7 @@
"engines": {
"node": ">=20.x"
},
"packageManager": "pnpm@10.6.3+sha512.bb45e34d50a9a76e858a95837301bfb6bd6d35aea2c5d52094fa497a467c43f5c440103ce2511e9e0a2f89c3d6071baac3358fc68ac6fb75e2ceb3d2736065e6",
"packageManager": "pnpm@10.6.5+sha512.cdf928fca20832cd59ec53826492b7dc25dc524d4370b6b4adbf65803d32efaa6c1c88147c0ae4e8d579a6c9eec715757b50d4fa35eea179d868eada4ed043af",
"cacheDirectories": [
"node_modules",
".next/cache"

202
pnpm-lock.yaml generated
View File

@ -19,16 +19,16 @@ importers:
version: 3.1.0(acorn@8.14.1)
'@mdx-js/react':
specifier: ^3.1.0
version: 3.1.0(@types/react@19.0.10)(react@19.0.0)
version: 3.1.0(@types/react@19.0.12)(react@19.0.0)
'@next/bundle-analyzer':
specifier: 15.3.0-canary.10
version: 15.3.0-canary.10
specifier: 15.3.0-canary.13
version: 15.3.0-canary.13
'@next/mdx':
specifier: 15.3.0-canary.10
version: 15.3.0-canary.10(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))
specifier: 15.3.0-canary.13
version: 15.3.0-canary.13(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))
'@next/third-parties':
specifier: 15.3.0-canary.10
version: 15.3.0-canary.10(next@15.3.0-canary.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
specifier: 15.3.0-canary.13
version: 15.3.0-canary.13(next@15.3.0-canary.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
'@octokit/graphql':
specifier: ^8.2.1
version: 8.2.1
@ -58,19 +58,19 @@ importers:
version: 4.2.2
geist:
specifier: ^1.3.1
version: 1.3.1(next@15.3.0-canary.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
version: 1.3.1(next@15.3.0-canary.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
html-entities:
specifier: ^2.5.2
version: 2.5.2
lucide-react:
specifier: 0.482.0
version: 0.482.0(react@19.0.0)
specifier: 0.483.0
version: 0.483.0(react@19.0.0)
modern-normalize:
specifier: ^3.0.1
version: 3.0.1
next:
specifier: 15.3.0-canary.10
version: 15.3.0-canary.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
specifier: 15.3.0-canary.13
version: 15.3.0-canary.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
obj-str:
specifier: ^1.1.0
version: 1.1.0
@ -91,13 +91,13 @@ importers:
version: 5.0.0(react@19.0.0)
react-innertext:
specifier: ^1.1.5
version: 1.1.5(@types/react@19.0.10)(react@19.0.0)
version: 1.1.5(@types/react@19.0.12)(react@19.0.0)
react-is:
specifier: 19.0.0
version: 19.0.0
react-textarea-autosize:
specifier: ^8.5.8
version: 8.5.8(@types/react@19.0.10)(react@19.0.0)
version: 8.5.8(@types/react@19.0.12)(react@19.0.0)
react-turnstile:
specifier: ^1.1.4
version: 1.1.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@ -175,11 +175,11 @@ importers:
specifier: ^15.7.14
version: 15.7.14
'@types/react':
specifier: ^19.0.10
version: 19.0.10
specifier: ^19.0.12
version: 19.0.12
'@types/react-dom':
specifier: ^19.0.4
version: 19.0.4(@types/react@19.0.10)
version: 19.0.4(@types/react@19.0.12)
'@types/react-is':
specifier: ^19.0.0
version: 19.0.0
@ -190,8 +190,8 @@ importers:
specifier: ^9.22.0
version: 9.22.0
eslint-config-next:
specifier: 15.3.0-canary.10
version: 15.3.0-canary.10(eslint@9.22.0)(typescript@5.8.2)
specifier: 15.3.0-canary.13
version: 15.3.0-canary.13(eslint@9.22.0)(typescript@5.8.2)
eslint-config-prettier:
specifier: ^10.1.1
version: 10.1.1(eslint@9.22.0)
@ -664,17 +664,17 @@ packages:
'@napi-rs/wasm-runtime@0.2.7':
resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==}
'@next/bundle-analyzer@15.3.0-canary.10':
resolution: {integrity: sha512-dE6lIG8G1TgB1nxjm/l0zJoemJhqXIsO6FYiZrPS8Z0EvEXDNu3nuDtQ7J/kKDENG2A5zmL4kYid1F+06apQzA==}
'@next/bundle-analyzer@15.3.0-canary.13':
resolution: {integrity: sha512-RZA9sms8XY4cLmNeai68Rvr6ElTrLrCXhYdGECHqt6B52nID4UH8ngCE6lHwWKvfGug6RjyBu7MptBj3/B/qZg==}
'@next/env@15.3.0-canary.10':
resolution: {integrity: sha512-W/JkRHQyELbL9iwqE0hNPmkewolbyumHQdRlVxIOvRI8lVfCICqAvl27MhQ4UweKi5wHMov+oPhNGgAAhekGxA==}
'@next/env@15.3.0-canary.13':
resolution: {integrity: sha512-JSc7jRSVdstjZ0bfxKMFeYM+gVRgUbPpGSWq9JLDQDH/mYHMN+LMNR8CafQCKjoSL7tzkBpH9Ug6r9WaIescCw==}
'@next/eslint-plugin-next@15.3.0-canary.10':
resolution: {integrity: sha512-jMh292/BkGHdwaNLqZ1oQChB3Wmd/8ACKFdpnUz+vTLW9pjvXHdpRsgyHgm1eDgOCL24fkKu3DAGwJs403VLiQ==}
'@next/eslint-plugin-next@15.3.0-canary.13':
resolution: {integrity: sha512-FyzLsLvIdTA7QJBxTeNShszbXhYn8uGJcLdbTDiQUcs2BfSPXpMt26t8nQVdUhNBcxt4XyzEDddIhfIwBYPtWg==}
'@next/mdx@15.3.0-canary.10':
resolution: {integrity: sha512-oHPwwyJmrRrCRvwytVX9rsgO4YxniYJB43FOJoLNICmi2mQaq0QueZ3r9OhQ9Dw4kgfq7Xx6dqD0DVr+ugCx4Q==}
'@next/mdx@15.3.0-canary.13':
resolution: {integrity: sha512-/+y8SNqL0mrevZzu3PjWziK0tKSC3YePT7SQCdN1XapDgM4SzKhaYjrD6VBNyo8kAZKDnZhFxiuo/sklp9M52Q==}
peerDependencies:
'@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '>=0.15.0'
@ -684,56 +684,56 @@ packages:
'@mdx-js/react':
optional: true
'@next/swc-darwin-arm64@15.3.0-canary.10':
resolution: {integrity: sha512-1ZXY8o08g/PwV07G+vTPyxQYk8gLH5tdZmdC/bpgLeidqx8YG+2F8tSRqUpjYeblOAl46v/0mhLByLWjmFGFKw==}
'@next/swc-darwin-arm64@15.3.0-canary.13':
resolution: {integrity: sha512-A1EiOZHBTFF3Asyb+h4R0/IuOFEx+HN/0ek9BwR7g4neqZunAMU0LaGeExhxX7eUDJR4NWV16HEQq6nBcJB/UA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@next/swc-darwin-x64@15.3.0-canary.10':
resolution: {integrity: sha512-nlI1CiO4rbc+D7cjX9hCBTzdeFTffQpr9zAgxPx0YzgUEArnNlUifv49jh/R6TTaPOwWoqjFvOTFOBQ3xr+XjQ==}
'@next/swc-darwin-x64@15.3.0-canary.13':
resolution: {integrity: sha512-ojmJVrcv571Q893G0EZGgnYJOGjxYTYSvrNiXMaY2gz9W8p1G+wY/Fc6f2Vm5c2GQcjUdmJOb57x3Ujdxi3szw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@next/swc-linux-arm64-gnu@15.3.0-canary.10':
resolution: {integrity: sha512-mKz3G7OA0U1SS+uFUycJlONBcBsUg84p7sGPqQxk01WagW7UYgW1axbQBIPHxhAYz5o3+iLrdu7w5WeuHJcDRg==}
'@next/swc-linux-arm64-gnu@15.3.0-canary.13':
resolution: {integrity: sha512-k4dEOZZ9x8PtHH8HtD/3h/epDBRqWOf13UOE3JY/NH60pY5t4uXG3JEj9tcKnezhv0/Q5eT9c6WiydXdjs2YvQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-arm64-musl@15.3.0-canary.10':
resolution: {integrity: sha512-1q6HWePFxOtiLtZZKh1eF0XPzp8EM36aMJZqamQj+yPYdL8X0Iqin5QPEKqX5QeOwpsiXo82TZ2qnDyb/ps9Wg==}
'@next/swc-linux-arm64-musl@15.3.0-canary.13':
resolution: {integrity: sha512-Ms7b0OF05Q2qpo90ih/cVhviNrEatVZtsobBVyoXGfWxv/gOrhXoxuzROFGNdGXRZNJ7EgUaWmO4pZGjfUhEWw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@next/swc-linux-x64-gnu@15.3.0-canary.10':
resolution: {integrity: sha512-aA04C+JDYlblbCdepWeP3UfPHXp0Bh6uNOCC3qH/AUwcdlMkUgaQxqDkn3rYN8DoVjkcvwtucRy5iQAQEWZMLA==}
'@next/swc-linux-x64-gnu@15.3.0-canary.13':
resolution: {integrity: sha512-id/4NWejJpglZiY/PLpV0H675bITfo0QrUNjZtRuKfphJNkPoRGsMXdaZ3mSpFscTqofyaINQ3fis0D4sSmJUw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-linux-x64-musl@15.3.0-canary.10':
resolution: {integrity: sha512-NHLJqblMx4nERqt8FyQhGcnzq/woaZ4zsRFKjTo9eyqihlZCKxoPmN10PP4qQIDhBQfaxHAbzvYl5eAgn53xsA==}
'@next/swc-linux-x64-musl@15.3.0-canary.13':
resolution: {integrity: sha512-9eE2E6KN01yxwE9H2fWaQA6PRvfjuY+lvadGBpub/pf710kdWFe9VYb8zECT492Vw90axHmktFZDTXuf2WaVTA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@next/swc-win32-arm64-msvc@15.3.0-canary.10':
resolution: {integrity: sha512-KonCwSez8FNfVTjMkuK7RjBTqelZvT7TLVmni8C8TmulJARJlUwkDwsXSS2sTy9zmxH5XTROdVGppvEx+rLskA==}
'@next/swc-win32-arm64-msvc@15.3.0-canary.13':
resolution: {integrity: sha512-PbJ/yFCUBxhLr6wKoaC+CQebzeaiqrYOJXEMb9O1XFWp2te8okLjF2BihSziFVLtoA4m2one56pG5jU7W9GUzg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@next/swc-win32-x64-msvc@15.3.0-canary.10':
resolution: {integrity: sha512-KezU9dlIdQ6fXZb4lHvv+AeUG9RR4J/FVGExiLR/3+rkbHxIJRB8qzM/h/94vecrovvwomKBLiNRS/9ThZsGng==}
'@next/swc-win32-x64-msvc@15.3.0-canary.13':
resolution: {integrity: sha512-6dUpH6huWVS0uBObUWBTolu/lZIP99oD1TdgjGt3S2te+OjXAlza8ERgR8mGTV04hpRZFv7tUivISaGlkYE+Bw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@next/third-parties@15.3.0-canary.10':
resolution: {integrity: sha512-tDoK9MYmRgRc4soQ+aIVsFh7onibTmeJ1ZNhLbYDJ8PxBhrHV9UNxJG8VWMPIMMb6xtvccyCoh9kYvSIeJph/w==}
'@next/third-parties@15.3.0-canary.13':
resolution: {integrity: sha512-T07orNImVOYP3EqbAhTwIJ/LWOJMDXqhY3r4KCzio3gQib9mtpVlKVwGLeA6UfnIn9q2aft3lTk7fzgzXb/hBg==}
peerDependencies:
next: ^13.0.0 || ^14.0.0 || ^15.0.0
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
@ -1004,8 +1004,8 @@ packages:
'@types/react-is@19.0.0':
resolution: {integrity: sha512-71dSZeeJ0t3aoPyY9x6i+JNSvg5m9EF2i2OlSZI5QoJuI8Ocgor610i+4A10TQmURR+0vLwcVCEYFpXdzM1Biw==}
'@types/react@19.0.10':
resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==}
'@types/react@19.0.12':
resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==}
'@types/supports-color@8.1.3':
resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==}
@ -1563,8 +1563,8 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
eslint-config-next@15.3.0-canary.10:
resolution: {integrity: sha512-ulrwZqqMpLZtDXeHtyCQNJTjEy20O6Z9urU9V8nU2TTM71eqIt1pz8dDS+vLoTRRJJjFRLWpOJI94QNPqvqFRw==}
eslint-config-next@15.3.0-canary.13:
resolution: {integrity: sha512-A1gyZvBUBpDu1T2H6wWt/MxSCNXxFUTpf21dQ+ZN5EQ9iCxSbTCCLa0LJd7EIiQAQq8BsoJuhZAgji+ydwBYng==}
peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1'
@ -2390,8 +2390,8 @@ packages:
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
lucide-react@0.482.0:
resolution: {integrity: sha512-XM8PzHzSrg8ATmmO+fzf+JyYlVVdQnJjuyLDj2p4V2zEtcKeBNAqAoJIGFv1x2HSBa7kT8gpYUxwdQ0g7nypfw==}
lucide-react@0.483.0:
resolution: {integrity: sha512-WldsY17Qb/T3VZdMnVQ9C3DDIP7h1ViDTHVdVGnLZcvHNg30zH/MTQ04RTORjexoGmpsXroiQXZ4QyR0kBy0FA==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
@ -2638,8 +2638,8 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
next@15.3.0-canary.10:
resolution: {integrity: sha512-M4o2+geTFAkeboP7IVCoRTsEfyyt56o+mLof7HW8LKwdG6TydvyCmsPbCvtRbU0V7Nl2IMRfGk/rts3TuB9bug==}
next@15.3.0-canary.13:
resolution: {integrity: sha512-c8BO/c1FjV/jY4OmlBTKaeI0YYDIsakkmJQFgpjq9RzoBetoi/VLAloZMDpsrfSFIhHDHhraLMxzSvS6mFKeuA==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
@ -4021,10 +4021,10 @@ snapshots:
- acorn
- supports-color
'@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0)':
'@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0)':
dependencies:
'@types/mdx': 2.0.13
'@types/react': 19.0.10
'@types/react': 19.0.12
react: 19.0.0
'@napi-rs/wasm-runtime@0.2.7':
@ -4034,53 +4034,53 @@ snapshots:
'@tybys/wasm-util': 0.9.0
optional: true
'@next/bundle-analyzer@15.3.0-canary.10':
'@next/bundle-analyzer@15.3.0-canary.13':
dependencies:
webpack-bundle-analyzer: 4.10.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@next/env@15.3.0-canary.10': {}
'@next/env@15.3.0-canary.13': {}
'@next/eslint-plugin-next@15.3.0-canary.10':
'@next/eslint-plugin-next@15.3.0-canary.13':
dependencies:
fast-glob: 3.3.1
'@next/mdx@15.3.0-canary.10(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))':
'@next/mdx@15.3.0-canary.13(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.12)(react@19.0.0))':
dependencies:
source-map: 0.7.4
optionalDependencies:
'@mdx-js/loader': 3.1.0(acorn@8.14.1)
'@mdx-js/react': 3.1.0(@types/react@19.0.10)(react@19.0.0)
'@mdx-js/react': 3.1.0(@types/react@19.0.12)(react@19.0.0)
'@next/swc-darwin-arm64@15.3.0-canary.10':
'@next/swc-darwin-arm64@15.3.0-canary.13':
optional: true
'@next/swc-darwin-x64@15.3.0-canary.10':
'@next/swc-darwin-x64@15.3.0-canary.13':
optional: true
'@next/swc-linux-arm64-gnu@15.3.0-canary.10':
'@next/swc-linux-arm64-gnu@15.3.0-canary.13':
optional: true
'@next/swc-linux-arm64-musl@15.3.0-canary.10':
'@next/swc-linux-arm64-musl@15.3.0-canary.13':
optional: true
'@next/swc-linux-x64-gnu@15.3.0-canary.10':
'@next/swc-linux-x64-gnu@15.3.0-canary.13':
optional: true
'@next/swc-linux-x64-musl@15.3.0-canary.10':
'@next/swc-linux-x64-musl@15.3.0-canary.13':
optional: true
'@next/swc-win32-arm64-msvc@15.3.0-canary.10':
'@next/swc-win32-arm64-msvc@15.3.0-canary.13':
optional: true
'@next/swc-win32-x64-msvc@15.3.0-canary.10':
'@next/swc-win32-x64-msvc@15.3.0-canary.13':
optional: true
'@next/third-parties@15.3.0-canary.10(next@15.3.0-canary.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
'@next/third-parties@15.3.0-canary.13(next@15.3.0-canary.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
dependencies:
next: 15.3.0-canary.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
next: 15.3.0-canary.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0
third-party-capital: 1.0.20
@ -4370,15 +4370,15 @@ snapshots:
'@types/prop-types@15.7.14': {}
'@types/react-dom@19.0.4(@types/react@19.0.10)':
'@types/react-dom@19.0.4(@types/react@19.0.12)':
dependencies:
'@types/react': 19.0.10
'@types/react': 19.0.12
'@types/react-is@19.0.0':
dependencies:
'@types/react': 19.0.10
'@types/react': 19.0.12
'@types/react@19.0.10':
'@types/react@19.0.12':
dependencies:
csstype: 3.1.3
@ -5047,9 +5047,9 @@ snapshots:
escape-string-regexp@5.0.0: {}
eslint-config-next@15.3.0-canary.10(eslint@9.22.0)(typescript@5.8.2):
eslint-config-next@15.3.0-canary.13(eslint@9.22.0)(typescript@5.8.2):
dependencies:
'@next/eslint-plugin-next': 15.3.0-canary.10
'@next/eslint-plugin-next': 15.3.0-canary.13
'@rushstack/eslint-patch': 1.11.0
'@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)
'@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2)
@ -5462,9 +5462,9 @@ snapshots:
functions-have-names@1.2.3: {}
geist@1.3.1(next@15.3.0-canary.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0)):
geist@1.3.1(next@15.3.0-canary.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0)):
dependencies:
next: 15.3.0-canary.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
next: 15.3.0-canary.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
get-east-asian-width@1.3.0: {}
@ -6086,7 +6086,7 @@ snapshots:
lru-cache@10.4.3: {}
lucide-react@0.482.0(react@19.0.0):
lucide-react@0.483.0(react@19.0.0):
dependencies:
react: 19.0.0
@ -6593,9 +6593,9 @@ snapshots:
natural-compare@1.4.0: {}
next@15.3.0-canary.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
next@15.3.0-canary.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@next/env': 15.3.0-canary.10
'@next/env': 15.3.0-canary.13
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.15
busboy: 1.6.0
@ -6605,14 +6605,14 @@ snapshots:
react-dom: 19.0.0(react@19.0.0)
styled-jsx: 5.1.6(react@19.0.0)
optionalDependencies:
'@next/swc-darwin-arm64': 15.3.0-canary.10
'@next/swc-darwin-x64': 15.3.0-canary.10
'@next/swc-linux-arm64-gnu': 15.3.0-canary.10
'@next/swc-linux-arm64-musl': 15.3.0-canary.10
'@next/swc-linux-x64-gnu': 15.3.0-canary.10
'@next/swc-linux-x64-musl': 15.3.0-canary.10
'@next/swc-win32-arm64-msvc': 15.3.0-canary.10
'@next/swc-win32-x64-msvc': 15.3.0-canary.10
'@next/swc-darwin-arm64': 15.3.0-canary.13
'@next/swc-darwin-x64': 15.3.0-canary.13
'@next/swc-linux-arm64-gnu': 15.3.0-canary.13
'@next/swc-linux-arm64-musl': 15.3.0-canary.13
'@next/swc-linux-x64-gnu': 15.3.0-canary.13
'@next/swc-linux-x64-musl': 15.3.0-canary.13
'@next/swc-win32-arm64-msvc': 15.3.0-canary.13
'@next/swc-win32-x64-msvc': 15.3.0-canary.13
sharp: 0.33.5
transitivePeerDependencies:
- '@babel/core'
@ -6921,9 +6921,9 @@ snapshots:
'@babel/runtime': 7.26.10
react: 19.0.0
react-innertext@1.1.5(@types/react@19.0.10)(react@19.0.0):
react-innertext@1.1.5(@types/react@19.0.12)(react@19.0.0):
dependencies:
'@types/react': 19.0.10
'@types/react': 19.0.12
react: 19.0.0
react-is@16.13.1: {}
@ -6934,12 +6934,12 @@ snapshots:
dependencies:
fast-deep-equal: 2.0.1
react-textarea-autosize@8.5.8(@types/react@19.0.10)(react@19.0.0):
react-textarea-autosize@8.5.8(@types/react@19.0.12)(react@19.0.0):
dependencies:
'@babel/runtime': 7.26.10
react: 19.0.0
use-composed-ref: 1.4.0(@types/react@19.0.10)(react@19.0.0)
use-latest: 1.3.0(@types/react@19.0.10)(react@19.0.0)
use-composed-ref: 1.4.0(@types/react@19.0.12)(react@19.0.0)
use-latest: 1.3.0(@types/react@19.0.12)(react@19.0.0)
transitivePeerDependencies:
- '@types/react'
@ -7801,24 +7801,24 @@ snapshots:
dependencies:
punycode: 2.3.1
use-composed-ref@1.4.0(@types/react@19.0.10)(react@19.0.0):
use-composed-ref@1.4.0(@types/react@19.0.12)(react@19.0.0):
dependencies:
react: 19.0.0
optionalDependencies:
'@types/react': 19.0.10
'@types/react': 19.0.12
use-isomorphic-layout-effect@1.2.0(@types/react@19.0.10)(react@19.0.0):
use-isomorphic-layout-effect@1.2.0(@types/react@19.0.12)(react@19.0.0):
dependencies:
react: 19.0.0
optionalDependencies:
'@types/react': 19.0.10
'@types/react': 19.0.12
use-latest@1.3.0(@types/react@19.0.10)(react@19.0.0):
use-latest@1.3.0(@types/react@19.0.12)(react@19.0.0):
dependencies:
react: 19.0.0
use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.10)(react@19.0.0)
use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.12)(react@19.0.0)
optionalDependencies:
'@types/react': 19.0.10
'@types/react': 19.0.12
use-sync-external-store@1.4.0(react@19.0.0):
dependencies:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

View File

@ -1,108 +0,0 @@
WEBVTT
Kind: captions
Language: en
00:00:00.030 --> 00:00:03.210
All right, well let's listen
here to the video at the Democratic
00:00:03.210 --> 00:00:04.880
National Convention on this issue.
00:00:04.880 --> 00:00:08.340
You know, when I came here to New Hampshire
00:00:08.340 --> 00:00:14.269
the first time in this campaign and
heard about the heroin epidemic
00:00:14.269 --> 00:00:16.660
The growing drug problem in our area...
00:00:16.780 --> 00:00:19.604
We're all losing fathers, brothers, sons, mothers...
00:00:19.604 --> 00:00:22.040
The numbers of people who are being affected
00:00:22.040 --> 00:00:27.000
If you have been impacted by your own or
someone else's use of substances, would
00:00:27.000 --> 00:00:28.510
you just raise your hand?
00:00:28.510 --> 00:00:31.470
I didn't even know what was wrong with me until I
00:00:31.470 --> 00:00:35.400
found out that I was I was an addict.
00:00:35.400 --> 00:00:38.480
This problem touches everybody...
00:00:38.480 --> 00:00:41.484
My children suffered, my family suffered...
00:00:41.484 --> 00:00:44.280
Meeting grandmothers raising their grandchildren...
00:00:44.280 --> 00:00:48.800
All of my friends are raising
their grandchildren because of addiction
00:00:48.800 --> 00:00:53.700
I think you're very brave and
very loving to take on this responsibility.
00:00:53.700 --> 00:00:56.720
It is plaguing families.
I don't want to
00:00:56.730 --> 00:01:00.180
go to more funerals. I'm going to one this weekend.
I didn't know if I wanted
00:01:00.180 --> 00:01:04.980
to do better. Addiction had full control
over my heart and soul.
00:01:04.980 --> 00:01:10.880
I wouldn't have necessarily known that if I hadn't been
sitting in a little cafe in Keene
00:01:10.880 --> 00:01:16.140
listening to people tell me about what
was breaking their hearts and what they
00:01:16.140 --> 00:01:19.660
wanted their president to know.
00:01:19.660 --> 00:01:21.299
We need the voice of those who are using, that is
00:01:21.299 --> 00:01:24.480
the way in which we can make an impact
on this disease.
00:01:24.480 --> 00:01:26.860
We can't walk away from these stories.
00:01:26.860 --> 00:01:29.900
These are our children, these are our friends, our neighbors,
00:01:29.900 --> 00:01:34.160
our loved ones. This is not something we can
just brush under the rug and wish it would
00:01:34.160 --> 00:01:39.180
go away. We need to drag it out of the
shadows, we need to hold it up to the light
00:01:39.180 --> 00:01:41.740
Everybody should feel that they are
00:01:41.740 --> 00:01:50.960
valued, they are cared about, and they
have a president who sees them

Binary file not shown.

Binary file not shown.

View File

@ -1,111 +0,0 @@
WEBVTT
00:00:00.000 --> 00:00:05.029
["The Lab" Theme Music]
00:00:05.029 --> 00:00:08.760
Welcome back to "The Lab with Leo," I'm Kate Abraham and now it's time for our
00:00:08.760 --> 00:00:13.000
Facebook app of the day. And in honor of
the lovely Amber wasn't it great to see Amber?
00:00:13.040 --> 00:00:16.470
Oh, it was so nice to see her.
She's looking so tan!
00:00:16.470 --> 00:00:21.140
Toronto weather.
Yeah, really? I think she was at Prince Edward Island for a few days
00:00:21.140 --> 00:00:26.380
for Canada Day.
So she's out there like this, tanning in the ocean. Good for her.
00:00:26.380 --> 00:00:28.060
She knows how to enjoy herself.
[laughs]
00:00:28.060 --> 00:00:30.740
So in honor of Amber, our Facebook app of the day is
00:00:30.740 --> 00:00:35.360
Powncer, or Poncer or Punser
00:00:35.360 --> 00:00:39.000
However you want to say it, I say Powncer.
So there's your Pownce page.
00:00:39.000 --> 00:00:44.520
So what you do is, basically, it literally updates your most recent post on Pownce.
So literally I've just put here
00:00:44.520 --> 00:00:49.200
"Playing with Pownce," then if I just post this, and what will happen is it'll automatically
00:00:49.200 --> 00:00:52.460
I bet you've done this in advance, it'll
automatically go through to my actual
00:00:52.460 --> 00:00:56.420
site on Facebook and as you can see, you can see exactly what I'm doing
00:00:56.420 --> 00:00:59.000
And then can they click that and takes
it to your Pownce page?
Yeah, then you can
00:00:59.000 --> 00:01:02.860
reply to me. Oh that's neat!
Then what'll happen, you can basically send me a reply.
00:01:02.860 --> 00:01:06.460
You know who wrote that? I don't know.
Jake Jarvis wrote that.
00:01:06.479 --> 00:01:10.560
And I know who Jake Jarvis is, he's on my
Facebook friends list.
00:01:10.560 --> 00:01:14.250
He's a young guy, I think he's a high school kid, the son of Jeff Jarvis, who's
00:01:14.250 --> 00:01:18.450
a very well known media critic.
These kids freak me out. Isn't it neat?
00:01:18.450 --> 00:01:22.590
Jake's written some great applications
How old is he?
I don't know, I think 16 or 17.
00:01:22.590 --> 00:01:26.100
That scares me.
He's written a lot, he's one of the best Facebook developers out there.
00:01:26.100 --> 00:01:29.310
Did a nice job with that.
That's fantastic.
Isn't that great? I love it, that's so good.
00:01:29.310 --> 00:01:31.860
But for more details, obviously Facebook
apps
00:01:31.860 --> 00:01:37.080
I said facebook.com/apps.
There's lots of them, there's thousands.
So many on there.
00:01:37.080 --> 00:01:41.100
There's a lot of bad ones but some really good ones.
Well that's what you're here for, to tell us which ones are good.
00:01:41.100 --> 00:01:44.540
Exactly, this was a good one, I like it.
She installs them all so that you can
00:01:44.540 --> 00:01:48.220
tell, you got like a page this long!
You just keep scrolling, scrolling, scrolling...
[laughs]