personal website

vibes

+16 -9
+14 -2
build.ts
··· 1 1 #!/usr/bin/env bun 2 2 import plugin from "bun-plugin-tailwind"; 3 3 import { existsSync } from "fs"; 4 - import { rm, cp } from "fs/promises"; 4 + import { rm, cp, readdir, writeFile } from "fs/promises"; 5 5 import path from "path"; 6 6 7 7 if (process.argv.includes("--help") || process.argv.includes("-h")) { ··· 146 146 console.table(outputTable); 147 147 const buildTime = (end - start).toFixed(2); 148 148 149 - // Copy public folder to dist 149 + // Generate vibes manifest into public so it gets copied with the rest 150 150 const publicDir = path.join(process.cwd(), "public"); 151 + const vibesDir = path.join(publicDir, "vibes"); 152 + if (existsSync(vibesDir)) { 153 + const files = await readdir(vibesDir); 154 + const manifest = files.filter((f) => f !== "manifest.json").map((f) => `/vibes/${f}`); 155 + await writeFile( 156 + path.join(vibesDir, "manifest.json"), 157 + JSON.stringify(manifest) 158 + ); 159 + console.log(`📦 Generated vibes/manifest.json with ${manifest.length} files`); 160 + } 161 + 162 + // Copy public folder to dist 151 163 if (existsSync(publicDir)) { 152 164 console.log("📁 Copying public folder to dist..."); 153 165 await cp(publicDir, outdir, { recursive: true });
+1
public/vibes/manifest.json
··· 1 + ["/vibes/81730978_p0_master1200.jpg","/vibes/IMG_2849.AVIF","/vibes/image-6.webp","/vibes/image.webp","/vibes/dsad.png","/vibes/2024-11-24_19.10.43.webp","/vibes/bafkreic3mk7a234laor5lhtbjlsuv2ui5rfd5cyg5lmobrbginw6gylblu.jpg","/vibes/IMG_3078.JPG","/vibes/PXL_20240311_012623545.jpg","/vibes/jygj279u53rc1.webp","/vibes/Go5y3GaaEAEqQST.jpg","/vibes/F3Zo4EhWEAA8kr2.jpg","/vibes/GpaCQIBXgAEDsXj.png","/vibes/IMG_3291.JPG","/vibes/IMG_3293.jpg","/vibes/IMG_3278.JPG","/vibes/GoBTrx0a8AAbB5S.jpg","/vibes/image-11.webp","/vibes/IMG_2685.WEBP","/vibes/GonrdcQXoAAY-SL.jpg","/vibes/20240407_221011.jpg","/vibes/IMG_0406.png","/vibes/bafkreiagdb7qhtccfgtfg2dx7o23xiehagrvfrpichmidozqolaa2ui6su.jpg","/vibes/bafkreicidyvdaijdsxhpkfc57re37g4dgwa6mg7mnlb36335xuaat6pxvy.jpg","/vibes/bafkreidv227afm7ps2geuzvwn2znakpvefoty5i675qip7fkurotitgh6e.jpg","/vibes/IMG_3292.JPG","/vibes/IMG_3282.JPG","/vibes/IMG_9793.jpg","/vibes/IMG_3269.JPG","/vibes/IMG_2605.JPG","/vibes/bafkreig4yxs4gt4rflzwv2kbv47u4shhpet6eowfn6ocbwrwi5xikq52fm.jpg","/vibes/genshin.png","/vibes/image0 2.jpg","/vibes/IMG_3136.JPG","/vibes/IMG_2599.JPG","/vibes/tra.png","/vibes/image-10.webp","/vibes/PXL_20240121_211338666.jpg","/vibes/20210711_141551.jpg","/vibes/IMG_3256.PNG","/vibes/2023-01-01_16.55.57.webp","/vibes/bafkreigpvzbssycljzaqclvzs7h4doltrfdb7t2o52363i2pssqbcvwdxa.jpg","/vibes/image-7.webp","/vibes/8aa3ebb1-899f-4d2f-99ea-ad7db0fecc4f.jpg","/vibes/bafkreihdlgy3uyxjd6ozu22ltcjin5zjqpxifodtc7ntvcw56rjcbesn4e.jpg","/vibes/GpjVUBIbwAAZzff.jpg","/vibes/IMG_3230.JPG","/vibes/PXL_20231122_163549147.jpg","/vibes/PXL_20231124_193140506.jpg","/vibes/IMG_0103.jpg","/vibes/IMG_2675 2.JPG","/vibes/bafkreigdfydcw3fhrxzll67dli5pesnws7zhxzjjuryliostlvy4jypdky@jpeg.webp","/vibes/IMG_3392.png","/vibes/PXL_20230805_223400932.jpg","/vibes/PXL_20240502_131050536.jpg","/vibes/tsconfig.jpg","/vibes/IMG_2675.JPG","/vibes/287ad63ae93cd0aa93eefcfba452c8822fc5d32a.png","/vibes/Destiny_2_replay_2022.09.25-16.18-00.00.27.568-00.00.34.213.mp4","/vibes/3x3ep44awthe1.jpeg","/vibes/2025-04-12_23.34.40.webp","/vibes/PXL_20240325_165913386.jpg","/vibes/IMG_0129.JPG","/vibes/IMG_2110.png","/vibes/GpaRcnsXcAAsVjq.jpg","/vibes/afsdasdf.png","/vibes/cb001fdc393ead3e2ac562c2db0baf6f.png","/vibes/lkw06l1nykye1.png","/vibes/tumblr_2861f1bc82f459f679789f9ba2891cc2_31516384_1280.jpg","/vibes/bafkreihjioibfdw2witu6trx34jocyra6zjfy7yuyhexzusqjh6tpffl7e.jpg","/vibes/bafkreihvmv2rstow3s6ezqk2qi5wlfqfulfyjyl5qzzqlfxq6q42bkd5ma.jpg","/vibes/bafkreic62lafal5cwtvjgud3zs7kbutnpcxya6ctehqumwytjhwqjqgdii.jpg","/vibes/GiiZC2eXoAAzh6q.png","/vibes/PXL_20231122_165815931.jpg","/vibes/image-1.webp","/vibes/Screenshot_20230114_021449.webp","/vibes/2024-12-03_17.36.34.webp","/vibes/2024-11-27_21.webp","/vibes/PXL_20231121_164748536.jpg","/vibes/bafkreihv2isoqe2aisrfw37isoooczabedxvmomiznplpfmo2inmetkfc4.jpg","/vibes/2025-04-12_23.34.36.webp","/vibes/bafkreicc42kwpdk464lw4iv62qudccwwnzpgnrjpqeg5decxz226l3tgzm.jpg","/vibes/bafkreihygg2vutfbjqvszbs26cvihs42ivkibuewe62dzs6vwxm36duvuyjpeg.png","/vibes/IMG_3210.webp","/vibes/GlCsl2kX0AAwRAZ.png","/vibes/IMG_3022.JPG","/vibes/GofnSN8XoAAyhnh.jpg","/vibes/IMG_0095.JPG","/vibes/bafkreicq74ss2lnb73fwgl3ihxqe4el7vt56nxhhxnpagjpjny5m6g3mze.jpg","/vibes/IMG_1837.png","/vibes/IMG_2655.JPG","/vibes/IMG_0718.JPG","/vibes/IMG_0095.png","/vibes/ebc7fb5169074a2e75bd3c0c00119560.jpg","/vibes/IMG_2735.JPG","/vibes/79d98eda-4ebc-458b-aa4c-3b0bd9ed2d1f.png","/vibes/PXL_20240113_192702373.jpg","/vibes/bafkreiasjkh35y3nu3tz5ldmj2l2xpsh5rwqgp4v5yovdi5dyd2tqzz3va.jpg","/vibes/IMG_0282.JPG","/vibes/bafkreifs7mafsacnvlau3kskuabrv2esvobuhmb22epsfxrvmrywi6bh5q.jpg","/vibes/bafkreibql6eo4xst3kbiicflzesrqy2422eunlfma2ulllthzn7kn7cdvq.jpg","/vibes/736336c6a98ba15014172d07b6d7af5f.jpg","/vibes/bafkreicrfm23nnctbdrj2wfhhlegf34cufthifzdtxgo4ntpcfv7ezqq6i.jpg","/vibes/d58b3qwqkkue1.png","/vibes/bafkreiaax5lv7kfrzy3pwq745v7ypzjwxxasupfhdbwcjzhz3ohu46fabq.jpg","/vibes/attachment 4.jpg","/vibes/PXL_20240317_191104003.jpg","/vibes/image-2.webp","/vibes/IMG_0083.PNG","/vibes/Gid2GfkXIAAJJl3.jpg","/vibes/IMG_2870.JPG","/vibes/bafkreid7plghykzgkvfrsmghlbxfmovmlju3ohlgezaj6kshbi2ckw2mcu.jpg","/vibes/IMG_2788.WEBP","/vibes/sda.png","/vibes/IMG_2109.png","/vibes/IMG_2860.PNG","/vibes/image-3.webp","/vibes/Natsuko_cosplay_Himeko_-_HonkaiStar_Rail_77.jpg","/vibes/20231018_125321.jpg","/vibes/bafkreie6te7m2p42fdenu5r45mhsjc7k2mmwkl6kovne3gcoby2hgjmd34.jpg","/vibes/2022-12-30_21.18.55.webp","/vibes/2025_Marathon_Reveal_Press_Kit_LARGE_008.png","/vibes/IMG_0247.JPG","/vibes/PXL_20240308_230057122.jpg","/vibes/bafkreifryay7tg45u6zu3mwq6l52wujyr5kzgymvg6cwmcnv6wwfmpxfxq@jpeg.webp","/vibes/bafkreigxfyig4ubitqtbolmlfjyigeijic44nr3r4r4qjskiuol4cfvvka.jpg","/vibes/slug.png","/vibes/attachment 3.jpg","/vibes/__texas_and_lappland_arknights_drawn_by_puppy_user_kfpt4478__8ef71ff15354d25d3d1059adfc91e4f2.jpg","/vibes/sample_8d92473c6e28defd5b3594efadbcb1aa.jpg","/vibes/IMG_5885.webp","/vibes/attachment 2.jpg","/vibes/76200c17-83db-437d-95eb-394b5d865634.png","/vibes/IMG_0091.png","/vibes/PXL_20230705_203143689.jpg","/vibes/GpVNXnEWsAA6gm7.jpg","/vibes/Screenshot 2025-04-27 at 2.35.47 AM.png","/vibes/RDT_20230106_0144143661212588690263489.jpg","/vibes/bafkreif34w4lgfbqjv5vqxqrmh33qzfvro4mg65kflfd2tmxcjg722hmay.jpg","/vibes/IMG_3058.JPG","/vibes/__manjuu_enterprise_and_enterprise_azur_lane_drawn_by_sciamano240__172400e5c5ee0c95ee1f602c404484f4.jpg","/vibes/PXL_20240502_131050536-1.jpg","/vibes/2025-04-12_23.31.10.webp","/vibes/RDT_20231009_2001048696124852856704244.jpg","/vibes/image-1.png","/vibes/a1680503-25bb-455f-bcb5-db38780cf3ec.png","/vibes/image-4.webp","/vibes/F8ZXP27bkAApO87.jpg","/vibes/bafkreihirmzdqnkdhaoux2ypigusht4djnymz4kmwfafx4dhfx5d5o2ncu.jpg","/vibes/IMG_0752.JPG","/vibes/bafkreiaaia3g5lwpeyhtpuufknd3ws6ns7oqiz2p64su6q32rne47f5pte.jpg","/vibes/Screenshot_20240102_120522.png","/vibes/IMG_2621.JPG","/vibes/Tumblr_l_65973710062162.png","/vibes/bafkreidx2d4brqitkdf4flh7bktetwfnzm7bbqv75iv6f6fnvpw5nzknya.jpg","/vibes/PXL_20230818_213328823.jpg","/vibes/2022-12-29_07.46.32.webp","/vibes/IMG_3289 2.JPG","/vibes/image 4.png","/vibes/7aeddaf4055c06b3c87c58709c078f93.jpg","/vibes/attachment.jpg","/vibes/PXL_20240408_192007680.jpg","/vibes/attachment.png","/vibes/image-8.webp","/vibes/IMG_9417.jpg","/vibes/IMG_2595.JPG","/vibes/IMG_0235.JPG","/vibes/Gp7ncqtawAMun8V.webp","/vibes/bafkreihv4ylbotmgb3xp3lsu4idyf3y76gyjrks2hsdacbxaffi5pyyk2i.jpg","/vibes/IMG_5836.jpg","/vibes/Gpd47v3bkAAV2lY.png","/vibes/IMG_2850.AVIF","/vibes/GozvOzPaAAARBPe.jpg","/vibes/image-9.webp","/vibes/2024-11-16_17.03.36.webp","/vibes/bafkreigsbsgkfzco45jnyhfah7wb5czqptpetjx2mxlym7pns7uvzcsxke.jpg","/vibes/IMG_5994.jpg","/vibes/bafkreiagm4fgp4pxnuk5r5xfqwdi2o7ezji4c64jrdgtpywp764bnrqppq.jpg","/vibes/bafkreihffziagadmdpbqylqqmejxj4exsvadztfhmrsk5tjq36esv5vjca.jpg","/vibes/85786433-3946-4a94-a863-c12999082023_373x306.webp","/vibes/image0.jpg","/vibes/IMG_3049.PNG","/vibes/IMG_3288.JPG","/vibes/images.png","/vibes/images.jpg","/vibes/IMG_5835.png","/vibes/image.jpg","/vibes/image-5.webp","/vibes/twinkyuri.jpg","/vibes/__hatsune_miku_vocaloid_drawn_by_mosh_mallow__44df1f18b1645081857d4da85a871043.jpg","/vibes/PXL_20230820_161352256.jpg","/vibes/IMG_1070.jpg","/vibes/bafkreidiqctpedei6hhdauxk6ywhiswtfs67c5oovr75eabepgrges54cy.jpg","/vibes/image 2.png","/vibes/image.png","/vibes/lurk.png","/vibes/image 3.png","/vibes/bafkreiarrfvh2scs2bzdspz3u24l4xcdobsu33cqgnukhvgi3klpdaue6q.jpg","/vibes/bafkreidteiaeygoy6wrhuuc2a5l6uaqtnf3e2ugvsqoaowcrru6wxlah4q.jpg","/vibes/4 tqagds.jpg","/vibes/IMG_3289.JPG"]
+1 -1
src/components/sections/Vibes.tsx
··· 4 4 const [vibes, setVibes] = useState<string[]>([]) 5 5 6 6 useEffect(() => { 7 - fetch("/api/vibes") 7 + fetch("/vibes/manifest.json") 8 8 .then((res) => res.json()) 9 9 .then(setVibes) 10 10 .catch(() => setVibes([]))
-6
src/index.ts
··· 1 1 import { serve } from "bun"; 2 - import { readdir } from "fs/promises"; 3 2 import index from "./index.html"; 4 3 5 4 const server = serve({ ··· 32 31 } catch { 33 32 return new Response("File not found", { status: 404 }); 34 33 } 35 - }, 36 - 37 - "/api/vibes": async () => { 38 - const files = await readdir("public/vibes"); 39 - return Response.json(files.map((f) => `/vibes/${f}`)); 40 34 }, 41 35 42 36 "/vibes/*": async (req) => {