[HN Gopher] Zerocal - A Serverless Calendar App in Rust ___________________________________________________________________ Zerocal - A Serverless Calendar App in Rust Author : omn1 Score : 103 points Date : 2022-10-06 15:28 UTC (7 hours ago) (HTM) web link (endler.dev) (TXT) w3m dump (endler.dev) | clircle wrote: | I'm wondering if this or a similar tool could be hooked into | emacs to make working with calendars in emacs a bit easier. I | don't think there is a good way to send calendar invites to | people from emacs (but happy to be wrong on this one). | tuukkah wrote: | As seen in the article, the invites are simple text files. (I | haven't tried, but you might be able to create one with | icalendar-export-region?) | | I think the more difficult part is sending an email that looks | and works right with the invite attached in a way compatible | with the receiving systems. | | Invitations from Microsoft systems are especially horrible as | they look like normal, plain text messages (without an invite) | in standards-compliant systems. Depending how the sender | expresses themselves, the receiver might have no clue they were | invited let alone the time and place. | [deleted] | longrod wrote: | Looks cool but...why not just send the .ics file directly via | your IM of choice? Am I missing something here? I don't see the | benefit if you still have to click, open file in your calendar, | add it to the calendar. | | Can you tell me why the above wouldn't work and why this is | better? | omn1 wrote: | You could do that but you'd have to create the ics file | manually and not every platform allows you to share ics files. | My original use-case was Github. Wanted to share invites for | https://github.com/hello-rust/community. Github prevents | sharing ics. Another thing is that people could edit a link in- | place to e.g. update the time without creating a new file. | jacob019 wrote: | Speaking of zerocal, have you ever noticed that low calorie | packaged foods like pickles and cauliflower will put tiny serving | sizes on the package so they can advertise 0 calories? I think | they round down to zero when it's less than 5 calories. | EmbeddedHash wrote: | Yep. Another suspect of this is cooking oil spray, like Pam. | They can advertise very low calories, usually 0, per serving | but a serving is considered like 1/3 of a second spray. | tuukkah wrote: | > I wanted a way to create calendar entries from my terminal. | | > There is no state on the server, it just generates a calendar | event on the fly and returns it. | | Didn't see _that_ coming. I suppose it 's handy that you can call | it anywhere curl is installed (or even use the browser address | bar as your command line) instead of having to install and run | the Rust program locally. | spdustin wrote: | I want to make sure I understand this: | | You made a VCALENDAR generator with a web-accessible endpoint. It | fills in the VCALENDAR with info passed in via URL parameters. | And rather than returning a webpage, it just returns the | VCALENDAR file. | | So you send your friends the link, they click it, rather then | returning text/html content, it returns a downloadable response | consisting of a pre-filled VCALENDAR file with the correct MIME | type, and .ics extension. | | Do I have that right? | omn1 wrote: | That's correct. | EGreg wrote: | Sorry but how is it serverless? Is it a static HTML file with | JS that does the job? Isn't there a server that the request | goes to? | omn1 wrote: | Good question. It depends on your definition of serverless. | Strictly speaking there is no serverless, there's always | some infrastructure somewhere. | | However the calendar file gets created out of thin air from | the GET parameters alone. There is no state or storage | involved. Other calendar apps have a backend with a DB; | this one doesn't. Now whether that counts as truly | serverless is up to you I guess. It's as close as you could | get with a calendar I'd say. Not easy to get the point | across in a title. ;) Hope that helps. | actuallyalys wrote: | "Stateless" is probably clearer. "Serverless" usually | refers to services from cloud providers where your code | is run on demand rather than having a server that is | idling around (to use a sibling comment's phrase). I | don't really care for "serverless" as a term because | there are still servers (as you point out) and there are | other architectures and cloud services that seem equally | serverless that aren't usually called that. | jethro_tell wrote: | serverless is when you save the state but don't keep a | machine sitting around when there are no requests, so | you'd keep your calendar state in a hosted db and when | someone asks for the calendar, a thread spins up and | creates the calendar from the state and then disappears | until there is another request. This is basically the | exact opposite of serverless | rustyminnow wrote: | > serverless is when you [...] don't keep a machine | sitting around when there are no requests | | FTFY | | The key part of serverless is that you don't have a | server idling around. Whether or not you use a hosted db | is not relevant. | outworlder wrote: | And you may even use some 'serverless' DB services. Or | not. The app is still serverless. | drexlspivey wrote: | This can easily run on Cloudflare workers, you don't even | need a server | jcelerier wrote: | ... what do you think those are | adamrezich wrote: | this thread is making me feel like I'm going crazy | aliqot wrote: | Mmm yes, this one reminds me of the microservices debacle | from a few years ago about when does your monolith | technically become a microservice. I can't find the link, | but I think we were unable to clearly define at which | point your monolith has become a true 'SoA' microservice | beast. | [deleted] | aaaaaaaaaaab wrote: | Do you even need a service for this? Couldn't this be a simple | static HTML + minimal JS that opens a base64 URL with content- | type "text/x-vcalendar"? | omn1 wrote: | Not sure I understand because that's what it is basically. | The Rust part is just for the routing; it decides whether to | serve the form or the generated calendar file. | resoluteteeth wrote: | What they mean is that instead of using "serverless" | hosting running a rust program to generate ics files you | could literally just have a statically hosted html file | that uses a couple lines of javascript to generate the ics | files within the browser, so there would be no rust or | server component at all. | | You could just host it with github pages. | | Actually I'm confused why you're saying: | | > The Rust part is just for the routing | | Because it appears that you're generating the ics files in | rust? | omn1 wrote: | Got it. The generator logic is in Rust yes. I could have | written it in JavaScript as well but it was just easier | for me to do that part in Rust. Should have mentioned | that. Of course you could host a static HTML with JS on | Github pages, but Github pages also runs on a server. So | to answer the original question, yes you do need some | server for it unless you make it a command line app. | aaaaaaaaaaab wrote: | You can serve a static HTML page from anywhere. GitHub | pages, S3, maybe even Dropbox. Running a Rust binary is | an order of magnitude more complex than that. | ipaddr wrote: | You need a browser and a file. In your example you need a | server to make the file and and a browser. | omn1 wrote: | True, but for others to resolve the calendar entries | you'd need to serve that file somewhere. | [deleted] | omn1 wrote: | Author here, had a lot of fun building this as it's just ~100 | lines of Rust code + some CSS/HTML. If someone is looking for a | fun thing to contribute to during Hacktoberfest, the code is on | Github: https://github.com/mre/zerocal Will mainly use it for | myself to send out event links to friends. | schemescape wrote: | FYI: the text on your blog post is cropped on my small screen | (iPhone SE), and scrolling doesn't even help, so its | essentially unreadable. | omn1 wrote: | Thanks for the info. I thought I fixed that lately [1]. I | don't have an iPhone to test it with but I'll see what I can | do. | | At least on the Chrome viewport emulator it looks fine to | me... | | https://github.com/mre/endler.dev/commit/bc1187d290d153455b0. | .. | yewenjie wrote: | Can it be self-hosted without relying on shuttle.rs? If yes, | could you please update the readme with instructions? | omn1 wrote: | It's just Rust, so it can be. Will add a `main.rs` and some | instructions, but PRs are welcome if someone beats me to it. | ;) https://github.com/mre/zerocal/issues/9 | omn1 wrote: | Update: self-hosting works now. Added instructions to the | docs. Have fun. | belkarx wrote: | The process for making webapps in Rust seems extremely clean | compared to other languages (or maybe I'm not exposed enough but | I remember making things with Golang and even just JS was | _torture_ with common hosting solutions). Props to shuttle.rs and | the Rust community! | tomcam wrote: | > I remember making things with Golang... was torture with | common hosting solutions) | | What made it difficult to deploy Go apps? | belkarx wrote: | I did it around 2 years ago: the web solutions were not very | mature and it was poorly supported (but that's my subjective | experience) | aliqot wrote: | What solutions were you using? | simlevesque wrote: | I beg you to keep GET requests idempotent. It's not that hard. | fny wrote: | Don't be a party pooper. This is just RPC via HTTP. ;) | ibotty wrote: | Maybe I am missing something, but which GET is not idempotent? | 10000truths wrote: | There's no state maintained on the server, so all requests made | to it are idempotent. ___________________________________________________________________ (page generated 2022-10-06 23:00 UTC)