3import { Hono } from "https://esm.sh/hono@3.12.0";
4import { renderToStaticMarkup } from "https://esm.sh/react-dom@18.2.0/server";
5import OGImage from "../components/OGImage.tsx";
6
7const app = new Hono();
10 const title = c.req.query("title");
11 const format = c.req.query("format");
12 const svg = renderToStaticMarkup(<OGImage title={title} />);
13
14 if (format === "svg") {
15 return new Response(svg, {
16 headers: {
17 "Content-Type": "image/svg+xml",
18 },
19 });
24 return new Response(png, {
25 headers: {
26 "Content-Type": "image/png",
27 "Content-Length": png.length.toString(),
28 },
3import faviconRoute from "./routes/favicon.svg.ts";
4import homeRoutes from "./routes/home.ts";
5import ogImageRoute from "./routes/og-image.ts";
6import proxyRoutes from "./routes/proxy.ts";
7import rssRoute from "./routes/rss.ts";
13app.route("/rss.xml", rssRoute);
14app.route("/favicon.svg", faviconRoute);
15app.route("/og-image.png", ogImageRoute);
16
17// Everything else, proxy to the old blog
1Eventually we should host all our images properly, but for now, drag and drop them here 👇
2
3* https://imagedelivery.net/iHX6Ovru0O7AjmyT5yZRoA/4d90a6f7-247c-4df4-3de6-928364e10000/public
4* https://imagedelivery.net/iHX6Ovru0O7AjmyT5yZRoA/f175100b-a190-4772-7056-04c09f273a00/public
12}) {
13 const description = post?.description ?? SITE_DESCRIPTION;
14 const ogImage = new URL("/og-image.png", BLOG_URL);
15 ogImage.searchParams.append("title", title);
16
17 return (
19 <meta charSet="UTF-8" />
20 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
21 <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
22
23 <title>{title}</title>
30 <meta property="og:description" content={description} />
31
32 <meta property="og:image" content={ogImage} />
33
34 {/* Twitter */}
35 <meta property="twitter:card" content="summary_large_image" />
36 <meta property="twitter:url" content={BLOG_URL} />
37 <meta property="twitter:title" content={title} />
38 <meta property="twitter:description" content={description} />
39
40 <meta property="twitter:image" content={ogImage} />
41
42 {
79 "slug": "fal",
80 "link": "/blog/fal",
81 "description": "Bringing lightning fast AI image generation to Val Town",
82 "pubDate": "Thu, 31 Oct 2024 00:00:00 GMT",
83 "author": "Steve Krouse",
13 {
14 headers: {
15 "Content-Type": "image/svg+xml",
16 },
17 },
3This is a lightweight Blob Admin interface to view and debug your Blob data.
4
5
6
7Versions 0-17 of this val were done with Hono and server-rendering.
440 {profile && (
441 <div className="flex items-center space-x-4">
442 <img src={profile.profileImageUrl} alt="Profile" className="w-8 h-8 rounded-full" />
443 <span>{profile.username}</span>
444 <a href="/auth/logout" className="text-blue-400 hover:text-blue-300">Logout</a>
583 alt="Blob content"
584 className="max-w-full h-auto"
585 onError={() => console.error("Error loading image")}
586 />
587 </div>
635 <li>Create public shareable links for blobs</li>
636 <li>View and manage public folder</li>
637 <li>Preview images directly in the interface</li>
638 </ul>
639 </div>
706 const { ValTown } = await import("npm:@valtown/sdk");
707 const vt = new ValTown();
708 const { email: authorEmail, profileImageUrl, username } = await vt.me.profile.retrieve();
709 // const authorEmail = me.email;
710
774
775 c.set("email", email);
776 c.set("profile", { profileImageUrl, username });
777 await next();
778};
835 z-index: 1;
836 pointer-events: none;
837 mask-image: linear-gradient(to right, black 4px, transparent 4px),
838 linear-gradient(to left, black 4px, transparent 4px),
839 linear-gradient(to bottom, black 4px, transparent 4px),
17 console.log(`Reaction removida de ${r.reaction.referencedMessage.messageId}`);
18 }
19 if (r.text?.message || r.image?.imageUrl) {
20 await react(r.phone, "🧠", r.messageId);
21 const resLlm = await appendMessage(user.phone, r.text?.message, r.image?.imageUrl)
22 const resZap = await sendText(user.phone, resLlm.answer);
23 await react(r.phone, "✅", r.messageId);