Val Town Newsletter 22
Val Town is growing up! We’re working on features and infra that will fundamentally unlock the scope and scale of what you can build in Val Town. We have two major efforts running in parallel: projects and scalability.
Projects are containers for multiple vals, folders, and files. The enable you to create infinitely complex real-world apps, instead of being limited to a single long val. Internal to a project, vals will use relative imports (ie ./foo/bar
), so they can be forked as a unit, and merged back in as a unit. Projects will also improve Townie’s ability to help write your vals in more modular files, so that it doesn’t have to regenerate all the code on every change.
Scalability will enable you to run production workloads in Val Town, with usage-based pricing, custom alerts, and caps.
We hope to have both of these efforts live in the coming months. In the meantime, we’ve shipped many other features and improvements, including a dozen Townie upgrades, scoped API permissions, a partnership with Fal, and more.
Justin Bennett has joined our team! He is well-known for the DevtoolsFM podcast, and was most recently at The Recurse Center, Membrane, and Oxide. We’ve known Justin for years, and are thrilled he’s on the team.
As per usual, the highlight of our newsletter is at the bottom: a list of the most interesting community vals we’ve seen this month, including a bunch working with the Bluesky API, a Val Town clone built on Val Town, Stripe examples, virtual money, data journalism, lightning-fast Cerebras 2k-tokens-per-second demos, and dozens more!
🤖 Townie upgrades
Townie has been massively upgraded this month. We shipped some of the most common feature request and fixed the worst bugs.
This video shows me adding analytics to Cerebras Coder, a minimal Townie clone, powered by Cerebras’s lightning-fast inference. The video shows switching from Haiku to Sonnet; Townie detecting a server-side error; fixing it upon request; fixing another bug; viewing older versions of the val; and a notice to start a new chat because longer chats make Townie dumber.
- By far the most common feature request for Townie has been the ability to preview the older versions of HTTP vals. This is now live! There’s a dropdown in the bottom of the Preview tab in Townie to select an older version to preview, with the ability to restore that version. Thanks Charlie for the tip to add the Restore button, and Matt for the feedback on the wording of the button 🙏
- In order to make Townie sustainable, we rolled out usage limits. Now free-tier users can try out Townie for about a dozen messages on a Haiku, a cheaper (albeit still fantastic) model. We hope this will help you get a sense of what Townie can do, and encourage you to upgrade to Pro if you want to use it regularly. If you find that you’re hitting your limits as a Pro user, please reach out to me at steve@val.town with more context on your use case. We’re eagerly looking for feedback on a higher-level Pro tier or usage-based pricing.
- We deployed Anthropic prompt caching (try it on Val Town), which saves 40% on cost, and improves latency by up to 85% for long prompts.
- We rolled out Sonnet 3.5 New, which is supposed to be even better at coding, but unfortunately had to rollback to Sonnet 3.5 Old, because the New version was resistant to writing very large blocks of code in their entirety. It added a lot of
// code remains unchanged here
. We fixed that issue with Anthropic’s help, and are working through a couple other system prompt issues with Sonnet 3.5 New, and hope to get it rolled out in the coming weeks. - Townie now detects many client-side and server-side errors automatically, and has a clean UI to view the errors to help you decide if you want to debug them manually, dismiss them, or ask Townie to solve them for you.
- At long-last we fixed bugs with the Townie code editor getting out of sync or showing “unsaved changes” when there weren’t any.
If you’d like to read more about behind-the-scenes of Townie, Tom gave a talk, which he turned into a blog post: Building a Code Writing Robot.
🔐 Scoped Permissions
We added API scopes to Val Town API tokens to give you more granular control over our REST API.
We have read/write scopes for:
val
– valsuser
– user account detailsblob
– blob storagesqlite
– sqlite databaseemail
– ability to send emails
The API tokens page now lets you view and configure the scope of each token. You can also configure the scope of for each individual val on its settings page. Learn more ➡
🌄 Fal Partnership
We announced a partnership with Fal, to bring their lightning-fast image generation API to Val Town users. Learn more ➡
Updated Pricing Page
We’ve made some long-overdue updates to our pricing page.
Here’s what changed:
- Expanded the Pro tier from 100 to 500 HTTP val req/min – thanks Izu for the request 🙏
- Listed custom domains on the Pro tier
- Lowered the number of private or unlisted vals on the Free tier from 100 to 10. (We have yet to enforce this. When we enforce it, we will grandfather in any vals created before.)
- Removed some stale limitations we never enforced
We don’t enforce all of these limits today. For example, Free tier users can make over 10 runs per minute. We’re figuring out the right balance between signalling what we can support at scale, without adding unnecessary friction for users.
Blob Storage admin
Want to view and edit the blobs stored in your Val Town Blob Storage? Now you have two great options.
📺 Videos
Videos are a great way to learn the pro tips & tricks for Val Town. This month I live coded with three wonderful guests:
- Creating customer-enrichment workflows with Justin Duke, founder of Buttondown
- Live coding viral AI apps with with Hassan, of TogetherAI
- Prototyping Markdown Extensions with Boris Berenberg
We were also featured in three YouTube videos, which led to thousands of new subscribers. If that includes you – welcome! Thanks AICodeKing, Julian Goldie, and Emre Kabli for the videos 🙏
🎉 Other updates
- You can now view all your vals on your own profile page – even private ones – configurable via a filter – thanks Fabian for the request 🙏
- Simplified and unified buttons to edit a val’s name, type, etc – thanks Fabian for the request 🙏
- Allow cron vals to be paused but remain cron-type - thanks Jan for the request 🙏
- The ‘Recent vals’ section on your private dashboard now shows private and unlisted vals (before it only showed your public vals) – thanks Arti for the bug report 🙏
- Others’ val code is now focusable and searchable
- HTTP errors now always have stacktraces, which link directly to val source lines
- Improved val generated names and validation
- Fix our CORS headers – thanks Andreas 🙏
- Improved our Custom Domains UI and docs
- Added buttons to the val versions page to preview old versions, view their code, and delete them
- Fixed the logs, removing old traces that stalled
- Fixed cron UI bug
- Discontinued Eval API and upgraded all HTTP vals to the new concurrent runtime
- Fixed beta & structured outputs for std/openai – thanks Alfonso for the bug report 🙏
- Added a link to edit your profile photo on the profile settings page – thanks Ivan for the bug report 🙏
- Removed all browser
alert
andconfirm
in favor of proper modals - Improve import autocomplete for vals in context
- Fix log association for replayed val traces
- Button to start a Townie chat from the blue
New
button in the top-right, in the navbar - HTTP Preview Share button & modal (to make it clearer that HTTP vals are deployed and sharable) – thanks Rudd for the suggestion 🙏
- Made the Dashboard load up to 5x faster
- Made HTTP Preview iframes lazy load, so your focus won’t be stolen by a val that’s not in view – thanks Troy for the bug report 🙏
- Add Cmd+K actions for opening the focused val in the full-screen editor or in its detail page – thanks Arti for the suggestion 🙏
🛣️ Roadmap
Projects
Our biggest effort coming up is Projects - groups of vals, files, folders that will be forkable as a unit and mergeable as a unit, supporting relative imports, and more. Where a val is like a Github gist, a Project is like a Github repo. Projects will enable you to build infinitely complex real-world apps in Val Town. We’re excited to share something hopefully in Dec 2024, and if not in Jan 2025.
We shared the above screenshot of an example Projects a couple weeks back in our Discord. One of our users, [Victor], was so inspired that he’s started building larger projects in Val Town already in advance of Projects, living in the future by pretending that they already exist. His most recent large val project was NotUber, a surprisingly full-featured Uber/Lyft clone. The best part is that he built another val that acts as the ‘project view’ for the 8 vals that NotUber depends on. We love Victor’s vision, and we can’t wait to see what everyone else builds once Projects ship for real!
Scale
We’re also working on Scale – a new infra architecture that will enable you to run production workloads in Val Town, with scale to infinity, usage-based pricing, with usage alerts, and caps. Websocket-type vals will also launch with this effort.
Other features coming soon
- Val- & Project- scoped environment variables
- Searchable & filterable logs and traces
- /explore - a new page to find interesting vals
- Allow hyphens in val names
- Improved code search
- Comments on pull requests
- Ability to follow a user on Val Town
- Team accounts
- SOC2 compliance (I told you we’re growing up!)
- …and much more!
Please make feature requests and vote on what you’d like to see next.
🌟 Community vals
- Dan, an engineer at Campsite, wrote How we prototype API integrations with Val Town – it’s an excellent read about how they “speedrun prototypes of bots, features, and 3rd party integrations” (tweet)
- Max built Val Town Town – a clone of Val Town, built in Val Town! If you want to run your users’ or AI-generated server-side JavaScript, now you can do that in Val Town by forking and customizing Val Town Town
- Victor added Stripe to our docs showing how you can accept payments in Val Town in minutes
- Daniel created an app that helps industrial robot programmers visualize their program call graph
- osspledge.com’s redirect to opensourcepledge.com is hosted on Val Town (Join the pledge here!)
- In honor of Bluesky, here are all the awesome Bluesky vals:
- Dean built WinSky, a Windows XP-styled BlueSky client that you can OAuth into with your Bluesky account, make posts, etc!
- Stef built a Bluesky feed generator that subscribes to a feed of posts without the letter ‘E’, forked from @nws/feeds, forked from @jordan/feeds
- Jonas made a Bluesky bot template (original post)
- Wilhelm is mirroring his Bluesky posts. It’s easy to fork it and mirror your own posts! I did here.
- @karkowg built a beautiful Matrix-style Bluesky firehose visualization
- Wilhelm figured out how to make a val http endpoint your Bluesky handle!
- Steve created a Bluesky Firehose visualizer that displays real-time updates from the Bluesky network, with word cloud
- Robin Sloan is tracking solar storms with a cron val!
- Jan built Scribe, a SuperWhisper / Granola alternative that transcribes your voice in realtime, powered by Huggingface, VAD, and Groq
- Arti built a Farcaster Keyword Alerter, which sends Slack notifications when a keyword is mentioned on Farcaster, powered by Neynar (original post)
- Steve built a website showcasing how Val Town uses Val Town to build Val Town
- Nulo is tracking and graphing tweets and likes for President Milei of Argentina to expose bots and archive deleted tweets
- Charlie made a hilarious short-video about a tour-guide app with various intelligence levels. The app in the video was made with Townie!
- Peter built a mayor_setup, a val that gives you a bird’s eye view across all your vals, lets you organize vals into composable collections, batch actions on multiple vals, and uninstall itself with no trace left behind
- Jon built a custom Twitter Alert bot that detects when specific accounts tweet relevant phrases, and uses an LLM to decide which Discord channel to send the alert to
- Max built WIDE, a service to write and query unstructured data, powered by Clickhouse, powered by his new ValSession authentication method
- @trob built an interactive prompt-to-code app that generates JavaScript code from prompts and allows previewing the output with user input. James forked it, and made a Three.js Scene Generator to create 3D scenes by via natural language prompts. We love when people build on each other’s work!
- Dean built a peer-to-peer file transfer app using WebRTC
- Wolf built a magic importer that lets you dynamically generate functions at runtime in the import URL, powered by an HTTP val! (Discord discussion)
- “Who needs blockchain when you have Val Town SQLite?” – Jamie built Glifbux, virtual money on Val Town
- Steve built three vals to demo the insanely-fast Cerebras inference – Cerebras Searcher to search and summarize the web, Cerebras Coder to generate full websites in miliseconds, and Cerebras Debater to get to the bottom of age old questions
- SimpleScraper wrote “Building a free beach-chair detector using Simplescraper, LLMs and public webcams” powered by a cron val and @std/openai
- Dan built a What did I work on today? in 6 prompts with Townie, which pulls from Github and Linear to generate a daily summary of what you worked on (tweet)
- Juan built a D3.JS Defi pool explorer to visualize Blockchain Pool APYs
- Cam made a Tool Drawer to showcase the apps on the Techless Wisephone II
- Jonnie Hallman built a tool with Townie to extract the dominant colors from an image
- Juan built a EchoSearch, a site that lets you search across Reddit, HN, Github Discussions, StackOverflow all at the same time
- @deepfates built deeperfates.com, their AI clone
- Victor built TaylorSwiftMoments, an image generator that allows you to create visuals inspired by different Taylor Swift eras with enhanced prompts
- Steve built a Proxied Web Browser for debugging DNS records, so you can view web pages without DNS caching issues
- Jan built a Open Graph Image Generator using satori and a Deno-friendly SVG WASM, cached with Val Town Blob Storage
- Steve showed how to use OpenAI Structured Output with zod to ensure responses are in the right JSON format
- vprtwn created a typing practice app with word generation and stat tracking for the Svalboard
- Andre built a Bomb Cyclone Power Outage Tracker to help everyone estimate when power will be restored
- @g built a GitHub Line Counter that efficiently counts the lines of code in any GitHub repository from your browser, powered by a val
- @bladesquad built a React app for reporting stray cats and finding nearby emergency vet contacts in Algeria
- Max built an API to set up data to a Vercel database
- @trollishka built a AI powered gift suggestion app – with RAG powered by the Serp API
- Steve built a tool to compare the speed and output of different Anthropic models
- Michael built a val that generates an image displaying current weather information for his e-ink display
- Nico built simpletext, an implementation of the simpletext by jonfraser
- Jan built a Collaborative JSON Viewer, powered by InstantDB (tweet)
- @trob built an interactive prompt-to-code app that generates JavaScript code from prompts and allows previewing the output with user input.
- Jan built a GitHub Repository Parser to get the number of bytes and tokens in a repo (to estimate cost for sending a whole repo to an LLM)
- Tanner built a Web Page Summarizer that concisely summarizes the content of any website using OpenAI’s language model
- Regina created a Flashcard App that allows users to study with flashcards from a CSV file
- Mike created a 90s-style text analyzer that calculates word frequencies, TF-IDF scores, sentiment analysis, and generates fun facts
- Max built a Simple Wikipedia Instant Search to search Wikipedia articles with fuzzy matching and instant results.
- @janu built a passworded Bitcoin price dashboard that displays the current price, 24-hour change, and a chart of the last 30 days.
- Prasham built summarizeHn which summarizes Hacker News discussions using Gemini Models
- Daniel created a Seller Dashboard that displays real-time updates of quotes, savings, and a list of sellers with filtering and action buttons.
- Dhanush built Flighty, an API endpoint to get recent flight data
- Muhammad built a realtime image generator (tweet)
- @vip built RSS Feed AI Analysis
- Jared created Startup Clicker Game which simulates running a tech startup
- willthereader built a reminder app that lets you quickly set alarms and timers, and sends web notifications
- Prasham built a Prompt Token Counter for Anthropic and Google Gemini models
- Steve built The Password Game, a web app that generates increasingly silly password requirements using AI with Cerebras
- @all built jamz, a music player app that lets you add songs, edit their details, and sort them by date or title
- @janu built airSource, which generates an SVG displaying real-time air quality data for major Australian cities
- @torlanco built Shirtgen, an app that lets you generate AI-powered t-shirt designs
- Jared built a Leadership Styles Inventory quiz to assess your leadership tendencies
- @d17e created a QR code generator that returns an SVG of a plottable QR code from a given value and configuration
- @spinningideas built an AI Interview Assistant that lets you practice job interviews with an AI interviewer
- Grant built a script to toggle AWS EventBridge rules
- @gigmx built a link-in-bio featuring a Cheshire Cat AI chat widget and social links
- Alfonso built an Ethereum Address Generator to generate test Ethereum addresses and private keys client-side, embedded in the Crossmint docs
- @all built an interactive code editor powered by Cerebras that generates HTML, CSS, and JavaScript based on natural language prompts.
- @all built savvyPurpleSpoonbill, an interactive code editor powered by Cerebras AI that generates HTML, CSS, and JavaScript code based on user prompts
- @willow built an HTML to Markdown Converter that supports tables and links
- @jidun created Ms_Spangler, an AI tutor specializing in the Texas junior high curriculum that provides grade-appropriate academic support while fostering critical thinking and real-world applications
- @zlpkhr built a neighborhood order app where users can propose group orders and others can sign up.
- Nick built a guided breathing instructions app with techniques like 4-7-8 Breathing, Box Breathing, and Alternate Nostril Breathing to help manage stress and promote relaxation
- @tk120404 built a 3D visualization of our solar system, complete with rotating planets, moons, meteor trails, and a starry background
- Steve built a middleware usageAlert that sends an email alert if your HTTP val exceeds 1k requests per minute
- @mashimi built an Insect Identifier that recognizes insects from uploaded images using the Grok.AI API
- Will made an AI-powered Safari extension, powered by a val for the backend
- Natalie built a todo list app for learning Node.js with expandable sub-topics and progress tracking
- @minhee built a single file implementation of ActivityPub using Fedify, allowing your fediverse account to follow and be followed back by a demo account
- @meta built a page displaying color schemes used by major news media outlets for US election map visualizations
- Jan built a Counter - an all-in-one word, byte, and token counter that saves results to browser history
- Victor built a Solana Pay QR Code Generator that allows merchants to generate QR codes for accepting Solana payments
- Jesi built a Secret Santa group creator app that allows participants to join and be randomly matched while excluding certain pairings (tweet)
- Ben Wheeler built a social media share link generator in 5 min with Townie
- Prasham built a Markdown to Rich Text Converter to paste reports from AI into Confluence or other systems which use rich text
- Ash built put his record collection online
- Will built a Thank You Note Generator that generates personalized thank you notes for any occasion
- Max built a beautiful Draggable Emoji Garden that lets you drag and drop emojis to create a garden
- Gueejla built a Square Root Calculator that visualizes the square root of a number