[HN Gopher] Show HN: Redbean - Single-file distributable web server
       ___________________________________________________________________
        
       Show HN: Redbean - Single-file distributable web server
        
       Author : jart
       Score  : 1388 points
       Date   : 2021-02-26 03:33 UTC (19 hours ago)
        
 (HTM) web link (justine.lol)
 (TXT) w3m dump (justine.lol)
        
       | unwiredben wrote:
       | Alas, I wanted to try this out, but the format shenanigans
       | triggered the Sophos "machine-learning"-based threat detection on
       | my Windows laptop in mid-download.
        
       | raphaelj wrote:
       | The amount of work that went to this is insane. She made a (full
       | ?) implementation of libc:
       | https://github.com/jart/cosmopolitan/tree/master/libc
        
       | phkahler wrote:
       | Can it be extended in a way similar to CGI back in the day? I
       | would just want to compile it with the CGI program rather than
       | expect it to dynamically load.
        
       | hprx wrote:
       | I just spent 30 minutes reading about this. I'm so shocked that
       | I'm logging in to comment after 5 years of lurking.
       | 
       | Justine has built a c library that allows you compile a binary
       | once and have it run it on any os or baremetal. The SAME binary.
       | Quite frankly, that sentence doesn't even make sense to me.
       | 
       | Check out
       | https://storage.googleapis.com/justine/cosmopolitan/index.ht...
       | 
       | As far as I'm concerned, this is literal magic. Look at the magic
       | numbers:
       | https://github.com/jart/cosmopolitan/blob/37a4c70c3634862d8d...
       | 
       | I could go on, but there's no binary portability comparison with
       | any other language. And she has made some pretty neat
       | optimizations.
       | 
       | Back in the day, I saw some pretty neat stuff with the ELF
       | format, but this takes the cake.
       | 
       | Wow.
       | 
       | Edit: I'm editing because this is just so bloody absurd.
       | 
       | https://storage.googleapis.com/justine/printimage.html
       | 
       | $ ./printimage.com someimage.jpg
       | 
       | Like wow. And also video.
       | 
       | https://storage.googleapis.com/justine/printvideo.html
       | 
       | I'm struggling to put my shock into words. I've been around.
       | 
       | There's engineering. There's academia.
       | 
       | But this falls into straight-up wizardry.
        
         | ghoomketu wrote:
         | I really don't understand internals ibut I've often downloaded
         | cygwin exe file for commands like grep, tail, etc.. Are you
         | telling me that is no longer required?
        
           | hprx wrote:
           | On linux, I downloaded the printvideo binary and played a
           | friggin crab video on my terminal after just a chmod. I don't
           | have any other OS to confirm, but it sure looks like it if
           | someone compiles/links coreutils against this.
        
         | [deleted]
        
         | matheusmoreira wrote:
         | Wow, that cosmopolitan C library is absolutely awesome. The ABI
         | specialization is extremely interesting. Never seen anything
         | like that before. I thought compilers did that. I don't
         | understand why they couldn't properly optimize memcpy.
         | 
         | I wonder how it handles system calls. Let me check the
         | source...
         | 
         | https://github.com/jart/cosmopolitan/blob/master/tool/build/...
         | 
         | https://github.com/jart/cosmopolitan/blob/master/tool/build/...
         | 
         | > void OpSyscall(struct Machine *, uint32_t);
         | 
         | Pretty interesting... Need some time to figure out how it
         | works.
         | 
         | The system call entry points:
         | 
         | https://github.com/jart/cosmopolitan/blob/master/libc/sysv/s...
         | 
         | https://github.com/jart/cosmopolitan/blob/master/libc/sysv/s...
         | 
         | It uses a jump slot technique which is interesting:
         | 
         | https://github.com/jart/cosmopolitan/blob/master/libc/sysv/m...
         | 
         | System call numbers:
         | 
         | https://github.com/jart/cosmopolitan/blob/master/libc/sysv/c...
         | 
         | https://github.com/jart/cosmopolitan/blob/master/libc/sysv/s...
         | 
         | Looks like it packs the system call numbers of all operating
         | systems into a single constant.
         | 
         | For some reason there are some dedicated implementations of
         | Linux system calls using inline assembly rather than the entry
         | point:
         | 
         | https://github.com/jart/cosmopolitan/tree/master/libc/linux
         | 
         | More related files:
         | 
         | https://github.com/jart/cosmopolitan/blob/master/libc/calls/...
         | 
         | https://github.com/jart/cosmopolitan/blob/master/libc/calls/...
         | 
         | Also funny how it calls Linux "GNU/Systemd"!
        
         | TeMPOraL wrote:
         | Agreed. This single sentence at the end of actually pdrtable
         | executable page:
         | 
         | > _I believe the best chance we have of doing that [writing
         | software that stands the test of time with minimal toil], is by
         | gluing together the binary interfaces that 've already achieved
         | a decades-long consensus, and ignoring the APIs._
         | 
         | ...it's a kind of thought I don't think I could ever come up
         | with. Mind blown.
        
           | JesseMeyer wrote:
           | You go to war with the army you have.
        
         | malux85 wrote:
         | I agree, I got to the page on actually portable executable, and
         | had to read it a few times to make sure I was grokking it
         | properly. This is just sheer cleverness, THIS is the stuff that
         | should be on hacker news!
        
           | hprx wrote:
           | For real.
           | 
           | It's hard to grok cause there are no words to describe it.
           | 
           | When people say that something is cross-platform, they
           | usually mean a) that the software will build on multiple
           | platforms b) there is some sort of vm which runs the
           | executable (jvm, beam, wasm)
           | 
           | This is the SAME binary. Running everywhere. Could be super-
           | useful as an archival format for mission critical code.
           | sqlite comes to mind.
           | 
           | Maybe it's late at night, but I'm struggling to find a
           | suitable word for the project that is better than portable or
           | cross-platform.
           | 
           | Literally, I can't find a better word than the project name -
           | " _actually portable_ executable. "
           | 
           | @author - if you're reading this please set up something for
           | a few bucks a month on your github sponsors. I don't think I
           | have any use for the library, but this is so outrageous it
           | deserves something more than imaginary internet points.
        
             | jart wrote:
             | Author here. Thanks! I've added a new sponsor tier per your
             | request. https://github.com/sponsors/jart
        
               | ActorNightly wrote:
               | Do you have a direct paypall? Im not a fan of
               | subscription services but Id like to support this.
        
               | jart wrote:
               | I do indeed have PayPal: jtunney@gmail.com Thank you for
               | your support!
        
           | akalsz wrote:
           | > THIS is the stuff that should be on hacker news!
           | 
           | If interested, see previous discussions of APE:
           | 
           | https://news.ycombinator.com/item?id=24256883
           | 
           | https://news.ycombinator.com/item?id=25556286
        
             | alisonatwork wrote:
             | Thanks for the links. The discussion on the first one is
             | interesting, it wasn't clear to me from the original doc
             | that the UNIX version needs to overwrite itself to get to
             | the ELF header. That's a bit unfortunate, because it means
             | you can't share the program again after you ran it the
             | first time on BSD or Linux. Still very clever, though. I
             | imagine there could be a "repackage for distribution"
             | switch added to put the MZ header back again.
        
               | jart wrote:
               | I did the research and what we've accomplished here,
               | while imperfect, is the best of all worlds solution. I
               | like to think of it as an installer that takes a few
               | microseconds, because it only needs to change 64 bytes.
               | I've been considering adding a CLI flag where you can say
               | ./foo.com --restore and it'll put the original 64 byte
               | header back in place. Perhaps one day we can change the
               | Linux, BSD, and XNU kernels so they can recognize the APE
               | executable format. But until that happens we've got a
               | great shell script hack that's now required by POSIX
               | which is exceedingly fast and works on pretty much all
               | systems stretching back decades.
        
         | lambda_obrien wrote:
         | Strong agree; someone needs to give her like a million dollars
         | a year salary and unlimited resources to explore whatever she
         | wants for life, just to see what she comes up with.
        
         | skrebbel wrote:
         | Everything she does has this level of jaw-dropping amazingness.
         | Between her and Fabrice Bellard i don't know many people who
         | consistently get my chin to hit the table.
         | 
         | I hope that Cosmopolitan becomes mainstream, so much more
         | software could have that It Just Works quality.
        
           | ksec wrote:
           | Mike Pall for LuaJIT
        
           | sneak wrote:
           | "Jaw-dropping" is definitely a term I'd use to describe some
           | of her more infamous tweets and blog posts, too.
        
             | dang wrote:
             | Please don't do this here. Resisting extrinsic provocation
             | is key to thread quality.
        
         | Proven wrote:
         | That malware for OS X that does nothing (so far) from the news
         | earlier this week also has one multi-arch binary for all modern
         | Apple notebook architectures (AMD64 and ARM64)
        
         | alisonatwork wrote:
         | Agreed, this is the best programming-related thing I've seen on
         | the internet in a long time. It reminds me of when I was a
         | teenager, excited to become a computer programmer. Then I grew
         | up and joined the real world workforce and it was all far less
         | exciting than I imagined.
         | 
         | The coolest thing about this Actually Portable Executable is
         | that once there's a compiler and linker built with it, I can
         | play around with writing C on Windows without having to faff
         | about with WSL or MinGW or learning what makes MSVC different
         | from the C I learned in university and coded in my first job
         | before I became a Java/JavaScript/Python/etc programmer. When I
         | discovered Go I thought I had discovered the better C that just
         | worked everywhere, but the idea of having plain old C that also
         | just works everywhere is very appealing.
        
           | Abishek_Muthian wrote:
           | I like Go for the same reason, but I have an irrational fear
           | that someday I might be in a life or death situation and
           | should program my way out using a bare bones computer without
           | Internet; So I keep tabs on C occasionally.
           | 
           | actually pdrtable executable has now piqued my interest, So I
           | might actually indulge in C programming for fun _again_ after
           | all. Thanks Justine.
        
         | lenkite wrote:
         | Will this work if your code uses the C++ standard library ? Or
         | is this just for pure C ?
        
           | ZiiS wrote:
           | The are a few options but all require some effort
           | https://github.com/jart/cosmopolitan/issues/27
        
       | [deleted]
        
       | Hasz wrote:
       | This is bonkers amazing!
       | 
       | I love the reference to the Swedish Rhapsody numbers station at
       | the end of consts.sh
        
       | safeaim wrote:
       | Am I the only one having issues trying to get this working? The
       | webserver starts just fine, but once I add the index.html with
       | zip as in the example, it stops working. This is on Mac 10.15,
       | CentOS 8 and Ubuntu 18.04 LTS.
       | 
       | Centos: [centos@test ~]$ ./redbean.com -vv                 error:
       | Uncaught SIGSEGV on test.novalocal       ./redbean.com
       | EINVAL/err=22/errno:2/GetLastError:0       Linux test.novalocal
       | 4.18.0-240.10.1.el8_3.x86_64 #1 SMP        Mon Jan 18 17:05:51
       | UTC 2021
       | 
       | On the mac: ~ my-Maccie$./redbean.com -vv Killed: 9
       | 
       | On Ubuntu: ubuntu@localhost:~$ ./redbean.com -vv
       | error: Uncaught SIGSEGV on localhost       ./redbean.com
       | EINVAL/err=22/errno:2/GetLastError:0       Linux localhost
       | 4.15.0-136-generic #140-Ubuntu SMP Thu Jan        28 05:20:47 UTC
       | 2021
        
         | zimpenfish wrote:
         | IIRC, from vague memories of things flying past, Big Sur won't
         | let a modified binary run once it's been checked by Gatekeeper.
         | Which means the first run gets checked and notarised but when
         | you add the `index.html`, the on-disk binary has changed and
         | Gatekeeper won't allow it to run - I guess it's to prevent
         | malicious code modifications, etc.
        
           | anderspitman wrote:
           | Thank goodness AAPL is here to protect us from doing cool
           | stuff.
        
           | oscargrouch wrote:
           | Its good from a security perspective, but also its a
           | nightmare to know that the mothership knows everything you
           | run on your machine.
           | 
           | This will also prevent distribution from outside of their
           | appstore giving it will prevent updates.
           | 
           | So as anything Apple, the world security here is being used
           | as code for personal machines remotely controlled by the
           | mothership.
           | 
           | You trade privacy and freedoms for a little convenience.
        
           | safeaim wrote:
           | Yeah, but this isn't Big Sur, it's Catalina. But maybe it's
           | the same protection there as well?
           | 
           | The binary didn't work on Ubuntu 18.04 nor CentOS8 either,
           | but I'll report a issue later on today.
        
           | jart wrote:
           | Oh wow that's good to know. Maybe you have to do something
           | like `cat foo.com >foo2.com` after you've modified it with
           | the zip tool.
        
         | r0b05 wrote:
         | After adding a new file with WinRAR, I get:
         | 
         | EINVAL/err=87/errno:2/GetLastError:203 The parameter is
         | incorrect.
         | 
         | Probably the ZIP needs to be saved in a certain format.
        
           | jart wrote:
           | Author here. The zip shouldn't need to be saved in any
           | special format. If WinRAR is posing problems then please file
           | an issue because I'd like to fix that. That error doesn't
           | seem like something that would indicate executable
           | corruption. I want to learn more.
        
             | adontz wrote:
             | IDK if this is enough
             | 
             | https://pastebin.com/8RyPWQFf
        
             | r0b05 wrote:
             | Sure thing, will provide as much info as possible.
        
             | xPaw wrote:
             | I tried to add a file using Windows file explorer, but it
             | just complains "The Compressed (zipped) Folder is invalid
             | or corrupted."
             | 
             | This is on Windows 10 19042 build.
             | 
             | 7-Zip doesn't even see the folders for that matter.
        
             | user-the-name wrote:
             | Have to say though, using zip so you can reuse the
             | compression is quite a masterstroke.
        
         | jart wrote:
         | Author here. It works fine on RHEL5 / CentOs5 for me. I can
         | also confirm RHEL7. Please file an issue. What will help in
         | particular is if you can give me the faulting RIP address. That
         | should be in the crash report or in your dmesg log.
        
         | TeddyDD wrote:
         | No, I have the same issue on Linux Mint 20.1
        
         | lemniscare wrote:
         | Yeah another killed: 9 on Mac BigSur. Could you export the tool
         | in a way that we don't have to zip new files into it? Instead
         | we would have to gcc the whole thing once and be done with it.
        
         | tromp wrote:
         | Same here on MacOS Catalina 10.15.7. The original invocation
         | runs fine                   $ bash -c './redbean.com -vv'
         | W2021-02-26T01:50:12.665277:tool/net/redbean.c:1144:redbean:330
         | 2] setsockopt(server, IPPROTO_TCP, TCP_FASTOPEN, &yes,
         | sizeof(yes)) - EINVAL/err=22/errno:22/GetLastError:0         W
         | --------------------
         | 000015:tool/net/redbean.c:1145:redbean:3302] setsockopt(server,
         | IPPROTO_TCP, TCP_QUICKACK, &yes, sizeof(yes)) -
         | ENOPROTOOPT/err=42/errno:42/GetLastError:0         V
         | --------------------
         | 000022:tool/net/redbean.c:1166:redbean:3302] 0.0.0.0:8080
         | listen
         | 
         | Visiting http://127.0.0.1:8080/ in my web browser shows a nice
         | redbean page with lobster graphic at
         | http://127.0.0.1:8080/tool/net/redbean.html but then following
         | usage instructions in another shell:                   $ echo
         | '<b>hello</b>' >index.html         $ zip redbean.com index.html
         | adding: index.html (stored 0%)         $ ./redbean.com -vv
         | Killed: 9
         | 
         | I blame my zip                   $ zip -v         Copyright (c)
         | 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
         | This is Zip 3.0 (July 5th 2008), by Info-ZIP.         Currently
         | maintained by E. Gordon.
         | 
         | Addition of index.html shrinks(!) redbean.com from size 204800
         | to size 204348, with changes starting from char 172938. That
         | clearly corrupts the portable executable format.
        
         | awestroke wrote:
         | Disable Gatekeeper:                 sudo spctl --master-disable
        
         | oneeyedpigeon wrote:
         | Yup, I get "Killed: 9" on macOS (Big Sur) too. I actually had
         | some kind of problem (I think) with the original invocation:
         | $ bash -c './redbean.com -vv'         W2021-02-26T02:06:29.1629
         | 53:tool/net/redbean.c:1144:redbean:83621] setsockopt(server,
         | IPPROTO_TCP, TCP_FASTOPEN, &yes, sizeof(yes)) -
         | EINVAL/err=22/errno:22/GetLastError:0         W
         | --------------------
         | 000026:tool/net/redbean.c:1145:redbean:83621]
         | setsockopt(server, IPPROTO_TCP, TCP_QUICKACK, &yes,
         | sizeof(yes)) - ENOPROTOOPT/err=42/errno:42/GetLastError:0
         | error:./redbean.com: check failed: 0xffffffffffffffff !=
         | 0xffffffffffffffff (48)         6fffffffff70 0000004034cf
         | UNKNOWN         6fffffffff80 000000403225 UNKNOWN
         | 6fffffffffc0 0000004027f3 UNKNOWN         6fffffffffe0
         | 000000402a21 UNKNOWN         7ffeefbff870 00000040227b UNKNOWN
        
         | brabel wrote:
         | On Mac Big Sur it doesn't seem to work either:
         | > zsh -c './redbean.com -vv'          W2021-02-26T12:12:24.0193
         | 87:tool/net/redbean.c:1144:redbean:56779] setsockopt(server,
         | IPPROTO_TCP, TCP_FASTOPEN, &yes, sizeof(yes)) -
         | EINVAL/err=22/errno:22/GetLastError:0
         | 
         | W--------------------
         | 000028:tool/net/redbean.c:1145:redbean:56779]
         | setsockopt(server, IPPROTO_TCP, TCP_QUICKACK, &yes,
         | sizeof(yes)) - ENOPROTOOPT/err=42/errno:42/GetLastError:0 V
         | --------------------
         | 000023:tool/net/redbean.c:1166:redbean:56779] 0.0.0.0:8080
         | listen ^CV2021-02-26T12:12:27.012972:tool/net/redbean.c:1183:re
         | dbean:56779] 0.0.0.0:8080 terminated
         | 
         | EDIT: I am an idiot: it's working just fine... the messages
         | looked like an error to me, but visiting
         | https://localhost:8080/ does show a nice HTML page!
        
         | johnx123-up wrote:
         | Someone already reported the same
         | https://github.com/jart/cosmopolitan/issues/56
        
       | gekkonier wrote:
       | this is outstanding! speechless.
        
       | mixmastamyk wrote:
       | Is it a "fat" binary?
        
         | mekkkkkk wrote:
         | AFAIK a fat binary is just a binary with all dependencies
         | included. It would still be compiled for a specific platform.
         | The magic part about this is that it's a single file compiled
         | once that can be run on most platforms. And it also adheres to
         | the format of a zip file, so you can add, modify and remove
         | assets as you please inside the actual file, post compilation.
        
       | fctorial wrote:
       | So it's a tiny virtual machine. Intriguing, but not really
       | shocking.
        
         | mikewarot wrote:
         | >So it's a tiny virtual machine. Intriguing, but not really
         | shocking.
         | 
         | Nope... it's native code, that runs on multiple platforms, all
         | in one small executable.
         | 
         | How? Lots of very clever hacking, and trimming all the
         | accumulated dreck out of the normal C runtime, while making it
         | work across all the supported platforms. (Polyfill is the term
         | she uses)
         | 
         | This is the most amazing thing I've seen in a decade or so. It
         | is right up there with GIT in terms of the possibility space it
         | opens up.
        
         | vanderZwan wrote:
         | What is your definition of a virtual machine and what do you
         | think is happening here?
        
         | joh6nn wrote:
         | "no wireless. less space than a nomad"
        
       | comeonseriously wrote:
       | This is brilliant.
        
       | [deleted]
        
       | pxx wrote:
       | If you're getting `check failed: 0xffffffffffffffff !=
       | 0xffffffffffffffff (98)` make sure you're able to bind the
       | default port (8080). You can run the symbolized version to see
       | where the check occurs.
        
       | TickleSteve wrote:
       | TLDR: This is a packed file format that can look to the OS as
       | being executable (for Windows/Linux/OSX). The code is x86 and so
       | offers native performance on those processors. On other
       | platforms, an x86 emulator is built in so can't offer native
       | execution speeds.
       | 
       | While neat, its not the "best of all worlds" due to the lack of
       | native code on anything other than x86/x64. Also, claiming "bare
       | metal" is supported is a stretch as you are limited to having no
       | I/O of any form (as there is no platform code).
        
         | OOPMan wrote:
         | No I/O eh?
         | 
         | I'm sure the FP zealots will love it :-)
        
         | jart wrote:
         | I'm just one woman. What Cosmopolitan does so far, it does
         | really well. It was only as recently as a few days ago that I
         | got mmap() and malloc() polyfilled on bare metal. It has serial
         | uart i/o. It's going to have e1000/virtio sockets soon. You can
         | help me will that future into existence. I need people who know
         | o/s dev and can help me write code that does things like
         | correctly set up pic controller.
        
           | TickleSteve wrote:
           | Sorry, wasn't meant as a criticism, just as an explanation
           | because people were assuming magic...
           | 
           | Taking on bare-metal is a significant job much greater than
           | your original task and you may be better targeting something
           | like buildroot instead, after all what is the Linux kernel
           | but a hardware abstraction layer.
        
             | jart wrote:
             | How hard could stdio/sockets on metal possibly be? So far
             | bare metal has been a walk in the park. I love the fact
             | that PML4T lets me do things like move memory without
             | copying it. I want to be able to have that power without
             | schlepping in the entire Linux world. I believe it should
             | be possible for programs to be able to boot on metal as
             | _just_ programs which are tiny and auditable. Especially
             | considering everything runs on hypervisors these days,
             | which are in some respects the true operating system. Ring
             | 0 is the new Ring 3. Who among you is willing to accept
             | being pushed to the outer bounds of computing? If MINIX
             | gets to run in Ring -3 then it should at least be easy for
             | our programs to run in Ring0.
        
               | TickleSteve wrote:
               | Its not the difficulty, but the scale.
               | 
               | Working on one bare metal system is relatively easy as
               | long as you're willing to dive into drivers. Getting 1001
               | I2C drivers or maybe writing a drivers for tens of
               | different types of flash devices is a different matter.
               | 
               | Your project will quickly become overrun with drivers for
               | literally tens of thousands of devices... then comes
               | maintenance.
               | 
               | Look at the Linux source tree... Good drivers are not
               | trivial either. Simple ones are of course.
               | 
               | Basically, its a time-sink and it doesn't become useful
               | for claiming "portability" until you're approaching the
               | scale of something like Linux.
        
               | jart wrote:
               | You're confusing portability with requirements. I'm aware
               | that a long tail exists. Linux is a big tent for that
               | sort of thing. I think that's great. I also want the
               | freedom to live outside that tent during the times when
               | all I need are the other 85% of use cases, which as I've
               | shown, can be easily achieved by just one person. I don't
               | believe that just because I ship actually portable
               | executables that are able to do e1000/virtio that every
               | hardware manufacturer is going to be kicking down my door
               | eager to get support for their silicon merged. Linux is
               | already doing a great job at that and I think
               | Cosmopolitan is complementary.
        
               | brabel wrote:
               | As someone who knows programming in higher level
               | languages well but has no experience with low level, bare
               | metal, how can I get started with this stuff you're
               | working with?
               | 
               | > So far bare metal has been a walk in the park. I love
               | the fact that PML4T lets me do things like move memory
               | without copying it.
               | 
               | > I believe it should be possible for programs to be able
               | to boot on metal as just programs which are tiny and
               | auditable.
               | 
               | I would love to be able to learn more about this. Maybe
               | even contribute to your project :) perhaps a good way to
               | start would be to address some small tasks you might have
               | laying around?!
        
               | jart wrote:
               | And I would love to encourage you to do so! If you're
               | working for Cosmopolitan then I'll be working hard to
               | support you. There's a long history of depth to metal.
               | Many people start off learning it by having fun with the
               | old skool ibm pc boot process. Here's a gentle
               | introduction:
               | https://justine.lol/blinkenlights/realmode.html and
               | https://github.com/jart/sectorlisp and
               | http://reddit.com/r/osdev
               | 
               | Those concepts are implemented in the Cosmopolitan
               | codebase here: https://github.com/jart/cosmopolitan/blob/
               | master/ape/ape.S
               | 
               | That file runs a few hundred lines of old school assembly
               | in order to bring us into the modern era. Towards the end
               | of the file you'll notice it starts calling functions
               | that are written in C which configure memory: https://git
               | hub.com/jart/cosmopolitan/blob/master/libc/runtim...
               | 
               | After it configures memory, the ape.S file is able to
               | call _start(). It also sets a bit in __hostos so that
               | functions like write() know to use the serial port
               | instead of issuing system calls: https://github.com/jart/
               | cosmopolitan/blob/master/libc/calls/... That's the
               | simplest possible example of a driver with spin locks
               | which uses the x86 IN/OUT instructions.
               | 
               | If you want to take a dive off the deep end right now
               | with Cosmopolitan on metal -- simulated -- then try the
               | following build commands on your Linux terminal:
               | git clone https://github.com/jart/cosmopolitan         cd
               | cosmopolitan         make -j8 o//examples/hello2.com
               | qemu-system-x86_64 -m 16 -nographic -fda
               | o//examples/hello2.com         sed -i -e
               | 's/USE_SYMBOL_HACK 0/USE_SYMBOL_HACK 1/' ape/ape.S
               | make -j8 o//examples/hello2.com
               | o//tool/build/blinkenlights.com
               | o//tool/build/blinkenlights.com -rt
               | o//examples/hello2.com
        
       | smusamashah wrote:
       | Windows 10 (10.0.18363 Build 18363). Just downloaded and
       | executed. No zip modification at all.                 W2021-02-26
       | T05:00:59.959364:tool/net/redbean.c:1141:redbean-2021-02-25:49336
       | ] setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))
       | - ENOPROTOOPT/err=10042/errno:10042/GetLastError:0       W
       | --------------------
       | 000674:tool/net/redbean.c:1145:redbean-2021-02-25:49336]
       | setsockopt(server, IPPROTO_TCP, TCP_QUICKACK, &yes, sizeof(yes))
       | - ENOPROTOOPT/err=10042/errno:10042/GetLastError:0
       | 
       | Its amazing if works though, i can put my static site in an exe.
       | That is so cool.
       | 
       | EDIT: Runs on without modifying even with this message.
       | 
       | EDIT: Cannot modify zip on windows. "File not found or no read
       | permission" using explorer. With 7-zip "Operation is not
       | supported."
       | 
       | EDIT: Used WSL to update zip which then results in SIGSEGV
        
       | mbgerring wrote:
       | I am floored. Not only is this just breathtaking sorcery, I also
       | needed this exact thing for a project. I don't understand
       | probably 70% of the description of this software, but I
       | understand what it does, and I'm more excited to carefully study
       | and use this than I have been about anything in years.
        
       | Hayvok wrote:
       | Zero/near-zero dependencies, minimal configuration, portable, and
       | trivial to run. Awesome.
       | 
       | Even if Redbean here doesn't end up taking over the world, I hope
       | that more ecosystems and toolchains sit up and take notice. We
       | need more tools that look like this.
        
       | franga2000 wrote:
       | I was literally thinking about how cool this would be if it
       | existed like a few days ago!!! Down to the freaky portable
       | executable!
       | 
       | Congrats on reading my mind and making what was supposed to be
       | impossible?
        
       | nwienert wrote:
       | Can someone marry this with QuickJS and make a micro node
       | competitor with a web server, 0 deps and no install?
       | 
       | Wonder how far something like that could go, could be really
       | interesting for replacing bash for me with something easier to
       | write like JS.
        
       | tgbugs wrote:
       | I looked into building SBCL using chibicc last weekend in the
       | hope that one could build a truly portable lisp runtime using the
       | ape toolchain (Yes, yes, I know you couldn't possibly pick two
       | more different approaches to software portability). Turns out the
       | GNUC extensions for __asm__ are the primary stumbling block
       | (though I'm sure there are others). tcc supports the GNUC
       | extensions needed, and chibicc supports the thread local storage
       | needed for dynamic variables. Looking forward to future
       | developments!
        
         | jart wrote:
         | You need __asm__ in chibicc for sbcl? I have good news for you.
         | I did exactly that in cosmopolitan's vendored fork of chibicc
         | here:
         | https://github.com/jart/cosmopolitan/blob/master/third_party...
         | I went on a coding rampage back in December, adding to chibicc
         | pretty much every GNU extension under the moon:
         | https://github.com/jart/cosmopolitan/blob/master/third_party...
         | It should be a perfect fit for use cases needed by Cosmopolitan
         | and SBCL. Right now it's unlikely to get merged back upstream
         | because Rui is still focusing on using Chibicc for his book,
         | and that requires being more conservative about feature
         | inclusion right now.
         | 
         | I would highly recommend using chibicc. Bellard's work on tcc
         | was fantastic when it came out. However it didn't age well. Its
         | GNU extension support is roughly equivalent to GCC 2.x. The
         | x86_64 support that got bolted on later isn't very good. It was
         | much more elegant back when it was only doing i386. Hackability
         | was also laid low by merging a lot of external contributions.
         | The TCC design, while amazingly fast, also carries the tradeoff
         | of making things like inline assembly hacks really hard because
         | it generates the x86 binary content directly, rather than going
         | through the intermediate step of generating an assembly file
         | and running it through a proper assembler -- which chibicc now
         | has!
        
       | yters wrote:
       | Hmm, somehow I knew Justine is a 'transwoman' by this feat. Lucky
       | guess I suppose...
       | 
       | Question: if all the high achieving women in tech end up being
       | 'transwomen', is that a step forward or backward for women in
       | tech? Will 'transwomen' be able to take advantage of hiring
       | privileges given to normal women? If so, won't this effectively
       | shut normal women out of tech even more?
       | 
       | I think trans/self identifying people should be in a separate
       | category so they don't exploit allowances made for under
       | represented minorities.
        
         | tobz wrote:
         | Sincerely: what the fuck is wrong with you?
        
           | yters wrote:
           | Isn't it a legitimate question? We have special protection
           | for under represented groups. So when the dominant group
           | starts taking the identity of underrepresented groups and
           | coopting their protections, they are no longer protected. The
           | two things are at odds with each other.
        
             | throwaway161437 wrote:
             | I'll engage. I think your comments are clearly bigoted, and
             | I'll tell you why. What you do with that is up to you.
             | 
             | > Hmm, somehow I knew Justine is a 'transwoman' by this
             | feat. Lucky guess I suppose...
             | 
             | You use scare quotes around "transwoman". Why is that? Is
             | that a concept you believe is not real somehow?
             | 
             | You are guessing that something technically impressive was
             | achieved by a trans woman. Why is that? Are women not
             | capable of technical feats?
             | 
             | > Lucky guess I suppose...
             | 
             | This implies that women being technically inferior is
             | something obvious, something we all know but can't say.
             | 
             | > If all the high achieving women in tech end up being
             | [yet-again-scare-quotes (and for some reason one word)]
             | "transwomen", ...
             | 
             | This isn't a playful hypothetical question. You are
             | reinforcing your claim that women in tech are not high
             | achieving.
             | 
             | > I think trans/self identifying people should be in a
             | separate category so they don't exploit allowances made for
             | under represented minorities.
             | 
             | > So when the dominant group starts taking the identity of
             | underrepresented groups and coopting their protections
             | 
             | From these two statements it is clear you think that trans
             | women are the dominant group (men?) that are exploiting
             | special allowances meant for women. Because in your eyes
             | trans women do not count as women. And they don't deserve
             | protection.
             | 
             | You are getting downvoted because the community recognizes
             | the bigotry against cis and trans women that is the
             | backbone of your two comments.
        
       | mikewarot wrote:
       | I really like your view of the world, that programs should be
       | portable, tiny, and just work. The slamming of so much
       | functionality into a zip file is inspiring.
       | 
       | Would it be possible to do something similar with Free Pascal,
       | allowing the recreation of something like Turbo Pascal, except
       | really, _really_ portable .com output?
        
         | [deleted]
        
         | jart wrote:
         | Author here. Absolutely. I used to love Turbo Pascal and Delphi
         | when I was younger. If Free Pascal uses GNU LD.BFD or LLVM LLD
         | when it links programs, then all you'd need to do is is
         | configure it to use cosmopolitan.a when linking system call
         | functions like read(), write(), etc. See
         | https://github.com/jart/cosmopolitan Another option is if Free
         | Pascal wants to write all the system call support from scratch,
         | then doing that now is going to be a whole lot easier since the
         | Cosmopolitan codebase does a really good job documenting all
         | the magic numbers you'll need. See files like
         | https://github.com/jart/cosmopolitan/blob/master/libc/sysv/s...
         | and
         | https://github.com/jart/cosmopolitan/blob/master/libc/sysv/c...
         | I've been working on a tiny C11 compiler called chibicc which
         | has most GNU extensions and I managed to get it working as an
         | actually portable executable with an integrated assembler:
         | https://github.com/jart/cosmopolitan/blob/master/third_party...
         | I also got Antirez's KILO text editor working as an APE binary.
         | https://github.com/jart/cosmopolitan/blob/master/examples/ki...
         | If we can build a linker too then we can get a freestanding
         | single file toolchain + ide that's able to be a modern version
         | of Turbo C.
        
           | akavel wrote:
           | I think the Zig community/BDFL might appreciate adding an APE
           | target "os" to their buildchain (LLVM-based); that could be a
           | match made in heaven!
        
             | jart wrote:
             | Author here. I've been chatting with the Zig BDFL on
             | Twitter recently about contributing APE support and he's
             | been super supportive so far. It's going to be a nontrivial
             | undertaking but would certainly be rewarding for everyone
             | if we can make it happen.
        
               | phabora wrote:
               | You can also use proper nouns, you dorks.
        
               | akavel wrote:
               | Oh wow!!!!!!!
        
           | anthk wrote:
           | Now you can port Slashem to more platforms than Nethack 3.4.3
           | itself :D
        
           | ronyeh wrote:
           | Since I can't upvote your Show HN twice, I'll upvote this
           | comment. I learned something interesting tonight from your
           | websites. Thanks!
           | 
           | chibicc is a really fun idea! If I was in college, I would
           | take a compiler course from you.
           | 
           | Taken from your README:
           | 
           | "chibicc is developed as the reference implementation for a
           | book I'm currently writing about the C compiler and the low-
           | level programming. The book covers the vast topic with an
           | incremental approach; in the first chapter, readers will
           | implement a "compiler" that accepts just a single number as a
           | "language", which will then gain one feature at a time in
           | each section of the book until the language that the compiler
           | accepts matches what the C11 spec specifies. I took this
           | incremental approach from the paper by Abdulaziz Ghuloum."
        
           | mhd wrote:
           | Speaking of other languages, given that the APE is a zip
           | container, it shouldn't be too hard to have a "starkit" like
           | setup where the binary part is basically node/python/perl/tcl
           | and the main script and all required libraries are in the
           | executable.
        
           | whizzter wrote:
           | I love what you've produced here. I noticed that pthreads
           | seems to be fail-stubbed for the time being, i guess it's a
           | todo with tricky semantics?
           | 
           | As for holding off on UI for the time being is probably the
           | right thing to do, keeping with the minimal style planning on
           | going for raw-x11,etc.
           | 
           | However, as much as I personally love plain framebuffers
           | (late 90s democoder myself), it'd be totally non-accessible
           | for "plain" applications and totally lacking performance
           | compared to anything accelerated when it comes to rendering.
           | Graphics cards are just so many times faster that it's not
           | really even the same kind of usage (only sad part is Apple
           | punting on OpenGL driver updates even if Intel on the low end
           | has become so much better).
           | 
           | That said, having looked for a minimal UI framework and sadly
           | they seem to be far inbetween these days (libUI is fairly
           | compact on win/osX but required GTK on *nix but they've lost
           | a bit of steam since 2018)
           | 
           | Best of luck on it all (hopefully I can snatch out some time
           | to contribute)
        
             | jart wrote:
             | So far the only platform where I've managed to get threads
             | to work has been Windows. I came pretty close to getting
             | clone() on Linux working a few days ago. Threads are so
             | hard because no API was ever defined for them in original
             | UNIX and BSD, so therefore each modern system today does
             | them in a completely different way. Another blocker is that
             | not all operating systems let us modify segment registers
             | which is something that the Linux compiler assumes is
             | available for TLS. So it'd be a miracle if it ended up
             | being possible to make threads work portably. fork() on the
             | other hand was easy to get working on all platforms. I love
             | fork() and vfork().
             | 
             | As for GUIs I'm still open to merging raw x11 support. One
             | tricky issue is that we'd need to define a new API that
             | veneers framebuffers, and so far Cosmopolitan has mostly
             | refrained from defining novel interfaces, since the focus
             | has been twiddling with low level magic numbers in order to
             | make the textbook interfaces we already have work
             | everywhere!
        
               | whizzter wrote:
               | Ah segregs is gonna be a pita indeed if it's all hard-
               | wired to the compiler.
               | 
               | Considered making some way to add "portable" modules
               | yet(generic APE code with plat-specific impls) to avoid
               | adding stuff to the core? I know the default calling-conv
               | is slightly different but maybe by smth like defining
               | virtual ports? (ie "send" structs since alignment rules
               | should be mostly the same?)
        
               | fwsgonzo wrote:
               | Threads are a PITA everywhere. On Linux the SYSCALL stuff
               | complicates things because of all the register moves, the
               | FUTEX stuff, and potential races with how threads are
               | exited.
        
       | bjarneh wrote:
       | > exes still end up being roughly 100x smaller than Go Hello
       | World
       | 
       | > Is the Cosmopolitan Runtime lean and mean like Go's 2mb Hello
       | World executables?
       | 
       | :-)
        
       | rkalla wrote:
       | "I figured out how to microwave water, to make gold."
       | 
       | Good lord this is cool
        
       | 867-5309 wrote:
       | >the sources that went into creating it are nontrivial and only
       | recommended reading if you really love printing lemurs in
       | terminals.
       | 
       | this is delightful
        
       | whalesalad wrote:
       | I'm not an expert at C code but it's really nice to read
       | redbean.c - lots of relatively small functions with great names.
       | Good example to follow.
        
       | th0ma5 wrote:
       | Presumably X86_64 only?
        
         | ZiiS wrote:
         | Not sure the is a working example. But they talk of embeding
         | qemu to create cross archetecture executables. But the Window's
         | and actual compiled code would still be x86-64.
        
         | sscarduzio wrote:
         | She says somewhere in her website that arm/apple silicon
         | support is really easy to add, with no significant size or
         | performance penalty, the same way she added qemu support.
        
       | ngcc_hk wrote:
       | Does it work with this level of bare metal
       | 
       | https://news.ycombinator.com/item?id=26271356
        
       | r0b05 wrote:
       | Everybody is hyped up here but can someone explain to me what are
       | the implications for the future of programming?
       | 
       | Will I be able to write apps in a single language and have then
       | run truly native on any OS or what else will we be able to do?
        
         | alisonatwork wrote:
         | This is something like a "fat binary" with some magic in the
         | header that allows it to run out of the box on Windows and
         | several different UNIXes, a bit like those sneaky shell scripts
         | that run on several platforms[0]. It still needs to include
         | some native code for each of the platforms inside the compiled
         | binary, so it's perhaps better to see it as a slick
         | packaging/distribution solution for C programmers than a total
         | game changer for developers everywhere.
         | 
         | The more interesting thing I think is the mapping of C library
         | functionality between Linux, BSD and Windows. There have been
         | other attempts to do this, but they never seem to get much
         | traction. I think it's because C programmers tend to get wedded
         | to their OS of choice and then invest time in improving that
         | platform's C libraries. The problem with trying to remain
         | portable with everything is that you tend to be stuck working
         | with the lowest common denominator functionality, which can be
         | frustrating when doing OS-specific stuff would open up so many
         | more options.
         | 
         | All that said, the cleverness of this project is inspirational
         | in a way that might encourage other programmers to also focus
         | more on building against simple functionality that is truly
         | portable. It shows that you don't need all the bells and
         | whistles to build cool stuff. That feels aligned with early
         | UNIX philosophy and (more broadly) the hacker ethic, which is
         | why it's neat to see, even if never gets adopted as a
         | mainstream thing.
         | 
         | [0] https://github.com/llamasoft/polyshell
        
           | r0b05 wrote:
           | Appreciate the response. So it's a bigger win for C devs
           | specifically. I am a C# dev so I am trying to understand what
           | opportunities this project unlocks.
        
             | goldenkey wrote:
             | Why you have pigeonholed yourself? "X Dev" is so cliche.
             | You can compile C# to x86 machine code - this project has
             | less to do with C and more to do with PE format and syscall
             | tables. It means that it's language agnostic but not
             | standard library agnostic.
        
       | kidsil wrote:
       | Odd, I'm getting $ ./printimage.com image.jpg
       | 
       | run-detectors: unable to find an interpreter for ./printimage.com
        
         | jart wrote:
         | Author here. That error happens if you have binfmt_misc
         | enabled. The solution is simple:                   sudo sh -c
         | "echo ':APE:M::MZqFpD::/bin/sh:'
         | >/proc/sys/fs/binfmt_misc/register"
         | 
         | I intend to upstream a patch with the Linux kernel so it can do
         | this automatically. If any kernel devs are reading, please
         | email me!
        
           | est wrote:
           | Does it work on cheap Xen vps? Because
           | "/proc/sys/fs/binfmt_misc/register" looks absent from mine.
        
             | jart wrote:
             | That's strange. I'd recommend filing an issue. Any details
             | on how I can reproduce the error will be helpful, even if I
             | have to temporarily rent one of those things. I'm on a
             | mission to make binaries portable.
        
               | na-- wrote:
               | FWIW, it works on QubesOS, which is Xen based. Though it
               | works only in my Fedora and Debian VMs, but not on my
               | Archlinux-based one.
               | 
               | I think that's because I have WINE installed in the
               | Archlinux VMs, since that's what gets started when I run
               | ./redbean.com. But even after I remove WINE, it still
               | doesn't work, I probably have to restart (i.e. remove
               | WINE from the TemplateVM, not the AppVM) for it to work.
               | 
               | In any case, incredible work, I am in awe!
        
           | FeepingCreature wrote:
           | Instead of sudo sh -c to sudo the redirects, consider echo
           | 'abcde' |sudo tee /proc/bla. Less nesting :)
        
             | npongratz wrote:
             | Do you mean less syntactical nesting? The pipe to sudo tee
             | creates a new child shell, just as sudo sh -c does.
        
               | FeepingCreature wrote:
               | Yes.
        
       | IggleSniggle wrote:
       | I feel like I've learned more from your website and your source
       | code in a few hours than I otherwise would have from years of
       | study.
       | 
       | You have a real talent for distilling the complex into something
       | simple. It's apparent in the purpose of your programs, in your
       | writing, and in your source code. Thank you so much!
       | 
       | Basics of computing architecture that I didn't especially think
       | were too complex for me to learn, but we're too abstracted for me
       | to become interested in, are laid bare in each one of these
       | programs and their source. This is all incredibly exciting.
        
       | shaggy8871 wrote:
       | Nice job, Justine. This level of excitement reminds me of the
       | early days of Linux. I think it has the potential to go far.
        
         | jart wrote:
         | Author here. Thanks! I was deeply inspired when I read the
         | source code to early versions of Linux and UNIX. The dream of
         | that simple elegant power is something I'm hoping to restore
         | for a new generation. All I'm doing to achieve that is simply
         | standing on the shoulders of the giants who came before me.
        
           | AtlasBarfed wrote:
           | I can't believe I'm ASKING for a blog post.
           | 
           | Can you blog a bit of the career/cognitive/skill evolutionary
           | history behind this? Did the cosmo stuff come out of this or
           | something else?
           | 
           | Learned this in X level school, found out about Y, read about
           | Y, learned this, got this job doing this, learned this from
           | Z, got experience of AA... etc.
           | 
           | Of course, assuming this exists, and you exist. And blogs
           | "exist".
        
             | jart wrote:
             | Author here. When I first discovered the idea for Actually
             | Portable Executable I thought I was going mad like Terry
             | Davis. I couldn't even believe that it was possible until I
             | actually did it. It cost me my job but I couldn't be
             | happier with the result. This project is going to make
             | problems disappear for so many developers. It's the sort of
             | tool people can get excited about. I'm so happy that my
             | prior career success and top-notch training have granted me
             | the privilege of bringing something this cool to the world.
             | Enjoy!
        
           | fwsgonzo wrote:
           | Have you considered trying to make system calls inline to
           | avoid the call overhead? Or already thought about it?
           | 
           | I've been banging my head against the wall of trying to make
           | a micro KVM guest and the glibc startup code uses inline
           | SYSCALL everywhere, I assume to make things faster. It does
           | seem to call CPUID a lot too, but I guess it's not as
           | expensive as having to make full-blown system calls.
        
             | jart wrote:
             | Cosmopolitan defines linkable symbols for all the
             | __NR_syscall constants so you can absolutely use inlining
             | if you like to live dangerously. For example: https://githu
             | b.com/jart/cosmopolitan/blob/91f4167a45f811fde6... There
             | really isn't any performance advantage to doing this,
             | because the SYSCALL instruction itself has something like a
             | 2000+ cycle cost due to all the copying that needs to
             | happen on the kernel side along with things like spectre
             | mitigations which have made is slower. So the 8 cycle cost
             | of having a normal read() function wrapper is the wrong
             | thing to be focusing on. Cosmopolitan aims to address the
             | performance cost of SYSCALL by making it possible to run
             | your binary on bare metal, where your program becomes a
             | kernel, and therefore needn't pay any context switching
             | costs at all.
        
               | fwsgonzo wrote:
               | And it's even more overhead when exiting a VM, then?
        
       | shaded-enmity wrote:
       | If you want to learn more how these things work I'd highly
       | suggest going through the PoC||GTFO archive
       | (https://github.com/angea/pocorgtfo/blob/master/README.md) and
       | check out entries by Ange Albertini or entries named like "This
       | ZIP is also a PDF".
        
         | donaldihunter wrote:
         | I came here for this. E.g.
         | https://www.alchemistowl.org/pocorgtfo/pocorgtfo19.pdf
         | 
         | "This file, pocorgtfo19.pdf, is valid as a PDF document, a ZIP
         | archive, and a HTML page. It is also available as a Windows PE
         | executable, a PNG image and an MP4 video, all of which have the
         | same MD5 as this PDF."
        
       | soheil wrote:
       | Ok well this doesn't work on Mac, so much for not needing to
       | cross-compile on every architecture. It's because of the OSX
       | Gatekeeper but if majority of people need to self-sign or
       | otherwise compile this binary I'm not sure if it is that portable
       | be it if it's only a Mac thing. This dumps the zip content
       | directly on the wire skipping an extra kernel write. There have
       | been attempts before to run the same binary on multiple
       | architectures by inserting magic headers without having to
       | recompile. There are shell/batch versions of the same thing [0].
       | The issue is such projects usually never get much traction since
       | every programmer is wedded to their choice of OS and typically
       | relies on APIs specific to each system. There are also "fat
       | binaries" which accomplish the same thing if one truly wanted a
       | cross platform single executable. There isn't a huge need for
       | them currently and not just because they're "fat" (something this
       | approach seems to tackle primarily) so I expect for the same
       | reasons there won't be many needs for this approach either.
       | 
       | I see a lot of people making the comparison between this and the
       | OG Linux tools. I absolutely don't think this qualifies as one,
       | most old Linux tools are irreplaceable or at least were when they
       | first came out and there were no alternatives. Serving a bundled
       | zip file on a web server across many different platforms is not
       | something people are dying to do. You can run a web server like
       | nginx or Apache to index your files or if you really hate those
       | why not a single line command which is supported on almost any
       | platform:                 python -m http.server 8080
       | 
       | [0] https://github.com/llamasoft/polyshell
        
       | francislavoie wrote:
       | Caddy is a single file web server as well :)
       | https://caddyserver.com/
       | 
       | Admittedly they solve different usecases, where Redbean seems to
       | want to serve a whole static site as a single file, which isn't
       | currently possible with Caddy, (but you can run `caddy file-
       | server` to serve the current directory as a static site), but it
       | may become possible in the future with Golang's new embed package
       | https://golang.org/pkg/embed/
        
         | mholt wrote:
         | That's actually a pretty interesting idea. I wonder if we could
         | make a lite version of Caddy bundled with your website
         | embedded...no need to mess with file systems or permissions or
         | devices and folders to run a static site. Might need some
         | massaging to become a truly pleasant workflow though.
        
           | francislavoie wrote:
           | Yeah - I could see it being part of xcaddy tooling to package
           | up the static assets in the binary :)
        
           | IceWreck wrote:
           | The go std library offers the embed package. You can just
           | embed your files and use the std lib's webserver and generate
           | a single file binary. No need for Caddy.
           | 
           | All this would be roughly 15 lines of code.
        
             | mholt wrote:
             | People use Caddy for automatic HTTPS, which the std lib
             | does not give you.
        
               | anderspitman wrote:
               | Obviously you don't need to know this but others might
               | not be aware that certmagic is a great middle ground
               | between Caddy and rolling your own ACME.
        
         | kapitalx wrote:
         | Caddy is cool! Redbean is magic :p
         | 
         | Thanks for sharing.
        
         | goldenkey wrote:
         | Is that smile at the end of your first sentence meant to be
         | condescending?
         | 
         | You are affiliated with Caddy and ought to mention that when
         | you promote your own software.
         | https://news.ycombinator.com/item?id=16687686
         | 
         | This is not a competition. Caddy is not even in the same realm
         | as Redbean.
         | 
         | Redbean is a multi-platform binary that doubles as a ZIP. It's
         | roughly 1500 times smaller than Caddy too.
         | 
         | > different usecases
         | 
         | Right. :)
        
           | francislavoie wrote:
           | > Is that smile at the end of your first sentence meant to be
           | condescending?
           | 
           | What? Of course not! You're reading way too much into that.
           | It's simply enthusiasm. I read about Redbean and it being a
           | single file webserver and the first thing to come to mind is
           | Caddy, as "prior art".
           | 
           | Like I said, different usecases; Caddy is a general purpose
           | webserver which has automatic certificate management, H2/H3
           | support, reverse proxy, file server, a strong plugin system,
           | the list goes on. Of course it'll be bigger in size. Redbean
           | is super cool and does have the advantage in file size and
           | portability, clearly, but it is essentially a single-purpose
           | tool. And there's nothing wrong with that.
        
         | jart wrote:
         | Caddy is cool but it has a separate 33mb executable for each
         | operating system. Redbean is a 128kb executable that runs on
         | all platforms so it has fewer moving parts and is 1584x tinier.
         | All the convenience of being able to "just add your assets to
         | the zip executable" wouldn't have been feasible if we needed to
         | repeat that process n times for each operating system.
        
           | francislavoie wrote:
           | Yes of course - like I said, they solve different usecases.
           | Caddy has way, way more features overall to make up for the
           | bigger binary.
        
             | mrmonkeyman wrote:
             | Caddy is Go. It has 5mb hello worlds. (Which is fine)
        
       | brainless wrote:
       | OK I see we are going crazy, me too. Thanks @jart.
       | 
       | I have been thinking about portable web apps with embedded SQLite
       | for some time. I do not have the technical chops at C level to
       | pull this off. I am really inspired by this project. I hope
       | Redbean leads a way to distribute self-hosted apps in today's era
       | of the cloud.
        
         | BugWatch wrote:
         | I still use the classic version of Tiddlywiki that is a single
         | self-contained self-editing html file, and I "app-ify" it on
         | Windows by changing the extension to *.hta.
         | 
         | But having the similar solution with the SQLite, would be a
         | perfect combination.
        
       | mhd wrote:
       | It's a neat coincidence that this is on at the same time as an
       | article about CP/M, because I think there could be some overlap
       | in the programs that would be a good fit for cosmopolitan.
       | 
       | Sure, there's server appliances like this, and I hope someone
       | makes a neat services wrapper to abstract at least some
       | platform's intricacies so you can do a "cosmo-service up redbean"
       | on BSD/Linux/Windows.
       | 
       | But coming back to CP/M, there you had a lowest common
       | denominator of terminal applications, too, but spread across
       | different architectures. And you could still produce some quite
       | intersting, if a bit business-like applications. These days you
       | probably can even rely on more ANSI colors and maybe even unicode
       | fonts (hopefull as an option, not mandatory).
       | 
       | The ZIP characteristics of the APE format make it even easier to
       | distribute a whole application in a rather simple way. Yes, sure,
       | you can do regular Unix-style servers and pipe-it-together CLI
       | tools, but I wouldn't mind more self-contained "business"
       | applications with a lo-fi aesthetic regarding interface and API
       | usage. The PICO-8 of TUIs...
        
         | jart wrote:
         | Author here. We're living in the most exciting time for
         | developing terminal applications. When Microsoft unexpectedly
         | added support for VT100 and XTERM codes to CMD.EXE it totally
         | changed the equation and ANSI became universal for the first
         | time. Blinkenlights is an example of a TUI application I
         | created using Cosmopolitan and it literally works everywhere.
         | https://justine.lol/blinkenlights/index.html You don't need
         | curses. All that's needed is an ioctl() call which flips a bit
         | in termios. Cosmopolitan polyfills that across operating
         | systems. Another cool example of a demo app is this conway's
         | game of life tui gui: https://justine.lol/apelife/index.html
        
           | rexreed wrote:
           | Does that remove full binary compatibility for those running
           | on older OS from Microsoft with an older cmd.exe?
        
             | jart wrote:
             | Cosmopolitan supports Windows 7. The WinMain() polyfill is
             | programmed to gracefully fall back if ANSI isn't available.
             | So the binary still loads fine. You just need to run it in
             | something like MinTTY instead if your TUI program is run on
             | an old version of Windows.
        
       | bni wrote:
       | Why does the magic numbers list have a XENIX column?
        
         | jart wrote:
         | Author here. The name was chosen mostly out of playfulness to
         | describe Windows since I seem to recall XENIX being the
         | earliest example of Microsoft dipping their toes in the water
         | with UNIX support.
        
           | robaato wrote:
           | Back in the day ('80s) worked at Logica with colleagues who
           | did Xenix support!
        
       | bni wrote:
       | Would GUI programs be possible with this? I don't mean some cross
       | platform framework monstrosity.
       | 
       | But if some least common denominator was found to be able to
       | create window, add some input fields and buttons using the native
       | UI elements of the OS?
       | 
       | Does the Win32 and Cocoa APIs for example, also have "magic
       | numbers" that are kept stable?
        
         | hnarn wrote:
         | > Would GUI programs be possible with this?
         | 
         | This is a cross platform web server, not a cross platform web
         | browser.
        
           | bni wrote:
           | Sorry, I forgot that this post was about the web server and
           | not about actually pdrtable executable
        
       | alfiedotwtf wrote:
       | This is the coolest thing I've seen on HN in a long time. Nice
       | work
        
       | haolez wrote:
       | This is so powerful that it can be used as a "weapon": it's the
       | perfect lib for making malware. I think this is a compliment!
        
         | cirowrc wrote:
         | scary scary scary
        
         | nabla9 wrote:
         | She started her career with a very successful spam tool. She
         | was 14 at the time.
        
           | syncbehind wrote:
           | I definitely was not coding when I was 14. Dang.
        
       | aembleton wrote:
       | Just make sure you don't have another server running on :8080.
       | 
       | I had syncthing running and kept getting some error whenever I
       | tried to run redbean. The error didn't make much sense, but
       | eventually I realised that this was the casue of the error.
       | 
       | I'm really impressed how portable this is. The only improvement I
       | can see is if it auto-opened your browser to :8080. That way it
       | would be easy to distribute the binary and have people run your
       | application and just interact with it through their browser. No
       | need to ship electron then!
        
         | r0b05 wrote:
         | Let's say we are able to do this. Would we have any security
         | concerns to be addressed?
        
           | anaganisk wrote:
           | How different would it be from opening a random site in your
           | web browser?
        
           | t0astbread wrote:
           | There is the possibility of other programs making HTTP
           | requests so you shouldn't assume trust on any request
           | automatically. What you can do is give the browser a cookie
           | once when your app starts which you then check on every
           | request.
           | 
           | Oh and listen on 127.0.0.1, not 0.0.0.0. That way your app is
           | not needlessly exposed to the network.
        
         | sva_ wrote:
         | I think you could trivially issue a _system()_ call, you 'd
         | just have to use the corresponding command to open the default
         | browser for each particular system. (Linux: _xdg-open_ , MacOs:
         | _open_ , Windows: _start_ )
        
       | aero- wrote:
       | Can someone explain this to me like I'm an 8 year old?
        
         | anderspitman wrote:
         | Can someone explain this to me like I'm a 31 year old?
        
           | mikewarot wrote:
           | I've been programming since before you were born... and this
           | is the most impressive hacking feat I've ever seen.
           | 
           | A single executable, that doubles as a valid ZIP file, that
           | you can put a complete website into, also doubles as a valid
           | executable on Windows, Mac, Linux.
           | 
           | The build infrastructure is a complete reworking of C to make
           | it far more portable than even K&R thought possible.
           | 
           | I probably wouldn't have believed it possible, but here it
           | is!
        
             | anderspitman wrote:
             | Thanks!
        
         | mikewarot wrote:
         | On most computer systems these days can select a set of files
         | and folders and tell the computer to "Send to compressed file",
         | the files that come out of that process usually end in ".zip",
         | and are thus known as "zip files"
         | 
         | This is a zip file, like any other... you can add and remove
         | things from it. However, this ZIP file has a superpower, it can
         | display the contents on the web... it has a web server built
         | into it.
         | 
         | You can take this file, run it on a Windows, Linux, Macintosh,
         | and it will work. You don't need separate versions for each
         | different system... this _just works_ on all three systems,
         | unlike almost every program ever written.
         | 
         | This is one of the most impressive feats of programming things
         | I've seen in my 40+ years of programming. The web serving is
         | clever, but the superpower that it can run on anything really
         | took a huge amount of work, which the author built into a tool
         | called "ape", and has shared with the world, so other people
         | can use it, and help her make it better.
        
       | quickthrower2 wrote:
       | Cute idea. Sounds like magic.
        
         | edoceo wrote:
         | Built with actual magic:
         | https://storage.googleapis.com/justine/ape.html
         | 
         | From the same person I think
        
           | indigodaddy wrote:
           | Author mentions that the APE's can be booted from the BIOS.
           | Would this imply you could perhaps implement a lambda-like
           | cloud service that could spawn/start the APE on demand? Edit,
           | I'd guess you'd want to/have to, also have a tcp/ip stack in
           | the APE as well (but perhaps just going for containerization
           | of the APE is the better play and not have to worry about any
           | of that..)
        
       | neilv wrote:
       | The trademark collision is going to test the joke of Red Bean
       | Software:
       | 
       | > _We 're software producers of a different kind. Rather than
       | market software the usual way, we openly deny its existence, and
       | challenge our customers to do the same._
       | 
       | https://red-bean.com/
        
       | txdv wrote:
       | > That performance is thanks to zip and gzip using the same
       | compression format, which enables kernelspace copies
       | 
       | Can someone elaborate on the relationship between gzip and kernel
       | space copies?
        
         | jart wrote:
         | Normally when a browser asks for Content-Encoding: gzip, the
         | http server needs to schlep the file into memory, compress it,
         | and only then is it able to send the output to the client.
         | Since redbean reads files from a zip archive, that file is
         | already compressed. So what it does is it uses mmap() to load
         | the zip executable in memory. Therefore instead of
         | read()+write() it can just call writev() on the mapped memory
         | area. That enables us to skip the extra copy. The kernel can
         | just copy the gzipped file contents directly to the network
         | wire without having to pay any userspace context switching
         | penalties.
        
       | ptato wrote:
       | I can't get it to run on Ubuntu. "run-detectors: unable to find
       | an interpreter for ./redbean.com"
        
       | ToJans wrote:
       | The short description is a bit too short; this is mind blowing!
       | 
       | Redbean is a portable, single file executable webserver which
       | also acts as a zip-file for the static content it hosts, and runs
       | on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS
       | without any recompilation...
       | 
       | You can manage the static content using standard pkzip tooling!
       | Now that's what I call thinking out of the box!
       | 
       | Edited: some rewording and breathing space
        
         | tutfbhuf wrote:
         | Is it that this binary does some tricks to run on Linux, Mac,
         | Windows, FreeBSD, OpenBSD, NetBSD, BIOS or does it really work
         | on all operating systems including something like Plan 9 or
         | even TempleOS?
         | 
         | And does it run on different architectures like ARMv6?
        
           | twic wrote:
           | Native execution on x86_64 only. "Linux + Mac + Windows +
           | FreeBSD + OpenBSD + NetBSD + BIOS", where "BIOS" means that
           | it will boot a machine and run on bare metal. On non x86_64
           | systems, the driver script will try to run the binary using
           | QEMU (which has to be installed and on the path):
           | 
           | https://github.com/jart/cosmopolitan/blob/40291c9db386d8a952.
           | ..
           | 
           | If i have understood how the portability works, it would be
           | pretty straightforward to add support for another OS which
           | uses the same ABI as the unices and has a compatible system
           | call table - just a matter of adding a column to consts.sh
           | (system call numbers in the nr section, constants from system
           | headers in their appropriate sections) and adding any OS-
           | specific system call rituals to systemfive.S.
           | 
           | Note that all system calls will go through the syscall
           | interface. If your OS has some other way to make system
           | calls, like Linux's vDSO or io_uring, that won't be used.
           | 
           | If your OS had a different system call table, like Windows,
           | then you would need to write more bespoke code for it, like
           | all the Windows wrappers:
           | 
           | https://github.com/jart/cosmopolitan/tree/0e85b136ae1beb0d2b.
           | ..
           | 
           | You would then need to go through the Cosmopolitan libc and
           | add implementations of its functions on top of your wrappers.
        
           | mhd wrote:
           | I think it qemu's itself if run on another platform.
        
       | ddtaylor wrote:
       | One small complaint I have is that there is already a popular
       | project called RedBean: https://www.redbeanphp.com/
        
       | gildas wrote:
       | Awesome! You could even use a zip file as a container for the
       | assets you want to serve! see https://gildas-lormeau.github.io/
       | (the page is a self-extracted zip file). And here's a demo
       | showing how to update an image:
       | https://www.youtube.com/watch?v=RJWhDmYhnX4
        
       | codezero wrote:
       | The magic numbers file ends with a comment linking to a youtube
       | video of numbers station playing very disconcerting and dissonant
       | music, so we can add art/comedy to the list of features (which
       | was already obvious!)
        
       | modeless wrote:
       | .apk files and .ipa files are secretly zip files too. With the
       | addition of a few manifest files and other crufty things embedded
       | in the zip, I bet you could add Android and iOS to the list of
       | supported platforms too.
        
         | akavel wrote:
         | I've recently succeeded in building working .apk files byte-by-
         | byte completely from scratch so I could maybe help some. Open
         | an issue on https://github.com/akavel/hellomello if interested
         | in some talking/advice and/or watch my talk on NimConf 2020 for
         | an overview (I don't have a link handy as I'm on mobile).
        
         | nonameiguess wrote:
         | Jars, rpms, whls, Microsoft Office, probably a bunch of other
         | stuff I don't even know about are actually zip files.
        
           | citruscomputing wrote:
           | .epubs too!
        
       | chriszhang wrote:
       | Someone please be kind and explain to me how this works? Don't
       | different executable formats need different headers?
       | 
       | Don't ELF need "0x7F ELF" header? Don't Windows executable need
       | "MZ" header? How is it fulfilling both requirements
       | simultaneously?
        
         | Gys wrote:
         | The OP explains https://justine.lol/ape.html
        
       | WrtCdEvrydy wrote:
       | This is awesome, I've wanted a way to package a webapp for
       | distribution locally and I think this + sqlite would be a perfect
       | combination.
        
       | thecodrr wrote:
       | As amazing as this is unfortunately it doesn't work for me and I
       | am on Linux.
       | 
       | I get bash: ./redbean.com: No such file or directory
       | 
       | after chmod-ing.
       | 
       | Maybe I am dumb but yeah.
        
         | anderspitman wrote:
         | Is your system 32 bit by chance?
        
       | hnarn wrote:
       | Out of curiosity, are there any general benchmarks available as
       | to how this stacks up to something like nginx when it comes to
       | static page serving?
        
       | r0b05 wrote:
       | The APE shit is really cool.
       | 
       | The webserver is novel but I am just wondering, how would it
       | compare to something like Apache/ISS in terms on
       | security/config/etc, or is this mostly just to move small sites
       | around?
        
       | chacocr wrote:
       | Hi
        
       | Lorin wrote:
       | No relation to http://redbeanphp.com/ I guess :D
        
         | rebelpixel wrote:
         | I think that's still worth mentioning considering they're
         | roughly in the same sphere of interest, to avoid the confusion.
        
       ___________________________________________________________________
       (page generated 2021-02-26 23:00 UTC)