Show HN: Brolly, a plain-text weather forecast site
Posted by jsax 2 days ago
The UK MET office recently redesigned their site, adding a lot of additional whitespace, scrolling, and animations. This significantly reduced its usability for me, and left me wanting an ‘at a glance’ weather site.
I made https://brolly.sh, a minimalist, plain text weather forecasting site. You can use it to view weather from around the world, with: 7 day forecast; Previous day log (so you can confirm it definitely was cooler / hotter / wetter / drier yesterday!); Hourly rain, wind, temperature, conditions; Hourly UV, air quality and pollen, including pollen type specific forecasts within the EU / UK; Location search and last 5 locations; Location specific units.
I mostly made the site for myself, if anyone else also benefits from it that’s an added advantage.
You can check out the weather in York, UK at https://brolly.sh/forecast/RWFP2qW8, or search for a location at https://brolly.sh
The site is deliberately styled as a single long scrollable column, to work on mobile phones. You can view it on desktop too, there's just a lot of horizontal padding. I naturally took a lot of inspiration from plaintextsports.com. Despite not being a sports fan, I love its aesthetic. But, you'll hopefully see that this site isn't a rip off, and has its own deliberate look and feel.
Visualisations are really important to showing information at a glance. I spent a lot of time designing the different visualisations and making them work with only characters. My favourite is the hourly heat map used for pollen count.
It's also frustrating to have an interactive site, where you can't share a page with a friend and have them see what you're seeing. To solve this, all page state (i.e. location, selected day, expanded / collapsed sections), is stored in the URL. You can share or bookmark the specific view, and know that you'll always be able to come back to it.
The site uses PocketBase. It’s written in Go and plain HTML/JavaScript/CSS. All pages are backend rendered, with light JavaScript to handle re-loading content without page jumps when using interactive features like next / previous day navigation. Weather forecasts are fetched from open-meteo.com, which has a very generous free tier. However, I also built a custom LRU cache on top of PocketBase’s SQLite DB to cache forecasts for 5 minutes, and avoid putting unnecessary pressure on the open-meteo API.
Comments
Comment by jonahx 1 day ago
Comment by jsax 1 day ago
I’ll take a look though at whether there’s anything causing fundamental slowness in the cache read / page rendering pipeline.
Comment by jonahx 1 day ago
Comment by jsax 1 day ago
Comment by hahahaa 1 day ago
I recommend run Google Lighthouse for a single visitor view of perf and then use a load testing tool (locust, jmeter etc. to check load handling)
If you want to that is :)
Comment by winrid 1 day ago
Comment by bigmattystyles 1 day ago
Comment by speerer 1 day ago
Comment by jsax 1 day ago
Comment by trollbridge 1 day ago
w3m -4 -dump https://brolly.sh/forecast/RWFP2qW8
Ideally, you would let someone set an Accept: content type of text/plain, or else have an endpoint like brolly.sh/forecast/RWFP2qW8.txtComment by O1111OOO 1 day ago
printf 'weather:85334\r\n' | nc bbs.airandwave.net 79
More info:
printf 'weather\r\n' | nc bbs.airandwave.net 79
Comment by trollbridge 1 day ago
finger weather:85534@bbs.airandwave.netComment by wyclif 1 day ago
Comment by hliyan 1 day ago
Comment by jsax 1 day ago
OOI, would you expect the output to include a single days weather (like the site does now), multiple, or options for both?
Comment by smnscu 1 day ago
Comment by simonjgreen 1 day ago
Comment by NeuroDoc 16 hours ago
It's great to see that there's still a use for plain-text weather!
Comment by bluebarbet 1 day ago
Comment by m_walden 13 hours ago
Comment by firasd 1 day ago
This output is incidentally perfectly context engineered for LLMs too; I pasted the Delhi page contents into Arena .ai and asked "what's the gist" and qwen3.6-plus said (among other things) " A hot, humid day with a slight chance of afternoon showers." and gemini-3.1-pro-preview said "Mostly clear, but hot and very humid. While the actual high is 34°C, it will feel like 42°C in the afternoon."
Comment by andrepd 1 day ago
Comment by Leftium 1 day ago
They have the only weather API I know of that can get both forecast and historical weather with just a single call[2]
I use Open Meteo for most of the data for https://weather-sense.leftium.com
(If you configure a single constant[3], you can get the max 90 days of historical data with the forecast!)
[1]: https://open-meteo.com/en/docs/historical-weather-api
[2]: https://open-meteo.com/en/docs
[3]: https://github.com/Leftium/weather-sense/blob/fefecb05974065...
Comment by kachnuv_ocasek 1 day ago
Comment by raajg 1 day ago
Still beautiful though!
Comment by goodmythical 1 day ago
Comment by wormpilled 1 day ago
Comment by 8ig8 1 day ago
Comment by jsax 1 day ago
Comment by terraputix 1 day ago
Comment by Pikamander2 1 day ago
It would also be nice if it suggested results before you finished typing. For example, if I've typed out "orl", then Orlando should be the top suggested result.
Comment by jen20 1 day ago
Comment by oybng 1 day ago
Seems that sunrise/sunset are missing
Comment by DANmode 1 day ago
I know a few cases for why you would, just not with any regularity.
Comment by comradesmith 1 day ago
I'll try using this as my go to over the next week :) thank you for making this.
Comment by bthallplz 1 day ago
I also greatly appreciate getting to see the past few days' history for my location - too many weather sites are only really forward-looking, and I sometimes want to compare to a prior day when the current day feels different somehow.
Comment by Leftium 1 day ago
I thought my https://weather-sense.leftium.com was the only current app to do this.
I wrote about this over a decade ago: https://blog.leftium.com/2013/12/how-to-display-temperature-...
Comment by gregsadetsky 1 day ago
Very small suggestion: it’d be cool if you used a service to geoip the incoming ip address - there’s also https://developers.cloudflare.com/network/ip-geolocation/ that will inject the lat lng directly into the request header to your server
It’d just help set a good enough starting location.
Cheers!
Comment by hogwasher 1 day ago
And since you can bookmark it with your location setting, automatic IP location could only make the first visit marginally faster for non-VPN users, anyway
Comment by Contortion 1 day ago
Still, great project! Definitely fulfils my desire for minimalism in all things.
Comment by jsax 1 day ago
The short code in the URL is generated at search time, and maps to a location name, lat/long, altitude etc. within a table. It’s generated off of the location name, so two people searching for the same place get the same short code.
The short code enables a forecast lookup to be a SQLite DB read, followed by a single API call for the forecast.
A more descriptive URL would have required two sequential calls - one to figure out the lat/long and/or place name, and another for the forecast. This wasn’t a huge speed problem, but I struggled to find geocoding APIs with generous free tiers or reasonable low volume pricing. It would have also made the forecast at a given URL somewhat non-deterministic, as the geocoding API could change its output or preferred result over time.
Short codes quite possibly wasn’t the right solution. It’s definitely something I’ll think more about. Thank you!
Comment by Svip 1 day ago
Comment by echoangle 1 day ago
Comment by esseph 1 day ago
Comment by echoangle 1 day ago
Situation a: Someone searches for location XYZ. The geocoding API returns lat and Lon and canonical name ABC. You save that and the slugified name abc in your DB. (If the API doesn’t return a name, you can use XYZ instead of ABC). You return slug abc to the user.
Situation b: Someone requests weather for location at slug abc. You look in your DB, ask the weather API for the weather at lat/lon and return that to the user.
Situation c: Someone searches for a place that happens to already exist in the DB. You geocode the search term and get a lat/lon pair that’s already in the DB so you return the saved slug.
How is that different than using a shortcode? In which situation are you doing a geocoding API request you don’t need to do with the current system?
Comment by devindotcom 1 day ago
Comment by jsax 1 day ago
I agree, it’s definitely something to work on as it takes up a considerable amount of vertical space.
I found the precipitation chart challenging as you need to present both the forecasted precipitation, and the potential likelihood of the precipitation occurring. Something I’ve considered is using a horizontal graph with different shades of grey through black in each bar to represent the probability, but it would somewhat reduce accessibility.
Comment by Leftium 1 day ago
My https://weather-sense.leftium.com also uses open-meteo for weather data. And I've been comparing how precipitation amount/chance forecasts compare to real life experience.
Look at how vastly different the precipitation chance and amount were for Seoul the past few days: https://weather-sense.leftium.com/?n=seoul According to the chance, it was raining non-stop 48+ hours. The precipitation bars give a much better idea when actual precipitation occurred.
Comment by goodmythical 1 day ago
Comment by tim333 1 day ago
Comment by vatsel 1 day ago
London UK is currently 'forecast/zRKY7wMc' you could label all population centres >100k like 'forecast/uk-london', 'forecast/cn-london', etc
Comment by karteum 1 day ago
Comment by SaltyAstronaut 1 day ago
Comment by winterscott 1 day ago
Structured, concise weather information without unnecessary UI noise is much easier for agents to parse and summarize.
A JSON endpoint or an MCP server on top of this would be an interesting extension.
Comment by efilife 1 day ago
Comment by walthamstow 1 day ago
Comment by jsax 1 day ago
Open-meteo has a very generous free tier, and reasonable pricing. It also lets you fetch weather from previous days, which I’ve included so you can see if it’s relatively hotter/colder etc. than yesterday.
Comment by leetrout 1 day ago
Comment by Gualdrapo 1 day ago
Comment by dash2 1 day ago
Comment by ji_reilly 1 day ago
Comment by simonjgreen 1 day ago
Also, wanted to note I appreciate your stance on AI:
> I manually designed the site, defined its architecture, structure etc.
> I have however used AI to implement significant portions, whilst keeping the most interesting bits to work on myself.
> I have mixed feelings about AI. I wouldn't have had the time to build this site without it, and use it heavily in my day job to improve velocity. But, there are also points where I deliberately avoid using it, either to keep the joy of focusing on a problem, or to make sure I'm not accidentally AI 'doom scrolling' my way through life. Everything is a balance.
Comment by jsax 1 day ago
Comment by bl4kers 1 day ago
Comment by leonpillow 1 day ago
Comment by jsax 1 day ago
Comment by weatherphan 1 day ago
Use-cases will vary widely. For example if I used Brolly for sailing, I'd want wind speed in kts and wind direction as well as dew point, and I'd want a recent timeseries of air pressure to give an idea of the synoptic-scale situation.
Of course these may be far outside your original use-cases. I think when people get a hold of Brolly, they're going to love it immediately, and there will be a flood of feature requests. If that happens, might be good to design the layers needed for diverse customization.
Comment by jsax 1 day ago
I’m starting to think about dedicated sub pages that cover these use cases, with a single section on the main page that links into it. A sailing based page could definitely work here!
Comment by Leftium 1 day ago
Unfortunately open-meteo doesn't offer this.
So https://weather-sense.leftium.com uses the 60-min forecast from OpenWeather. But you have to specifically request it because the free-tier quota is not as generous. (I think Apple's WeatherKit may also offer this data, but I was unable to get WeatherKit to work at all)
---
After that, the wind is important for people who like outdoor activities. For example, Kayak rentals are paused when it gets too windy. On the other hand, kite boarders like it when it's windier.
Comment by weatherphan 1 day ago
Even within a niche category like sailing there's a wide range of user needs, for example reporting temperatures in C vs F, or pressure in hPa vs inHg.
Coming from another angle, would it be possible to URL-encode user preferences, so that everyone gets their own bespoke Brolly forecast? There can still be prefab pages for common situations, so that informal and power users are all delighted.
(edit: format)
Comment by johnthescott 1 day ago
Comment by benj111 1 day ago
Comment by jsax 1 day ago
Comment by Imustaskforhelp 1 day ago
I really love Golang minimalist applications using sqlite. The whole architecture feels really elegant to me personally. I wish you luck for this project and if I may ask, is the project open source, I really love its UI :) ,it feels so cool!
Comment by popalchemist 1 day ago
Comment by saberience 1 day ago
Comment by mattjhall 1 day ago
Comment by sssilver 1 day ago
Can we have METARs for airport codes in this exact aesthetic?
Comment by syngrog66 1 day ago
Comment by Studui81Labs 3 hours ago
Comment by Studui81Labs 1 day ago
Comment by lowkeyokay 1 day ago
Comment by huseyinl 21 hours ago