├── codex.md ├── .cursorrules ├── .goosehints ├── CLAUDE.md ├── GEMINI.md ├── .github ├── copilot-instructions.md └── workflows │ ├── ci.yml │ └── deploy.yml ├── .npmrc ├── .vscode └── settings.json ├── public ├── og.avif ├── aos-logo.avif ├── app_icon.avif ├── divine_gun.avif ├── divine_mic.avif ├── logos │ ├── yahoo.png │ ├── newsweek.png │ ├── techcrunch.png │ └── businessinsider.png ├── thumbnails │ ├── jb.avif │ ├── 2016.avif │ ├── 2017.avif │ ├── 2pm.avif │ ├── 5sos.avif │ ├── aaa.avif │ ├── art.avif │ ├── bts.avif │ ├── cat.avif │ ├── cats.avif │ ├── cavs.avif │ ├── chen.avif │ ├── cool.avif │ ├── cute.avif │ ├── dab.avif │ ├── dank.avif │ ├── day6.avif │ ├── dog.avif │ ├── dogs.avif │ ├── edit.avif │ ├── edm.avif │ ├── exo.avif │ ├── exok.avif │ ├── fail.avif │ ├── fire.avif │ ├── food.avif │ ├── fun.avif │ ├── gh17.avif │ ├── girl.avif │ ├── got7.avif │ ├── haha.avif │ ├── ikon.avif │ ├── jin.avif │ ├── kai.avif │ ├── knk.avif │ ├── kpop.avif │ ├── lay.avif │ ├── life.avif │ ├── like.avif │ ├── lmao.avif │ ├── lnic.avif │ ├── lol.avif │ ├── loop.avif │ ├── love.avif │ ├── mark.avif │ ├── meme.avif │ ├── nba.avif │ ├── nct.avif │ ├── omg.avif │ ├── onew.avif │ ├── rap.avif │ ├── song.avif │ ├── suga.avif │ ├── suho.avif │ ├── tbt.avif │ ├── vine.avif │ ├── vixx.avif │ ├── wtf.avif │ ├── wwe.avif │ ├── akb48.avif │ ├── amazing.avif │ ├── animals.avif │ ├── anime.avif │ ├── awesome.avif │ ├── bambam.avif │ ├── bangtan.avif │ ├── beatbox.avif │ ├── bigbang.avif │ ├── bored.avif │ ├── btsarmy.avif │ ├── byevine.avif │ ├── comedy.avif │ ├── cosplay.avif │ ├── cover.avif │ ├── crazy.avif │ ├── cringe.avif │ ├── dance.avif │ ├── dancing.avif │ ├── disney.avif │ ├── drake.avif │ ├── earrape.avif │ ├── edits.avif │ ├── follow.avif │ ├── friends.avif │ ├── funny.avif │ ├── furry.avif │ ├── fursuit.avif │ ├── gaming.avif │ ├── happy.avif │ ├── hiphop.avif │ ├── japan.avif │ ├── jhope.avif │ ├── jimin.avif │ ├── kitty.avif │ ├── laugh.avif │ ├── markson.avif │ ├── memes.avif │ ├── minho.avif │ ├── minhyuk.avif │ ├── monstax.avif │ ├── music.avif │ ├── nbavine.avif │ ├── party.avif │ ├── pokemon.avif │ ├── puppy.avif │ ├── random.avif │ ├── remake.avif │ ├── remix.avif │ ├── revine.avif │ ├── ripvine.avif │ ├── sehun.avif │ ├── shinee.avif │ ├── singing.avif │ ├── soccer.avif │ ├── summer.avif │ ├── taemin.avif │ ├── thezone.avif │ ├── travel.avif │ ├── vinealo.avif │ ├── weird.avif │ ├── woohyun.avif │ ├── xiumin.avif │ ├── yoongi.avif │ ├── yugyeom.avif │ ├── animeedit.avif │ ├── babymetal.avif │ ├── baekhyun.avif │ ├── chanyeol.avif │ ├── christmas.avif │ ├── dankmemes.avif │ ├── epicfail.avif │ ├── exordium.avif │ ├── fireworks.avif │ ├── followme.avif │ ├── foodporn.avif │ ├── football.avif │ ├── funnyvine.avif │ ├── ghdirecto.avif │ ├── halloween.avif │ ├── hyungwon.avif │ ├── infinite.avif │ ├── instagram.avif │ ├── jinyoung.avif │ ├── jungkook.avif │ ├── kyungsoo.avif │ ├── like4like.avif │ ├── monsta_x.avif │ ├── musically.avif │ ├── pentagon.avif │ ├── relatable.avif │ ├── savevine.avif │ ├── seventeen.avif │ ├── snapchat.avif │ ├── taehyung.avif │ ├── youngjae.avif │ ├── 6secondcover.avif │ ├── bangtanboys.avif │ ├── belenesteban.avif │ ├── catsofvine.avif │ ├── comedyvine.avif │ ├── dogsofvine.avif │ ├── donaldtrump.avif │ ├── editranked.avif │ ├── frenchvine.avif │ ├── funnyvines.avif │ ├── furryfandom.avif │ ├── generations.avif │ ├── happynewyear.avif │ ├── heysayjump.avif │ ├── justinbieber.avif │ ├── onedirection.avif │ ├── rapmonster.avif │ ├── singingvine.avif │ ├── vinefamous.avif │ ├── vineiberico.avif │ ├── exordiuminbkk.avif │ ├── got7hardcarry.avif │ ├── happybirthday.avif │ ├── postyourdrafts.avif │ ├── exordiuminbkkday2.avif │ └── followforfollow.avif ├── verified-demo.avif ├── authentic-demo.avif ├── rabble-headshot.jpeg ├── rabble-headshot.jpg ├── screenshots │ ├── 1_1.avif │ ├── 2_1.avif │ ├── 3_1.avif │ ├── 4_1.avif │ ├── iPad 13 inch-0.avif │ ├── iPad 13 inch-1.avif │ ├── iPad 13 inch-2.avif │ ├── iPad 13 inch-3.avif │ ├── iPad 13 inch-4.avif │ ├── iPad 13 inch-5.avif │ └── iPad 13 inch-6.avif ├── decentralized-demo.avif ├── divine_reclining.avif ├── brand-assets │ ├── app_icon.png │ ├── Black_on_white.png │ ├── Green_on_ivory.png │ ├── Ivory_on_Green.png │ ├── White_on_black.png │ └── divine_icon_transparent.png ├── divine_icon_transparent.avif ├── diVine launch press release 11.13.25.pdf ├── browserconfig.xml ├── _routes.json ├── social-icons │ ├── twitter.svg │ ├── tiktok.svg │ ├── bluesky.svg │ ├── github.svg │ ├── instagram.svg │ ├── reddit.svg │ └── discord.svg ├── _headers ├── .well-known │ ├── apple-app-site-association │ └── assetlinks.json ├── sw.js ├── _redirects ├── no-ai-icon.svg ├── ui-icons │ └── human-made.svg ├── manifest.webmanifest └── unregister-sw.html ├── src ├── vite-env.d.ts ├── components │ ├── ui │ │ ├── aspect-ratio.tsx │ │ ├── skeleton.tsx │ │ ├── collapsible.tsx │ │ ├── navigation-menu-variants.ts │ │ ├── badge.tsx │ │ ├── toggle.tsx │ │ ├── badge-variants.ts │ │ ├── label.tsx │ │ ├── textarea.tsx │ │ ├── button.tsx │ │ ├── separator.tsx │ │ ├── progress.tsx │ │ ├── input.tsx │ │ ├── toaster.tsx │ │ ├── toggle-variants.ts │ │ ├── sonner.tsx │ │ ├── checkbox.tsx │ │ ├── slider.tsx │ │ ├── switch.tsx │ │ ├── tooltip.tsx │ │ ├── hover-card.tsx │ │ ├── popover.tsx │ │ ├── form-utils.ts │ │ ├── button-variants.ts │ │ ├── avatar.tsx │ │ ├── radio-group.tsx │ │ ├── alert.tsx │ │ ├── scroll-area.tsx │ │ ├── resizable.tsx │ │ ├── toggle-group.tsx │ │ ├── tabs.tsx │ │ ├── accordion.tsx │ │ └── card.tsx │ ├── AnalyticsPageTracker.tsx │ ├── MarketingLayout.tsx │ ├── AnalyticsUserTracker.tsx │ ├── ScrollToTop.tsx │ ├── VineBadge.tsx │ ├── EditProfileDialog.tsx │ ├── AppLayout.tsx │ ├── VerifiedOnlyToggle.tsx │ ├── RelaySelector.tsx │ ├── OriginalContentBadge.tsx │ ├── EventCachePreloader.tsx │ ├── ZapButton.tsx │ ├── MarketingHeader.tsx │ ├── ZendeskWidget.tsx │ └── landing │ │ ├── VerifiedDemo.tsx │ │ └── DecentralizedDemo.tsx ├── lib │ ├── utils.ts │ ├── genUserName.ts │ ├── formatUtils.ts │ ├── imageUtils.ts │ ├── debug.ts │ ├── hlsAuthLoader.ts │ └── jwtDecode.ts ├── hooks │ ├── useNostr.ts │ ├── useNWCContext.ts │ ├── useAppContext.ts │ ├── useVideoPlayback.ts │ ├── useIsMobile.tsx │ ├── useHashtagThumbnail.ts │ ├── useUploadFile.ts │ ├── useSystemTheme.ts │ ├── useTheme.ts │ ├── useNostrPublish.ts │ ├── useCurrentUser.ts │ ├── useVideoReactions.ts │ ├── useLocalStorage.ts │ ├── useAuthor.ts │ ├── useLoggedInAccounts.ts │ ├── useDeferredVideoMetrics.ts │ └── useRelayCapabilities.ts ├── contexts │ ├── NWCContext.tsx │ ├── LoginDialogContext.tsx │ └── AppContext.ts ├── types │ └── window.d.ts ├── pages │ ├── HashtagDiscoveryPage.tsx │ ├── NIP19Page.tsx │ └── TagPage.tsx ├── test │ ├── setup.ts │ └── TestApp.tsx └── main.tsx ├── postcss.config.js ├── .mcp.json ├── .gemini └── settings.json ├── wrangler.toml ├── agent.json ├── eslint-rules ├── index.js ├── no-inline-script.js └── no-placeholder-comments.js ├── tsconfig.json ├── components.json ├── .gooseignore ├── stack.json ├── .private-journal ├── 2025-11-14 │ ├── 09-49-10-197288.md │ ├── 09-46-16-372948.md │ └── 09-55-46-875591.md ├── 2025-10-29 │ ├── 17-43-55-759181.md │ ├── 17-59-17-128394.md │ ├── 12-03-00-357811.md │ ├── 12-55-13-214403.md │ └── 13-29-05-128877.md ├── 2025-10-31 │ └── 09-42-46-555891.md └── 2025-11-13 │ ├── 00-37-10-342883.md │ ├── 00-45-11-172475.md │ ├── 00-40-55-225958.md │ ├── 00-57-04-885526.md │ └── 01-25-06-621373.md ├── .gitignore ├── tsconfig.node.json ├── tsconfig.app.json ├── functions └── [[path]].ts ├── scripts └── README.md ├── README.md └── DEPLOYMENT.md /codex.md: -------------------------------------------------------------------------------- 1 | CONTEXT.md -------------------------------------------------------------------------------- /.cursorrules: -------------------------------------------------------------------------------- 1 | CONTEXT.md -------------------------------------------------------------------------------- /.goosehints: -------------------------------------------------------------------------------- 1 | CONTEXT.md -------------------------------------------------------------------------------- /CLAUDE.md: -------------------------------------------------------------------------------- 1 | CONTEXT.md -------------------------------------------------------------------------------- /GEMINI.md: -------------------------------------------------------------------------------- 1 | CONTEXT.md -------------------------------------------------------------------------------- /.github/copilot-instructions.md: -------------------------------------------------------------------------------- 1 | CONTEXT.md -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | @jsr:registry=https://npm.jsr.io 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /public/og.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/og.avif -------------------------------------------------------------------------------- /public/aos-logo.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/aos-logo.avif -------------------------------------------------------------------------------- /public/app_icon.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/app_icon.avif -------------------------------------------------------------------------------- /public/divine_gun.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/divine_gun.avif -------------------------------------------------------------------------------- /public/divine_mic.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/divine_mic.avif -------------------------------------------------------------------------------- /public/logos/yahoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/logos/yahoo.png -------------------------------------------------------------------------------- /public/logos/newsweek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/logos/newsweek.png -------------------------------------------------------------------------------- /public/thumbnails/jb.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/jb.avif -------------------------------------------------------------------------------- /public/verified-demo.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/verified-demo.avif -------------------------------------------------------------------------------- /public/authentic-demo.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/authentic-demo.avif -------------------------------------------------------------------------------- /public/logos/techcrunch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/logos/techcrunch.png -------------------------------------------------------------------------------- /public/rabble-headshot.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/rabble-headshot.jpeg -------------------------------------------------------------------------------- /public/rabble-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/rabble-headshot.jpg -------------------------------------------------------------------------------- /public/screenshots/1_1.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/1_1.avif -------------------------------------------------------------------------------- /public/screenshots/2_1.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/2_1.avif -------------------------------------------------------------------------------- /public/screenshots/3_1.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/3_1.avif -------------------------------------------------------------------------------- /public/screenshots/4_1.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/4_1.avif -------------------------------------------------------------------------------- /public/thumbnails/2016.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/2016.avif -------------------------------------------------------------------------------- /public/thumbnails/2017.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/2017.avif -------------------------------------------------------------------------------- /public/thumbnails/2pm.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/2pm.avif -------------------------------------------------------------------------------- /public/thumbnails/5sos.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/5sos.avif -------------------------------------------------------------------------------- /public/thumbnails/aaa.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/aaa.avif -------------------------------------------------------------------------------- /public/thumbnails/art.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/art.avif -------------------------------------------------------------------------------- /public/thumbnails/bts.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/bts.avif -------------------------------------------------------------------------------- /public/thumbnails/cat.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/cat.avif -------------------------------------------------------------------------------- /public/thumbnails/cats.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/cats.avif -------------------------------------------------------------------------------- /public/thumbnails/cavs.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/cavs.avif -------------------------------------------------------------------------------- /public/thumbnails/chen.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/chen.avif -------------------------------------------------------------------------------- /public/thumbnails/cool.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/cool.avif -------------------------------------------------------------------------------- /public/thumbnails/cute.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/cute.avif -------------------------------------------------------------------------------- /public/thumbnails/dab.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/dab.avif -------------------------------------------------------------------------------- /public/thumbnails/dank.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/dank.avif -------------------------------------------------------------------------------- /public/thumbnails/day6.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/day6.avif -------------------------------------------------------------------------------- /public/thumbnails/dog.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/dog.avif -------------------------------------------------------------------------------- /public/thumbnails/dogs.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/dogs.avif -------------------------------------------------------------------------------- /public/thumbnails/edit.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/edit.avif -------------------------------------------------------------------------------- /public/thumbnails/edm.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/edm.avif -------------------------------------------------------------------------------- /public/thumbnails/exo.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/exo.avif -------------------------------------------------------------------------------- /public/thumbnails/exok.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/exok.avif -------------------------------------------------------------------------------- /public/thumbnails/fail.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/fail.avif -------------------------------------------------------------------------------- /public/thumbnails/fire.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/fire.avif -------------------------------------------------------------------------------- /public/thumbnails/food.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/food.avif -------------------------------------------------------------------------------- /public/thumbnails/fun.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/fun.avif -------------------------------------------------------------------------------- /public/thumbnails/gh17.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/gh17.avif -------------------------------------------------------------------------------- /public/thumbnails/girl.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/girl.avif -------------------------------------------------------------------------------- /public/thumbnails/got7.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/got7.avif -------------------------------------------------------------------------------- /public/thumbnails/haha.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/haha.avif -------------------------------------------------------------------------------- /public/thumbnails/ikon.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/ikon.avif -------------------------------------------------------------------------------- /public/thumbnails/jin.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/jin.avif -------------------------------------------------------------------------------- /public/thumbnails/kai.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/kai.avif -------------------------------------------------------------------------------- /public/thumbnails/knk.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/knk.avif -------------------------------------------------------------------------------- /public/thumbnails/kpop.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/kpop.avif -------------------------------------------------------------------------------- /public/thumbnails/lay.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/lay.avif -------------------------------------------------------------------------------- /public/thumbnails/life.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/life.avif -------------------------------------------------------------------------------- /public/thumbnails/like.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/like.avif -------------------------------------------------------------------------------- /public/thumbnails/lmao.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/lmao.avif -------------------------------------------------------------------------------- /public/thumbnails/lnic.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/lnic.avif -------------------------------------------------------------------------------- /public/thumbnails/lol.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/lol.avif -------------------------------------------------------------------------------- /public/thumbnails/loop.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/loop.avif -------------------------------------------------------------------------------- /public/thumbnails/love.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/love.avif -------------------------------------------------------------------------------- /public/thumbnails/mark.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/mark.avif -------------------------------------------------------------------------------- /public/thumbnails/meme.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/meme.avif -------------------------------------------------------------------------------- /public/thumbnails/nba.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/nba.avif -------------------------------------------------------------------------------- /public/thumbnails/nct.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/nct.avif -------------------------------------------------------------------------------- /public/thumbnails/omg.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/omg.avif -------------------------------------------------------------------------------- /public/thumbnails/onew.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/onew.avif -------------------------------------------------------------------------------- /public/thumbnails/rap.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/rap.avif -------------------------------------------------------------------------------- /public/thumbnails/song.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/song.avif -------------------------------------------------------------------------------- /public/thumbnails/suga.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/suga.avif -------------------------------------------------------------------------------- /public/thumbnails/suho.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/suho.avif -------------------------------------------------------------------------------- /public/thumbnails/tbt.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/tbt.avif -------------------------------------------------------------------------------- /public/thumbnails/vine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/vine.avif -------------------------------------------------------------------------------- /public/thumbnails/vixx.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/vixx.avif -------------------------------------------------------------------------------- /public/thumbnails/wtf.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/wtf.avif -------------------------------------------------------------------------------- /public/thumbnails/wwe.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/wwe.avif -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /public/decentralized-demo.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/decentralized-demo.avif -------------------------------------------------------------------------------- /public/divine_reclining.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/divine_reclining.avif -------------------------------------------------------------------------------- /public/thumbnails/akb48.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/akb48.avif -------------------------------------------------------------------------------- /public/thumbnails/amazing.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/amazing.avif -------------------------------------------------------------------------------- /public/thumbnails/animals.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/animals.avif -------------------------------------------------------------------------------- /public/thumbnails/anime.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/anime.avif -------------------------------------------------------------------------------- /public/thumbnails/awesome.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/awesome.avif -------------------------------------------------------------------------------- /public/thumbnails/bambam.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/bambam.avif -------------------------------------------------------------------------------- /public/thumbnails/bangtan.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/bangtan.avif -------------------------------------------------------------------------------- /public/thumbnails/beatbox.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/beatbox.avif -------------------------------------------------------------------------------- /public/thumbnails/bigbang.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/bigbang.avif -------------------------------------------------------------------------------- /public/thumbnails/bored.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/bored.avif -------------------------------------------------------------------------------- /public/thumbnails/btsarmy.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/btsarmy.avif -------------------------------------------------------------------------------- /public/thumbnails/byevine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/byevine.avif -------------------------------------------------------------------------------- /public/thumbnails/comedy.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/comedy.avif -------------------------------------------------------------------------------- /public/thumbnails/cosplay.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/cosplay.avif -------------------------------------------------------------------------------- /public/thumbnails/cover.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/cover.avif -------------------------------------------------------------------------------- /public/thumbnails/crazy.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/crazy.avif -------------------------------------------------------------------------------- /public/thumbnails/cringe.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/cringe.avif -------------------------------------------------------------------------------- /public/thumbnails/dance.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/dance.avif -------------------------------------------------------------------------------- /public/thumbnails/dancing.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/dancing.avif -------------------------------------------------------------------------------- /public/thumbnails/disney.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/disney.avif -------------------------------------------------------------------------------- /public/thumbnails/drake.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/drake.avif -------------------------------------------------------------------------------- /public/thumbnails/earrape.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/earrape.avif -------------------------------------------------------------------------------- /public/thumbnails/edits.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/edits.avif -------------------------------------------------------------------------------- /public/thumbnails/follow.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/follow.avif -------------------------------------------------------------------------------- /public/thumbnails/friends.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/friends.avif -------------------------------------------------------------------------------- /public/thumbnails/funny.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/funny.avif -------------------------------------------------------------------------------- /public/thumbnails/furry.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/furry.avif -------------------------------------------------------------------------------- /public/thumbnails/fursuit.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/fursuit.avif -------------------------------------------------------------------------------- /public/thumbnails/gaming.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/gaming.avif -------------------------------------------------------------------------------- /public/thumbnails/happy.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/happy.avif -------------------------------------------------------------------------------- /public/thumbnails/hiphop.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/hiphop.avif -------------------------------------------------------------------------------- /public/thumbnails/japan.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/japan.avif -------------------------------------------------------------------------------- /public/thumbnails/jhope.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/jhope.avif -------------------------------------------------------------------------------- /public/thumbnails/jimin.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/jimin.avif -------------------------------------------------------------------------------- /public/thumbnails/kitty.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/kitty.avif -------------------------------------------------------------------------------- /public/thumbnails/laugh.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/laugh.avif -------------------------------------------------------------------------------- /public/thumbnails/markson.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/markson.avif -------------------------------------------------------------------------------- /public/thumbnails/memes.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/memes.avif -------------------------------------------------------------------------------- /public/thumbnails/minho.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/minho.avif -------------------------------------------------------------------------------- /public/thumbnails/minhyuk.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/minhyuk.avif -------------------------------------------------------------------------------- /public/thumbnails/monstax.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/monstax.avif -------------------------------------------------------------------------------- /public/thumbnails/music.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/music.avif -------------------------------------------------------------------------------- /public/thumbnails/nbavine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/nbavine.avif -------------------------------------------------------------------------------- /public/thumbnails/party.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/party.avif -------------------------------------------------------------------------------- /public/thumbnails/pokemon.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/pokemon.avif -------------------------------------------------------------------------------- /public/thumbnails/puppy.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/puppy.avif -------------------------------------------------------------------------------- /public/thumbnails/random.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/random.avif -------------------------------------------------------------------------------- /public/thumbnails/remake.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/remake.avif -------------------------------------------------------------------------------- /public/thumbnails/remix.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/remix.avif -------------------------------------------------------------------------------- /public/thumbnails/revine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/revine.avif -------------------------------------------------------------------------------- /public/thumbnails/ripvine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/ripvine.avif -------------------------------------------------------------------------------- /public/thumbnails/sehun.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/sehun.avif -------------------------------------------------------------------------------- /public/thumbnails/shinee.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/shinee.avif -------------------------------------------------------------------------------- /public/thumbnails/singing.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/singing.avif -------------------------------------------------------------------------------- /public/thumbnails/soccer.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/soccer.avif -------------------------------------------------------------------------------- /public/thumbnails/summer.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/summer.avif -------------------------------------------------------------------------------- /public/thumbnails/taemin.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/taemin.avif -------------------------------------------------------------------------------- /public/thumbnails/thezone.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/thezone.avif -------------------------------------------------------------------------------- /public/thumbnails/travel.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/travel.avif -------------------------------------------------------------------------------- /public/thumbnails/vinealo.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/vinealo.avif -------------------------------------------------------------------------------- /public/thumbnails/weird.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/weird.avif -------------------------------------------------------------------------------- /public/thumbnails/woohyun.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/woohyun.avif -------------------------------------------------------------------------------- /public/thumbnails/xiumin.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/xiumin.avif -------------------------------------------------------------------------------- /public/thumbnails/yoongi.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/yoongi.avif -------------------------------------------------------------------------------- /public/thumbnails/yugyeom.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/yugyeom.avif -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/brand-assets/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/brand-assets/app_icon.png -------------------------------------------------------------------------------- /public/logos/businessinsider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/logos/businessinsider.png -------------------------------------------------------------------------------- /public/thumbnails/animeedit.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/animeedit.avif -------------------------------------------------------------------------------- /public/thumbnails/babymetal.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/babymetal.avif -------------------------------------------------------------------------------- /public/thumbnails/baekhyun.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/baekhyun.avif -------------------------------------------------------------------------------- /public/thumbnails/chanyeol.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/chanyeol.avif -------------------------------------------------------------------------------- /public/thumbnails/christmas.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/christmas.avif -------------------------------------------------------------------------------- /public/thumbnails/dankmemes.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/dankmemes.avif -------------------------------------------------------------------------------- /public/thumbnails/epicfail.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/epicfail.avif -------------------------------------------------------------------------------- /public/thumbnails/exordium.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/exordium.avif -------------------------------------------------------------------------------- /public/thumbnails/fireworks.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/fireworks.avif -------------------------------------------------------------------------------- /public/thumbnails/followme.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/followme.avif -------------------------------------------------------------------------------- /public/thumbnails/foodporn.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/foodporn.avif -------------------------------------------------------------------------------- /public/thumbnails/football.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/football.avif -------------------------------------------------------------------------------- /public/thumbnails/funnyvine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/funnyvine.avif -------------------------------------------------------------------------------- /public/thumbnails/ghdirecto.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/ghdirecto.avif -------------------------------------------------------------------------------- /public/thumbnails/halloween.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/halloween.avif -------------------------------------------------------------------------------- /public/thumbnails/hyungwon.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/hyungwon.avif -------------------------------------------------------------------------------- /public/thumbnails/infinite.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/infinite.avif -------------------------------------------------------------------------------- /public/thumbnails/instagram.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/instagram.avif -------------------------------------------------------------------------------- /public/thumbnails/jinyoung.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/jinyoung.avif -------------------------------------------------------------------------------- /public/thumbnails/jungkook.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/jungkook.avif -------------------------------------------------------------------------------- /public/thumbnails/kyungsoo.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/kyungsoo.avif -------------------------------------------------------------------------------- /public/thumbnails/like4like.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/like4like.avif -------------------------------------------------------------------------------- /public/thumbnails/monsta_x.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/monsta_x.avif -------------------------------------------------------------------------------- /public/thumbnails/musically.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/musically.avif -------------------------------------------------------------------------------- /public/thumbnails/pentagon.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/pentagon.avif -------------------------------------------------------------------------------- /public/thumbnails/relatable.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/relatable.avif -------------------------------------------------------------------------------- /public/thumbnails/savevine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/savevine.avif -------------------------------------------------------------------------------- /public/thumbnails/seventeen.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/seventeen.avif -------------------------------------------------------------------------------- /public/thumbnails/snapchat.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/snapchat.avif -------------------------------------------------------------------------------- /public/thumbnails/taehyung.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/taehyung.avif -------------------------------------------------------------------------------- /public/thumbnails/youngjae.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/youngjae.avif -------------------------------------------------------------------------------- /public/divine_icon_transparent.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/divine_icon_transparent.avif -------------------------------------------------------------------------------- /public/thumbnails/6secondcover.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/6secondcover.avif -------------------------------------------------------------------------------- /public/thumbnails/bangtanboys.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/bangtanboys.avif -------------------------------------------------------------------------------- /public/thumbnails/belenesteban.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/belenesteban.avif -------------------------------------------------------------------------------- /public/thumbnails/catsofvine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/catsofvine.avif -------------------------------------------------------------------------------- /public/thumbnails/comedyvine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/comedyvine.avif -------------------------------------------------------------------------------- /public/thumbnails/dogsofvine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/dogsofvine.avif -------------------------------------------------------------------------------- /public/thumbnails/donaldtrump.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/donaldtrump.avif -------------------------------------------------------------------------------- /public/thumbnails/editranked.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/editranked.avif -------------------------------------------------------------------------------- /public/thumbnails/frenchvine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/frenchvine.avif -------------------------------------------------------------------------------- /public/thumbnails/funnyvines.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/funnyvines.avif -------------------------------------------------------------------------------- /public/thumbnails/furryfandom.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/furryfandom.avif -------------------------------------------------------------------------------- /public/thumbnails/generations.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/generations.avif -------------------------------------------------------------------------------- /public/thumbnails/happynewyear.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/happynewyear.avif -------------------------------------------------------------------------------- /public/thumbnails/heysayjump.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/heysayjump.avif -------------------------------------------------------------------------------- /public/thumbnails/justinbieber.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/justinbieber.avif -------------------------------------------------------------------------------- /public/thumbnails/onedirection.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/onedirection.avif -------------------------------------------------------------------------------- /public/thumbnails/rapmonster.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/rapmonster.avif -------------------------------------------------------------------------------- /public/thumbnails/singingvine.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/singingvine.avif -------------------------------------------------------------------------------- /public/thumbnails/vinefamous.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/vinefamous.avif -------------------------------------------------------------------------------- /public/thumbnails/vineiberico.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/vineiberico.avif -------------------------------------------------------------------------------- /public/thumbnails/exordiuminbkk.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/exordiuminbkk.avif -------------------------------------------------------------------------------- /public/thumbnails/got7hardcarry.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/got7hardcarry.avif -------------------------------------------------------------------------------- /public/thumbnails/happybirthday.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/happybirthday.avif -------------------------------------------------------------------------------- /public/thumbnails/postyourdrafts.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/postyourdrafts.avif -------------------------------------------------------------------------------- /public/brand-assets/Black_on_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/brand-assets/Black_on_white.png -------------------------------------------------------------------------------- /public/brand-assets/Green_on_ivory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/brand-assets/Green_on_ivory.png -------------------------------------------------------------------------------- /public/brand-assets/Ivory_on_Green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/brand-assets/Ivory_on_Green.png -------------------------------------------------------------------------------- /public/brand-assets/White_on_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/brand-assets/White_on_black.png -------------------------------------------------------------------------------- /public/screenshots/iPad 13 inch-0.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/iPad 13 inch-0.avif -------------------------------------------------------------------------------- /public/screenshots/iPad 13 inch-1.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/iPad 13 inch-1.avif -------------------------------------------------------------------------------- /public/screenshots/iPad 13 inch-2.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/iPad 13 inch-2.avif -------------------------------------------------------------------------------- /public/screenshots/iPad 13 inch-3.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/iPad 13 inch-3.avif -------------------------------------------------------------------------------- /public/screenshots/iPad 13 inch-4.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/iPad 13 inch-4.avif -------------------------------------------------------------------------------- /public/screenshots/iPad 13 inch-5.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/iPad 13 inch-5.avif -------------------------------------------------------------------------------- /public/screenshots/iPad 13 inch-6.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/screenshots/iPad 13 inch-6.avif -------------------------------------------------------------------------------- /public/thumbnails/exordiuminbkkday2.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/exordiuminbkkday2.avif -------------------------------------------------------------------------------- /public/thumbnails/followforfollow.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/thumbnails/followforfollow.avif -------------------------------------------------------------------------------- /public/brand-assets/divine_icon_transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/brand-assets/divine_icon_transparent.png -------------------------------------------------------------------------------- /public/diVine launch press release 11.13.25.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/divinevideo/divine-web/HEAD/public/diVine launch press release 11.13.25.pdf -------------------------------------------------------------------------------- /.mcp.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "nostr": { 4 | "type": "stdio", 5 | "command": "npx", 6 | "args": ["-y", "xjsr", "@nostrbook/mcp"] 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /.gemini/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "nostr": { 4 | "type": "stdio", 5 | "command": "npx", 6 | "args": ["-y", "xjsr", "@nostrbook/mcp"] 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /src/components/ui/aspect-ratio.tsx: -------------------------------------------------------------------------------- 1 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" 2 | 3 | const AspectRatio = AspectRatioPrimitive.Root 4 | 5 | export { AspectRatio } 6 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /wrangler.toml: -------------------------------------------------------------------------------- 1 | # ABOUTME: Cloudflare Pages configuration for divine-web 2 | # ABOUTME: Defines project name, build output, and compatibility settings 3 | 4 | name = "divine-web" 5 | pages_build_output_dir = "dist" 6 | compatibility_date = "2024-11-29" 7 | -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #00b488 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/_routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "include": ["/*"], 4 | "exclude": [ 5 | "/.well-known/*", 6 | "/assets/*", 7 | "/*.png", 8 | "/*.ico", 9 | "/*.svg", 10 | "/*.json", 11 | "/*.webmanifest", 12 | "/*.xml", 13 | "/*.txt" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /public/social-icons/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/_headers: -------------------------------------------------------------------------------- 1 | # Apple App Site Association 2 | /.well-known/apple-app-site-association 3 | Content-Type: application/json 4 | Cache-Control: public, max-age=3600 5 | 6 | # Android App Links 7 | /.well-known/assetlinks.json 8 | Content-Type: application/json 9 | Cache-Control: public, max-age=3600 10 | -------------------------------------------------------------------------------- /src/hooks/useNostr.ts: -------------------------------------------------------------------------------- 1 | // This file exists because LLMs get confused and try to create this file if it doesn't exist. 2 | // The `useNostr` hook should be imported directly from `@nostrify/react`, not from this file. 3 | 4 | // This file SHOULD NOT be edited or removed. 5 | 6 | export { useNostr } from "@nostrify/react"; 7 | -------------------------------------------------------------------------------- /src/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /public/.well-known/apple-app-site-association: -------------------------------------------------------------------------------- 1 | { 2 | "applinks": { 3 | "apps": [], 4 | "details": [ 5 | { 6 | "appID": "GZCZBKH7MY.co.openvine.app", 7 | "paths": [ 8 | "/video/*", 9 | "/profile/*", 10 | "/hashtag/*", 11 | "/search/*" 12 | ] 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/contexts/NWCContext.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react'; 2 | import { useNWCInternal as useNWCHook } from '@/hooks/useNWC'; 3 | import { NWCContext } from '@/hooks/useNWCContext'; 4 | 5 | export function NWCProvider({ children }: { children: ReactNode }) { 6 | const nwc = useNWCHook(); 7 | return {children}; 8 | } -------------------------------------------------------------------------------- /src/components/ui/collapsible.tsx: -------------------------------------------------------------------------------- 1 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" 2 | 3 | const Collapsible = CollapsiblePrimitive.Root 4 | 5 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger 6 | 7 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent 8 | 9 | export { Collapsible, CollapsibleTrigger, CollapsibleContent } 10 | -------------------------------------------------------------------------------- /public/social-icons/tiktok.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /agent.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": "claude-sonnet-4", 3 | "temperature": 0.2, 4 | "mcpServers": { 5 | "js-dev": { 6 | "type": "stdio", 7 | "command": "npx", 8 | "args": ["-y", "@soapbox.pub/js-dev-mcp@latest"] 9 | }, 10 | "nostr": { 11 | "type": "stdio", 12 | "command": "npx", 13 | "args": ["-y", "@nostrbook/mcp@latest"] 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/types/window.d.ts: -------------------------------------------------------------------------------- 1 | // ABOUTME: Type declarations for window.nostr extension 2 | // ABOUTME: Allows TypeScript to recognize window.nostr property 3 | 4 | import type { NostrSigner } from '@nostrify/nostrify'; 5 | 6 | declare global { 7 | interface Window { 8 | nostr?: NostrSigner; 9 | zE?: (namespace: string, action: string, ...args: unknown[]) => void; 10 | } 11 | } 12 | 13 | export {}; 14 | -------------------------------------------------------------------------------- /eslint-rules/index.js: -------------------------------------------------------------------------------- 1 | import noInlineScript from './no-inline-script.js'; 2 | import noPlaceholderComments from './no-placeholder-comments.js'; 3 | import requireWebmanifest from './require-webmanifest.js'; 4 | 5 | export default { 6 | rules: { 7 | 'no-inline-script': noInlineScript, 8 | 'no-placeholder-comments': noPlaceholderComments, 9 | 'require-webmanifest': requireWebmanifest, 10 | }, 11 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ], 7 | "compilerOptions": { 8 | "baseUrl": ".", 9 | "paths": { 10 | "@/*": ["./src/*"] 11 | }, 12 | "noImplicitAny": false, 13 | "noUnusedParameters": false, 14 | "skipLibCheck": true, 15 | "allowJs": true, 16 | "noUnusedLocals": false, 17 | "strictNullChecks": true 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/components/ui/navigation-menu-variants.ts: -------------------------------------------------------------------------------- 1 | import { cva } from "class-variance-authority" 2 | 3 | export const navigationMenuTriggerStyle = cva( 4 | "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50" 5 | ) -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "src/index.css", 9 | "baseColor": "slate", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /.gooseignore: -------------------------------------------------------------------------------- 1 | # jsr registry should not be edited or removed 2 | .npmrc 3 | 4 | # vite client types are needed 5 | src/vite-env.d.ts 6 | 7 | # tsconfig is stable and working correctly, so should not be edited 8 | tsconfig.json 9 | tsconfig.app.json 10 | tsconfig.node.json 11 | 12 | # postcss config for Tailwind is stable and working correctly, so should not be edited unless upgrading Tailwind to v4 13 | postcss.config.js 14 | 15 | # vite config is stable and usually should not need to be edited 16 | vite.config.ts -------------------------------------------------------------------------------- /stack.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mkstack", 3 | "title": "MKStack", 4 | "description": "Build Nostr apps in minutes with this React framework", 5 | "uri": "git+https://gitlab.com/soapbox-pub/mkstack.git", 6 | "image": "https://gitlab.com/-/project/69048882/uploads/0a9e3a19f2901d5c772952c1de10ce4f/image.png", 7 | "commands": [ 8 | "npm", 9 | "npx" 10 | ], 11 | "tech": [ 12 | "react", 13 | "typescript", 14 | "tailwind", 15 | "shadcn-ui", 16 | "nostrify", 17 | "vite" 18 | ] 19 | } -------------------------------------------------------------------------------- /src/hooks/useNWCContext.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | import { createContext } from 'react'; 3 | import { useNWCInternal } from '@/hooks/useNWC'; 4 | 5 | type NWCContextType = ReturnType; 6 | 7 | export const NWCContext = createContext(null); 8 | 9 | export function useNWC(): NWCContextType { 10 | const context = useContext(NWCContext); 11 | if (!context) { 12 | throw new Error('useNWC must be used within a NWCProvider'); 13 | } 14 | return context; 15 | } -------------------------------------------------------------------------------- /.private-journal/2025-11-14/09-49-10-197288.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "9:49:10 AM - November 14, 2025" 3 | date: 2025-11-14T09:49:10.197Z 4 | timestamp: 1763113750197 5 | --- 6 | 7 | ## Project Notes 8 | 9 | Fixed video loading flash issue in Divine. User complained about intense flashing during video load. Replaced bright Skeleton components with dark bg-black/80 backgrounds + subtle spinner in VideoPlayer, VideoFeed, and VideoGrid. Also removed target="_blank" from TechCrunch link per user request to not open new tabs. Tests pass. 10 | -------------------------------------------------------------------------------- /src/hooks/useAppContext.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from "react"; 2 | import { AppContext, type AppContextType } from "@/contexts/AppContext"; 3 | 4 | /** 5 | * Hook to access and update application configuration 6 | * @returns Application context with config and update methods 7 | */ 8 | export function useAppContext(): AppContextType { 9 | const context = useContext(AppContext); 10 | if (context === undefined) { 11 | throw new Error('useAppContext must be used within an AppProvider'); 12 | } 13 | return context; 14 | } -------------------------------------------------------------------------------- /src/hooks/useVideoPlayback.ts: -------------------------------------------------------------------------------- 1 | // ABOUTME: Hook for accessing the video playback context 2 | // ABOUTME: Manages which video is currently playing in the feed 3 | 4 | import { useContext } from 'react'; 5 | import { VideoPlaybackContext } from '@/contexts/VideoPlaybackContext'; 6 | 7 | export function useVideoPlayback() { 8 | const context = useContext(VideoPlaybackContext); 9 | if (context === undefined) { 10 | throw new Error('useVideoPlayback must be used within a VideoPlaybackProvider'); 11 | } 12 | return context; 13 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .idea 17 | .DS_Store 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | 24 | # Vercel 25 | .vercel 26 | 27 | # Secrets 28 | .env 29 | .env.* 30 | !.env.example 31 | 32 | # Wrangler 33 | .wrangler 34 | 35 | # Private journal 36 | .private-journal 37 | 38 | # Git worktrees 39 | .worktrees/ 40 | -------------------------------------------------------------------------------- /.private-journal/2025-11-14/09-46-16-372948.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "9:46:16 AM - November 14, 2025" 3 | date: 2025-11-14T09:46:16.372Z 4 | timestamp: 1763113576372 5 | --- 6 | 7 | ## Project Notes 8 | 9 | Added beta test announcement to Divine landing page. User requested a note about iOS beta being full (10k signups in hours) with link to TechCrunch article. Placed it after the "Built on decentralized technology" paragraph in LandingPage.tsx:41-51. Used proper link styling with text-primary and hover:underline, plus security attributes for external link. 10 | -------------------------------------------------------------------------------- /src/pages/HashtagDiscoveryPage.tsx: -------------------------------------------------------------------------------- 1 | // ABOUTME: Hashtag discovery page showing trending and popular hashtags 2 | // ABOUTME: Includes search functionality and hashtag statistics with enhanced explorer 3 | 4 | import { HashtagExplorer } from '@/components/HashtagExplorer'; 5 | 6 | export function HashtagDiscoveryPage() { 7 | return ( 8 |
9 |
10 | 11 |
12 |
13 | ); 14 | } 15 | 16 | export default HashtagDiscoveryPage; -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | /* Bundler mode */ 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | 15 | /* Linting */ 16 | "strict": true, 17 | "noUnusedLocals": false, 18 | "noUnusedParameters": false, 19 | "noFallthroughCasesInSwitch": true 20 | }, 21 | "include": ["vite.config.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /public/.well-known/assetlinks.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "relation": ["delegate_permission/common.handle_all_urls"], 4 | "target": { 5 | "namespace": "android_app", 6 | "package_name": "co.openvine.app", 7 | "sha256_cert_fingerprints": [ 8 | "6F:36:C3:68:74:18:5E:03:B4:79:3D:82:EF:54:CE:34:26:ED:6E:C8:12:B7:CD:E2:F4:FA:9C:81:2F:C7:14:F4", 9 | "ED:9D:A6:BF:1A:D1:5B:D1:02:AF:0C:DB:4E:90:F0:3C:1B:8C:7F:EB:AA:9C:C8:F1:15:97:EB:9C:2C:41:B1:75", 10 | "10:B8:04:F9:48:FC:91:EC:28:27:B9:67:15:C3:21:2E:AB:1A:0B:46:AF:52:1B:3A:31:6C:9D:78:BF:A4:39:6E" 11 | ] 12 | } 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /public/sw.js: -------------------------------------------------------------------------------- 1 | // diVine Web Service Worker 2 | // Minimal service worker for PWA installation - no offline caching 3 | 4 | // Install event - skip waiting immediately 5 | self.addEventListener('install', (event) => { 6 | event.waitUntil(self.skipWaiting()); 7 | }); 8 | 9 | // Activate event - claim clients immediately 10 | self.addEventListener('activate', (event) => { 11 | event.waitUntil(self.clients.claim()); 12 | }); 13 | 14 | // Fetch event - always use network, no caching 15 | self.addEventListener('fetch', (event) => { 16 | // Just pass through to network, no caching 17 | event.respondWith(fetch(event.request)); 18 | }); 19 | -------------------------------------------------------------------------------- /src/hooks/useIsMobile.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | const MOBILE_BREAKPOINT = 768 4 | 5 | export function useIsMobile() { 6 | const [isMobile, setIsMobile] = React.useState(undefined) 7 | 8 | React.useEffect(() => { 9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) 10 | const onChange = () => { 11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 12 | } 13 | mql.addEventListener("change", onChange) 14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 15 | return () => mql.removeEventListener("change", onChange) 16 | }, []) 17 | 18 | return !!isMobile 19 | } 20 | -------------------------------------------------------------------------------- /src/components/ui/badge.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { type VariantProps } from "class-variance-authority" 3 | 4 | import { cn } from "@/lib/utils" 5 | import { badgeVariants } from "./badge-variants" 6 | 7 | export interface BadgeProps 8 | extends React.HTMLAttributes, 9 | VariantProps {} 10 | 11 | const Badge = React.forwardRef( 12 | ({ className, variant, ...props }, ref) => { 13 | return ( 14 |
15 | ) 16 | } 17 | ) 18 | Badge.displayName = "Badge" 19 | 20 | export { Badge } 21 | -------------------------------------------------------------------------------- /public/social-icons/bluesky.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | pull_request: 6 | 7 | jobs: 8 | test: 9 | runs-on: ubuntu-latest 10 | 11 | strategy: 12 | matrix: 13 | node-version: [20.x] 14 | 15 | steps: 16 | - name: Checkout code 17 | uses: actions/checkout@v4 18 | 19 | - name: Setup Node.js ${{ matrix.node-version }} 20 | uses: actions/setup-node@v4 21 | with: 22 | node-version: ${{ matrix.node-version }} 23 | cache: 'npm' 24 | 25 | - name: Install dependencies 26 | run: npm ci 27 | 28 | - name: Run tests (includes lint, type-check, and build) 29 | run: npm test 30 | 31 | -------------------------------------------------------------------------------- /src/components/AnalyticsPageTracker.tsx: -------------------------------------------------------------------------------- 1 | // ABOUTME: Component that tracks page views automatically as user navigates 2 | // ABOUTME: Uses React Router location changes to log analytics page_view events 3 | 4 | import { useEffect } from 'react'; 5 | import { useLocation } from 'react-router-dom'; 6 | import { trackPageView } from '@/lib/analytics'; 7 | 8 | export function AnalyticsPageTracker() { 9 | const location = useLocation(); 10 | 11 | useEffect(() => { 12 | // Track page view whenever location changes 13 | trackPageView(location.pathname + location.search, document.title); 14 | }, [location]); 15 | 16 | return null; // This component doesn't render anything 17 | } 18 | -------------------------------------------------------------------------------- /src/components/MarketingLayout.tsx: -------------------------------------------------------------------------------- 1 | // ABOUTME: Layout wrapper for marketing and informational pages 2 | // ABOUTME: Includes MarketingHeader, AppFooter and provides consistent spacing 3 | 4 | import { MarketingHeader } from "./MarketingHeader"; 5 | import { AppFooter } from "./AppFooter"; 6 | 7 | interface MarketingLayoutProps { 8 | children: React.ReactNode; 9 | } 10 | 11 | export function MarketingLayout({ children }: MarketingLayoutProps) { 12 | return ( 13 |
14 | 15 |
16 | {children} 17 |
18 | 19 |
20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /public/_redirects: -------------------------------------------------------------------------------- 1 | # WordPress migration redirects 2 | /press https://about.divine.video/press/ 301 3 | /news https://about.divine.video/news/ 301 4 | /media-resources https://about.divine.video/media-resources/ 301 5 | /news/vine-revisited https://about.divine.video/vine-revisited-a-return-to-the-halcyon-days-of-the-internet/ 301 6 | 7 | /discord https://discord.gg/sHb4HMSF 302 8 | 9 | # Deep link verification files - must be served as-is (before catch-all) 10 | /.well-known/apple-app-site-association /.well-known/apple-app-site-association 200 11 | /.well-known/assetlinks.json /.well-known/assetlinks.json 200 12 | 13 | # SPA catch-all - serves index.html for all other routes 14 | /* /index.html 200 15 | -------------------------------------------------------------------------------- /src/hooks/useHashtagThumbnail.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import { useNostr } from '@nostrify/react'; 3 | import { resolveHashtagThumbnail, type NostrClientLike } from '@/lib/hashtagThumbnail'; 4 | 5 | export function useHashtagThumbnail(hashtag: string) { 6 | const { nostr } = useNostr(); 7 | 8 | return useQuery({ 9 | queryKey: ['hashtag-thumbnail', hashtag], 10 | queryFn: async (context) => { 11 | const signal = AbortSignal.any([ 12 | context.signal, 13 | AbortSignal.timeout(8000), 14 | ]); 15 | 16 | return resolveHashtagThumbnail(nostr as NostrClientLike, hashtag, signal); 17 | }, 18 | staleTime: Infinity, 19 | gcTime: Infinity, 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /src/hooks/useUploadFile.ts: -------------------------------------------------------------------------------- 1 | import { useMutation } from "@tanstack/react-query"; 2 | import { BlossomUploader } from '@nostrify/nostrify/uploaders'; 3 | 4 | import { useCurrentUser } from "./useCurrentUser"; 5 | 6 | export function useUploadFile() { 7 | const { user } = useCurrentUser(); 8 | 9 | return useMutation({ 10 | mutationFn: async (file: File) => { 11 | if (!user) { 12 | throw new Error('Must be logged in to upload files'); 13 | } 14 | 15 | const uploader = new BlossomUploader({ 16 | servers: [ 17 | 'https://blossom.divine.video/', 18 | ], 19 | signer: user.signer, 20 | }); 21 | 22 | const tags = await uploader.upload(file); 23 | return tags; 24 | }, 25 | }); 26 | } -------------------------------------------------------------------------------- /src/components/ui/toggle.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import * as TogglePrimitive from "@radix-ui/react-toggle" 3 | import { type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | import { toggleVariants } from "./toggle-variants" 7 | 8 | const Toggle = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef & 11 | VariantProps 12 | >(({ className, variant, size, ...props }, ref) => ( 13 | 18 | )) 19 | 20 | Toggle.displayName = TogglePrimitive.Root.displayName 21 | 22 | export { Toggle } 23 | -------------------------------------------------------------------------------- /src/hooks/useSystemTheme.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | export function useSystemTheme() { 4 | const getSystemTheme = (): "dark" | "light" => 5 | window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; 6 | 7 | const [theme, setTheme] = useState<"dark" | "light">(getSystemTheme); 8 | 9 | useEffect(() => { 10 | const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); 11 | 12 | const handler = (event: MediaQueryListEvent): void => { 13 | setTheme(event.matches ? "dark" : "light"); 14 | }; 15 | 16 | // Attach listener 17 | mediaQuery.addEventListener("change", handler); 18 | 19 | // Cleanup 20 | return () => mediaQuery.removeEventListener("change", handler); 21 | }, []); 22 | 23 | return theme; 24 | } 25 | 26 | -------------------------------------------------------------------------------- /public/social-icons/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": false, 19 | "strictNullChecks": true, 20 | "noUnusedLocals": false, 21 | "noUnusedParameters": false, 22 | "noImplicitAny": false, 23 | "noFallthroughCasesInSwitch": false, 24 | 25 | "baseUrl": ".", 26 | "paths": { 27 | "@/*": ["./src/*"] 28 | } 29 | }, 30 | "include": ["src"] 31 | } 32 | -------------------------------------------------------------------------------- /src/components/ui/badge-variants.ts: -------------------------------------------------------------------------------- 1 | import { cva } from "class-variance-authority" 2 | 3 | export const badgeVariants = cva( 4 | "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", 5 | { 6 | variants: { 7 | variant: { 8 | default: 9 | "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", 10 | secondary: 11 | "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", 12 | destructive: 13 | "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", 14 | outline: "text-foreground", 15 | }, 16 | }, 17 | defaultVariants: { 18 | variant: "default", 19 | }, 20 | } 21 | ) -------------------------------------------------------------------------------- /src/components/ui/label.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import * as LabelPrimitive from "@radix-ui/react-label" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | 7 | const labelVariants = cva( 8 | "text-sm font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70" 9 | ) 10 | 11 | const Label = React.forwardRef< 12 | React.ElementRef, 13 | React.ComponentPropsWithoutRef & 14 | VariantProps 15 | >(({ className, ...props }, ref) => ( 16 | 21 | )) 22 | Label.displayName = LabelPrimitive.Root.displayName 23 | 24 | export { Label } 25 | -------------------------------------------------------------------------------- /.private-journal/2025-11-14/09-55-46-875591.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "9:55:46 AM - November 14, 2025" 3 | date: 2025-11-14T09:55:46.875Z 4 | timestamp: 1763114146875 5 | --- 6 | 7 | ## Project Notes 8 | 9 | Completed full release cycle for Divine: 10 | 1. Added iOS beta test announcement (10k signups) with TechCrunch link 11 | 2. Reduced video loading flash by replacing bright Skeleton components with dark bg-black/80 + subtle spinner 12 | 3. Removed three demo cards from landing page (Authentic, Verified, Decentralized) 13 | 4. Fixed links to not open in new tabs 14 | 5. Updated CHANGELOG.md 15 | 6. Committed and pushed to GitHub (main branch) 16 | 7. Deployed to Cloudflare Pages successfully - https://f11dba0a.divine-web-fm8.pages.dev 17 | 18 | User was frustrated with intense video flashing and wanted cleaner landing page. All changes tested and deployed successfully. 19 | -------------------------------------------------------------------------------- /src/components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export type TextareaProps = React.TextareaHTMLAttributes 6 | 7 | const Textarea = React.forwardRef( 8 | ({ className, ...props }, ref) => { 9 | return ( 10 |