blob_adminREADME.md1 match
3This is a lightweight Blob Admin interface to view and debug your Blob data.
45
67Use this button to install the val:
blob_adminREADME.md1 match
3This is a lightweight Blob Admin interface to view and debug your Blob data.
45
67Use this button to install the val:
16"<title>Garðland 24B</title>",
17'<meta charset="utf-8"/>',
18'<link rel="icon" href="data:image/png;base64,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"/>',
19"</head>",
20"<body>",
sqliteExplorerAppREADME.md1 match
3View and interact with your Val Town SQLite data. It's based off Steve's excellent [SQLite Admin](https://www.val.town/v/stevekrouse/sqlite_admin?v=46) val, adding the ability to run SQLite queries directly in the interface. This new version has a revised UI and that's heavily inspired by [LibSQL Studio](https://github.com/invisal/libsql-studio) by [invisal](https://github.com/invisal). This is now more an SPA, with tables, queries and results showing up on the same page.
45
67## Install
sqliteExplorerAppREADME.md1 match
3View and interact with your Val Town SQLite data. It's based off Steve's excellent [SQLite Admin](https://www.val.town/v/stevekrouse/sqlite_admin?v=46) val, adding the ability to run SQLite queries directly in the interface. This new version has a revised UI and that's heavily inspired by [LibSQL Studio](https://github.com/invisal/libsql-studio) by [invisal](https://github.com/invisal). This is now more an SPA, with tables, queries and results showing up on the same page.
45
67## Install
23return html(render(<FavIcon emoji={emoji} />), {
24headers: {
25"Content-Type": "image/svg+xml",
26"Cache-Control": `public, max-age=${60 * 60 * 24}, s-maxage=${60 * 60 * 24 * 7}`,
27},
sparklineExmain.tsx1 match
20return new Response(htmlString, {
21headers: {
22"content-type": "image/svg+xml",
23},
24});
illustratedPrimermain.tsx26 matches
1import inputHeader from "https://esm.town/v/substrate/inputHeader";
2import { ComputeJSON, ComputeText, GenerateImage, sb, Substrate } from "npm:substrate";
3import { z } from "npm:zod";
4import { zodToJsonSchema } from "npm:zod-to-json-schema";
21});
22const prompt1 = new ComputeText({
23prompt: sb.interpolate`generate a description of an image of ${
24c1.future.json_object.get("concepts").at(0)
25}. Be creative depicting abstract topics using detailed abstract imagery. Include details on the background, angle & framing, and style.`,
26});
27const prompt2 = new ComputeText({
28prompt: sb.interpolate`generate a description of an image of ${
29c1.future.json_object.get("concepts").at(1)
30}. Be creative depicting abstract topics using detailed abstract imagery. Include details on the background, angle & framing, and style.`,
31});
32const caption1 = new ComputeText({
39${caption1.future.text}`,
40}, { cache_age: 800 });
41const image1 = new GenerateImage({ prompt: prompt1.future.text });
42const image2 = new GenerateImage({ prompt: prompt2.future.text });
43const c2 = new ComputeJSON({
44prompt: sb.interpolate`List advanced concepts related to: ${c1.future.json_object.get("concepts").at(0)}
49});
50const prompt3 = new ComputeText({
51prompt: sb.interpolate`generate a description of an image of ${
52c2.future.json_object.get("concepts").at(0)
53}. Be creative depicting abstract topics using detailed abstract imagery. Include details on the background, angle & framing, and style.`,
54});
55const prompt4 = new ComputeText({
56prompt: sb.interpolate`generate a description of an image of ${
57c2.future.json_object.get("concepts").at(1)
58}. Be creative depicting abstract topics using detailed abstract imagery. Include details on the background, angle & framing, and style.`,
59});
60const caption3 = new ComputeText({
73${caption3.future.text}`,
74});
75const image3 = new GenerateImage({ prompt: prompt3.future.text });
76const image4 = new GenerateImage({ prompt: prompt4.future.text });
77const nodes = [image1, caption1, image2, caption2, image3, caption3, image4, caption4];
78const stream = await substrate.stream(...nodes);
7984async start(controller) {
85const pairs = [
86{ image: null, caption: null, title: null },
87{ image: null, caption: null, title: null },
88{ image: null, caption: null, title: null },
89{ image: null, caption: null, title: null },
90];
9192const outputPair = (pair, index) => {
93if (pair.image && pair.caption) {
94controller.enqueue(new TextEncoder().encode(
95`<div style="display:flex;justify-content:center;align-items:center;margin-bottom:20px;">
96<div style="margin:0 10px;">${pair.image}</div>
97<div style="margin:0 10px;font-size:1.2rem;">
98<a href="/?input=${pair.title}"><b>${capitalize(pair.title)}</b></a><br/>${pair.caption}</div>
99</div>`,
100));
101pairs[index] = { image: null, caption: null, title: null }; // Reset after output
102}
103};
119if (index !== -1) {
120const pairIndex = Math.floor(index / 2);
121const isImage = index % 2 === 0;
122const content = event.data.image_uri
123? `<img src="${event.data.image_uri}" width=400/>`
124: `<div style="font-family:system-ui,sans-serif;">${event.data.text}</div>`;
125126if (isImage) {
127pairs[pairIndex].image = content;
128} else {
129pairs[pairIndex].caption = content;
umbrellaReminderREADME.md1 match
1# ☔️ Umbrella reminder if there's rain today
23
45## Setup
beigeMandrillmain.tsx3 matches
2122// Retrieve HTCI API key from environment variables
23const apiUrl = 'https://hcti.io/v1/image';
2425const apiKey = Deno.env.get("HTCI");
57return new Response(pngBuffer, {
58headers: {
59'Content-Type': 'image/png',
60'Cache-Control': 'public, max-age=604800, immutable'
61},
63} catch (error) {
64console.error('Error converting SVG to PNG:', error);
65return new Response('Error generating image', { status: 500 });
66}
67}