19 ms·
Cosmopolitan Third Edition
- guidoism 3y agoI can't use wget from homebrew anymore on my computer because of some weird shared library crap but I can download this universal binary and it just works. Whaaaaat!?! So so so awesome.
- NeutralForest 3y agoThat's some pretty amazing stuff considering how difficult C/C++ portability is.
- eatonphil 3y ago> The end result is that if you switch your Linux build process to use cosmocc instead of cc then the programs you build, e.g. Bash and Emacs, will just work on the command prompts of totally different platforms like Windows and MacOS, and when you run your programs there, it'll feel like you're on Linux. However portability isn't the only selling point. Cosmo Libc will make your software faster and use less memory too. For example, when I build Emacs using the cosmocc toolchain, Emacs thinks it's building for Linux. Then, when I run it on Windows: > It actually goes 2x faster than the native WIN32 port that the Emacs authors wrote on their own. Cosmo Emacs loads my dotfiles in 1.2 seconds whereas GNU Emacs on Windows loads them in 2.3 seconds. Impressive stuff.
- AYoung010 3y agoThat was the most interesting part of the article for me. I don't understand how it can be faster, given that there's syscall translation going on. Is this more of a commentary on the quality of the `libc` available on Windows? Or on the quality of the GNU Emacs Windows port?
- PrivateButts 3y agoCould be like the improvements seen when running applications using DXVK. My understanding is that sometimes these translation layers can use newer and more efficient methods than the path that a native implement for the time would use. I'm not a subject matter expert though, and could be completely off base.
- vitiral 3y agoIIUC there is no syscall translation, it's more like there are separate libc implementations and the correct one gets selected at program start based on the OS.
- ReactiveJelly 3y agoSo like in-process WINE?
- kevincox 3y agoYes, this seems fairly accurate. In fact I think Wine supports this mode where you link Wine into a "windows program" at build time to produce a "native" Linux executable. So basically the difference is that you target a POSIX API rather than Win32 and the backend implementation is selected at runtime rather than build time. But both projects have the same idea that they will implement a particular API on multiple platforms.
- stephc_int13 3y agoThis is all super impressive especially for such a small team. But we should keep in mind that this project is what POSIX should have been, this is a big patch to make things right, as they should have been more than 20 years ago. It seems magical because of the failure of numerous other teams and people who never managed to tackle the portability issue with the right mindset and skills.
- zik 3y agoIs it the job of linux OS people to provide multi-platform executable compatibility with every other OS? That seems like a stretch considering that no OS has ever done that.
- uncomputation 3y agoYou have it backwards on two counts. First count is the point of POSIX is any OS vendor doesn’t need to worry about any other OS compatibility. Just implement POSIX interfaces. Second count is that is OP’s exact point: it never has been done before, because too many OS vendors give POSIX very little thought. This helps realize the original vision of POSIX.
- CharlesW 3y ago> First count is the point of POSIX is any OS vendor doesn’t need to worry about any other OS compatibility. Just implement POSIX interfaces. I must be missing something. How are you getting from "just implement POSIX interfaces" to "compile once run everywhere"? Wouldn't the former just promise that you could compile the same source on any POSIX-compliant OSs and get a binary that runs on that OS, on that architecture?
- gavindean90 3y agoIt's because cosmos implements POSIX in a portable way
- rhizome 3y ago
- smusamashah 3y agoWill it allow native like bash script support on Windows? I use windows as my main OS and use cmder for CLI things but really miss proper bash script support. Other than bash itself, does it mean it can be used to make whole set of GNU tools cross platform?
- jart 3y agoAbsolutely. cosmos-3.0.1.zip contains bash, GNU coreutils, Emacs, and a whole lot more. All of which run great on the Windows console. On our github release page, there's also a cosmocc zip of a GNU/Linux style GCC compiler. Cosmo provides a refreshing way to build Windows software, because we use the System V ABI (i.e. long is actually 64-bit) when we build Windows software. So there's a much more consistent cross platform development experience.
- smusamashah 3y agoTried running bash by renaming it to bash.exe using both CMD and Powershell and both return "Access denied. Even though Windows 10 already has Terminal and I was getting [error 2147942405 (0x80070005) when launching `C:\bin\bash -l'] I downloaded Terminal Preview which still throws the same error. Is Terminal or Terminal Preview the only way to run bash? There might be a way to configure cmder to use bash in a similar way you suggested for Terminal. Don't know how yet.
- jart 3y agoTry whitelisting the folder with Windows Defender. Sometimes when I get EACCES style errors on Windows mysteriously, it's because I need to recalibrate the security on the folder. Here's an example of something I ran once which fixed it. PS C:\WINDOWS\system32> $ACL = Get-ACL -Path C:\Users\jtunn PS C:\WINDOWS\system32> $ACL | Set-ACL -Path C:\bin I also just uploaded cosmos-3.0.1.zip to Microsoft Security Intelligence to make sure they get whitelisted with their cloud security.
- AMICABoard 3y agoDiscuss here: https://github.com/jart/cosmopolitan/discussions https://github.com/jart/cosmopolitan/discussions Add issues here: https://github.com/jart/cosmopolitan/issues https://github.com/jart/cosmopolitan/issues
- simonw 3y agoThere's so much cool stuff in this post. https://github.com/jart/cosmopolitan/releases/download/3.0.1/cosmos-3.0.1.zip https://github.com/jart/cosmopolitan/releases/download/3.0.1... is 213MB file which contains "fat binaries" (single binaries that execute on a bewildering array of hardware platforms and operating systems) for dozens of programs, including zip, curl, git, wget, python, ctags and even my own Datasette Python application! It's absolutely wild that this works. I just tried it out (on macOS). I downloaded and extracted that zip and did this: cd ~/Downloads/cosmos-3.0.1/bin ./python -c 'print(4 + 5)' It refused the first time because of macOS security settings. I had to open the security panel and click "allow"... and then it worked! Likewise, this worked: ./datasette -m datasette -p 8000 That started a https://datasette.io/ https://datasette.io/ server running on port 8000. Git works too: ./git clone https://github.com/simonw/sqlite-utils That git binary is 6.3MB, and I believe that same exact file can be copied to a Linux or Windows machine and will work the same way.
- simonw 3y agoHere's a bit of a clue to how it works: ./python Python 3.11.4 (heads/pypack1:65ac8ac, Oct 16 2023, 02:35:05) [GCC 11.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sqlite3 >>> sqlite3 <module 'sqlite3' from '/zip/Lib/sqlite3/__init__.pyc'> >>> import pathlib >>> list(pathlib.Path("/zip").glob("*")) [PosixPath('/zip/.symtab.amd64'), PosixPath('/zip/.symtab.arm64'), PosixPath('/zip/usr'), PosixPath('/zip/.cosmo'), PosixPath('/zip/Lib'), PosixPath('/zip/build')] From Python's point of view there a "/zip/" folder with stuff in it, presumably stuff that's hidden inside the fat binary.
- mhink 3y agoYup, this is basically it. If you check out the "Actually Portable Executable" blogpost by the same author [1] and go to the "PKZIP Executables Make Pretty Good Containers" section there's a note on the approach. 1: https://justine.lol/ape.html https://justine.lol/ape.html
- 3y ago
- sgammon 3y agoMind blowing, excited to play with Cosmo 3.
- AMICABoard 3y agoI swear this is the coolest project ever!!! I am using cosmo for our stuff too. jart & the team is super dedicated and responsive. Kinda feels like they are super intelligent alien beings from another planet trying to save us from software bloat and fragmentation. > POSIX even changed their rules about binary in shell scripts specifically to let us do it. I don't know what to say.
- 1970-01-01 3y agoIts not immediately clear what this is. The quick description is completely off on another part of the website on another webpage. TLDR: "Cosmopolitan" makes C a build-once run-anywhere language. So here's your very easy tip of the day: Describe what your thing does on the very same webpage you announce it. Very easy to do, but not done nearly enough.
- neogodless 3y agoI kind of felt that way, as it starts with the assumption you know what it is. The first sub-title headline tells you, but it isn't clear to someone new if this is "one of the features of something" or "the thing." > Build Once Anywhere, Run Anywhere C/C++ I clicked to the home page and then to here: https://justine.lol/cosmopolitan/ https://justine.lol/cosmopolitan/ Then I understood! > Cosmopolitan Libc makes C a build-once run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. While anyone familiar probably finds these comments "stupid", just some helpful advice to the author - if it matters to you, there are people discovering this for the first time who might not realize what "it" is until you tell them!
- 1970-01-01 3y ago>it starts with the assumption you know what it is. That's the gripe! It's all context! Here it is with SUNSHINE 3.0.1: After nearly one year of development, I'm pleased to announce our version 3.0.1 release of Sunshine. The project is an entirely new day. For starters, Apple sponsored our work as part of their FLOWER program. Google also awarded me an open source peer bonus for my work on Sunshine, which is a rare honor, and it's nice to see our project listed up there among the greats, e.g. OPEN, QUIT, etc. In terms of this release, we're living up to the great expectations you've all held for this project in a number of ways. The first is we invented a new widget that lets you grow large dirt which...
- compiler-guy 3y agoAn announcement on someone's project web site is not targeted at the random folks on Hacker News, or even random folks in general. They know their audience, and folks showing up from random places should do at least a little bit of work to figure out the context and surrounding pages. If you've never read their blog or announcements before, I don't know why you would expect them to cater to you. HN's headline policy makes it especially hard here, because the submitter can't provide context.
- gaucheries 3y agoThe author might be interested to know that this page might be displaying in an undesired way on iPhone mini screens: https://i.ibb.co/v4s0Xpj/IMG-1221.png https://i.ibb.co/v4s0Xpj/IMG-1221.png
- jart 3y agoEek. If anyone has a quick CSS fix for mobile I'll happily add it. I'm talking to some of my people too. Thanks for bringing it to my attention.
- imiric 3y agoI'm amused by the fact that even authors of the most technically brilliant projects in recent memory also struggle with CSS, just like us mere mortals. :) Love your work! <3
- _jackdk_ 3y agoThis is the only concession to mobile that I have on my website, and it seems to do okay: <meta name="viewport" content="width=device-width, initial-scale=1">
- account42 3y agoThis behavior really should have been the default in mobile browsers. It's not like emulating a desktop viewport actually makes giant tables usable on a tiny mobile screen so it would have been better to prefer not breaking pages that can reflow for a mostly useless hack.
- TheFlyingFish 3y agoI don't know, I think pinch-to-zoom + pan is a pretty decent way of dealing with pages that have more complex layouts than basic document, but were designed using e.g. tables for layout. Given that most non-trivial pages would have been laid out that way back when mobile browsers were first coming out, it seems like a reasonable tradeoff to me. That is to say, it's definitely a hack but I wouldn't call it useless, at least originally. These days it's a lot less useful since the number of pages that do benefit from this treatment has decreased dramatically. But at this point the die has been cast.
- deleted 3y ago[deleted]
- mamcx 3y agoThis could work with Rust? I have a great use case for it and could slash half of my CI if is true!
- vitiral 3y agoThe trick could definitely work with rust since fundamentally it's "just" a hack on how the various scripts work on different systems. Actually getting the rust compiler to produce cosmopolitan binaries would likely be a heavy lift though. Also it says it supports WASM (wasi?) so some applications might work out of the box with that.
- ahgamut 3y agohttps://github.com/ahgamut/rust-ape-example https://github.com/ahgamut/rust-ape-example My above repo contains example with the Rust standard library that build as fat executables with Cosmopolitan Libc. I also got ripgrep to build https://github.com/ahgamut/ripgrep/tree/cosmopolitan https://github.com/ahgamut/ripgrep/tree/cosmopolitan, but it wasn't part of the cosmocc binaries because some crates that are part of the build require `#!feature(rustc_private)]` to be added to their source code. Same goes for bat and fd. To summarize, Rust CLI tools can be built with Cosmopolitan Libc, but to build them like we can build gcc/emacs/git right now, we will need some support and Rust expertise.
- Georgelemental 3y agoLast time I looked into Rust-on-Cosmopolitan, I couldn't make it work as Cosmopolitan determined syscall numbers, signal numbers, and such at runtime, but Rust standard library assumes compile-time constants (basically the same issue that C switch-case has). How did you get around that? Have you tested these binaries on non-Linux platforms?
- jart 3y agoWe have about ~700 test executables and two programs called runit/runitd which remote execute them across our entire test fleet each time we run `make test`. Currently, the fleet consists of `freebsd rhel7 xnu win10 openbsd netbsd pi silicon`. We used to have rhel5 and win7 in there too, but I've been slacking off the past few months. You can watch a video of how running all the test executables on all the systems only takes about fifteen seconds. https://justine.lol/sizetricks/#why https://justine.lol/sizetricks/#why
- Alifatisk 3y agoCan I recompile Ruby with this and make the ruby runtime portable?
- ahgamut 3y agoTry it out! We got Lua/LuaJIT, Python, PHP, and Rust building (the latter two are not fully automatic yet), so Ruby might be possible even now.
- e12e 3y agoWhile I have no experience building ruby, if standard ruby gives you trouble - might be worth to try mruby - it is likely easier to build and debug the build process.
- sho 3y agoCounterintuitively, having messed around with building mruby for a project a few months ago, I found it harder to deal with. It's a lot more hardcore, with vastly fewer resources and more sharp edges, and is orders of magnitude less popular, so you find yourself hitting basic problems you would think would have been solved years ago. I'd stay away from it unless you have a very pressing need.
- NotSammyHagar 3y agoIt says arm64 linux support, I will have to try this on a raspberry pi. It’s kind of amazing and magical that this person pulled it off. We need a MacArther genius award for software. And this should be the first award.
- mprovost 3y agoEvery time I see an update from Justine I get so excited. It's like watching the future of computing unfold in real time. It makes me wish we could send them back in time - all of the pieces to make this work have been in place for a long long time but nobody connected all the dots. The funniest part of this post are the instructions to integrate it with autoconf. All of that autotools nonsense wouldn't have had to exist if this had been around!
- appleskeptic 3y agoThis is great and all but it’s fundamentally a toy. There are a number of tradeoffs involved here, all so that the same binary runs on multiple operating systems, which isn’t actually very useful. If your program isn’t vaguely portable to begin with, it still won’t work.
- semiquaver 3y agoCan you elaborate? I’m not sure I follow your argument. A requirement to write portable C doesn’t seem so insurmountable to render the project a mere toy. The suite of useful tools included in the post seems like a good counter example to the claim that this is inherently not useful for anything serious. Fat multi-arch binaries are a thing on other platforms like darwin, where they are used extremely widely. What makes this approach so different?
- refulgentis 3y agoI don't understand what's useful here either. It's not inherently useful to have my `ls` on Mac be the same one as chromeOS, I'm happy with whatever is on either. If this means I can FFI link against one ONNX library instead of one for linux64, Linux ARM, macOS arm, macOS Intel, android, iOS, win x64, win ARM, I'm all for it though.
- zamadatix 3y agoMulti-arch seems completely different than multi-platform. The former is obviously useful, the user isn't necessarily going to understand why a program which ran on their MacBook isn't runnable on their older iMac because it's ARM only. The two programs can also still use highly specific OS integrations, GPU acceleration APIs, and make assumptions about being a macOS system. The stretch to multi-platform comes at a much higher cost in limitations for a much more dubious level of gain, as badass as it is from a technical perspective. When I say "cost" e.g. on Windows I have to rename the executable to end in .exe be able to launch it, when I do simple text based programs like nano do run... but they are completely unusable. Bash runs but I can't select, copy, or paste text with the mouse. It's borderline unusable if the app does more than behind the scenes processing only. With that in mind, "plugins" to cross platform applications instead of standalone apps could be an interesting use case though. That's something which has typically went towards per platform, interpreted/jited, or VM'd solutions - all of which have their downsides for a typical user, don't really care about the rest of the system as much, and don't need to be anything but "behind the scenes processing" in most cases.
- haptic 3y agoThis is a neat trick and clever technical work, but is it useful in practical terms? Like, wouldn't you just download the binary that's been compiled specifically for the platform and architecture that you're using? Rather than relying on a potentially quite fragile method of cross-platform execution. In a way it kind of reminds me of Urbit. Very clever, very cool, but also very niche and more of a hobbyist showcase project than anything else. Not that there's anything wrong with that of course.
- pie_flavor 3y agoWrite once, run anywhere has been a slogan for coming up on thirty years. Except all implementations of it have acceded to reality in one or more important aspects, such as needing to install Java separately. And it's not just platform-specific compilation, it's everything that could support platform-specific compilation (if you've never tried to cross-compile from Linux to MSVC, you should), and also all sorts of platform-specific code (like console functions vs terminal sequences, or even stuff as banal as $HOME vs $USERPROFILE). Cosmopolitan still isn't perfect, because it doesn't emulate all of Linux, so you still need kernel32.dll here and there. But it is still the best of any attempts.
- jart 3y agoI agree. You sound like you're speaking from experience. If so, I'd love to hear what sort of stuff you're building with Cosmo, if you're able to share! Feel free to reach out anytime (privately or discord) and let me know what the project can be doing to better serve your needs.
- piaste 3y agoFor the consumer it's a simple switch(arch) statement to download the right binary. But for the developer, it means setting up 9 different build pipelines and artifacts (and realistically, most won't bother with BSD builds and a lot still don't bother with arm64 builds). It's not necessarily a huge hurdle or an unbearable expense with modern CI services, but it's still a massive deal that this project can make it all unnecessary for every single C/C++ developer out there. If this were a paid product, literally millions of companies would be happy to pay a small fee to save on CI costs, time and maintenance.
- gary_0 3y agoChristmas came early! Thanks, jart-Claus, it's just what I wanted!
- pie_flavor 3y agoIs specific effort being put in to dodge antiviruses? I've been unable to use redbean at work due to Crowdstrike deciding it's malware.
- jart 3y agoAuthor here. I invented a novel polyglot executable format that makes developers lives easier, and we're helping the AV industry feel comfortable with that through openness and transparency. Every time I ship a release, I make an effort to upload all the executables to Microsoft Security Intelligence to give them a heads up and let them know that I wrote them (since there's currently no vendor neutral solution for code signing). If you build APE binaries, then you should do that too: https://www.microsoft.com/en-us/wdsi/filesubmission?persona=SoftwareDeveloper https://www.microsoft.com/en-us/wdsi/filesubmission?persona=... Every time I submit the form, Microsoft whitelists them with zero hassle. They even let you upload a single zip file containing hundreds of executables, and they'll take care of them all. It's great. Doing that ensures Windows Defender won't cause issues. The good news is most other AVs are plugged into the same database as Defender (even Google Search bases their analysis on Microsoft's security intelligence) so that form actually gets you off the radar of a lot of AVs. As for CrowdStrike, if you have contacts there, then I'd be happy to share with them information about what our team is building and shipping, as well as documentation on the APE file format, in addition to free consultation from me for any help they need supporting it on their end. My email is in the blog post.
- andrew_shay 3y agoWhich options do you choose on that page before uploading?
- jart 3y ago- Product: Windows 10 Defender - Company Name: Justine Tunney - Incorrectly detected as malware/malicious - Detection Name: Trojan:Win32/Wacatac.B!ml - Additional Information (example): I'm the author of Redbean, an open source web server https://redbean.dev https://redbean.dev It uses a polyglot executable format called APE which I designed. My project has received positive coverage in the media: https://www.theregister.com/2022/06/20/redbean_2_a_singlefile_web/ https://www.theregister.com/2022/06/20/redbean_2_a_singlefil... Sadly we're having trouble with AVs. Could you unflag my release binaries? Thanks!
- dflock 3y agoCan we just put @jart in charge of computers now, please?
- DrNosferatu 3y agoWhat would be the best/lightest GUI-via-the-browser framework to employ with a program compiled as a Cosmopolitan fat binary? (say, Qt WebAssembly? ...something else?) Or is there a even better route to run-anywhere Cosmopolitan apps with a GUI?
- radiator 3y agoPerhaps, by the same authors, redbean, which "embeds Lua, SQLite, and MbedTLS into a fork() driven application server" ... " a great fit for when you want to build an app that's vertically integrated into a single tiny file that runs on nearly all PCs and servers". It looks like as of now, greenbean exists as well.
- rlawson 3y agoI second this. I'm a Java dev and so have been porting Spring Petclinic to redbean using fullmoon which is a Lua framework built on top of redbean by Paul Kulchenko (who also is the author of ZeroBrane studio - a nice lightweight Lua ide which I have been using). https://github.com/pkulchenko/fullmoon https://github.com/pkulchenko/fullmoon So far it's been a lovely experience and Paul is super responsive. Redbean is massively faster at startup so I can build/bounce to do hot reload in real time basically where the spring app takes about 6 seconds to start up.
- mscdex 3y agoGenerally speaking (I've not tested this kind of setup with the cosmopolitan libc) what I've done in the past with C is use something like libmicrohttpd along with some web assets linked into the executable (`xxd -i` can help you with the assets). That gives you a single (small) binary where you can use HTML/CSS/JS for the main GUI and logic. You can then integrate additional libraries as you please, such as sqlite3 to give yourself fast, local database access over an endpoint on the embedded HTTP/S/2 (or websocket) server.
- VikingCoder 3y agoI wish Wt were more open: https://www.webtoolkit.eu/wt https://www.webtoolkit.eu/wt Qt was doing their own thing for a while but scrubbed it, I think... Something something Flutter Web?
- spandextwins 3y agoDocker actually solved this quite a while ago with tags and downloads of the correct architecture container. But this is interesting even though it won't scale well.
- vanderZwan 3y ago> Even though it won't scale well. Why not?
- spandextwins 3y agoBecause each fork on either end will grow the hairball by a factor of x where x is the other end of the hairball. What a mess.
- stylepoints 3y agowhat do you mean by a fork?
- holoduke 3y agoYou cant compare these. And if you would then Docker would be Mcafee alike.
- c-c-c-c-c 3y ago> POSIX even changed their rules about binary in shell scripts specifically to let us do it. What does this refer to? The latest POSIX standard was released 2007. [1] 1: https://standards.ieee.org/ieee/1003.1/7101/ https://standards.ieee.org/ieee/1003.1/7101/
- mananaysiempre 3y agoPOSIX / SUS / the Open Group Base Specifications have issues (pun not intended, but I’ll take it), and then those issues have editions. The last one of those is from 2018[1], being a revision of (indeed) the 2008 issue. (I remember Landley being more than a little acidic about this versioning scheme.) I still have no idea what the quote is referring to, though, and given Justine’s slightly (deliberately?) unhinged manner of writing, I’d give even odds the change is in fact from 2001 or something like that. [1] https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/mindex.html https://pubs.opengroup.org/onlinepubs/9699919799.2018edition...
- csande17 3y agoThe references to POSIX "approval"/"changes" in Cosmopolitan docs are usually talking about bugs like this: https://austingroupbugs.net/view.php?id=1250 https://austingroupbugs.net/view.php?id=1250 I'm not sure whether the proposed changes have actually made it into a published edition of the specification.
- mananaysiempre 3y agoThis looks to be the one, thank you! Doesn’t look to have gotten into the current version [the sh(1) page in the version I linked still refers to text files]. (The bug is also tagged tc3-2008, when the last corrigendum released is TC2, and the change was marked applied in 2019. So it makes sense it hasn’t found its way into a release yet.)
- jart 3y agoAuthor here. See https://austingroupbugs.net/view.php?id=1250 https://austingroupbugs.net/view.php?id=1250 and https://austingroupbugs.net/view.php?id=1226 https://austingroupbugs.net/view.php?id=1226 with a major shoutout to Jilles Tjoelker from the FreeBSD who helped make it possible back then!
- davikr 3y agoTrying to run Cosmos apps from the Windows Terminal opens a pop-up saying "Select an app to open '<app>'". How can I execute them? I ended up finding a solution: > If you want to run them on Windows, then you simply need to rename the file so that it has the .com suffix. Better yet, consider making that a symlink (a.k.a. reparse point).
- jart 3y agoWhat I like to do is configure Windows Terminal Preview so it launches `C:\bin\bash -l` as my command prompt. Once you're inside bash, it doesn't care about the .com or .exe suffix being there. Only CMD.EXE really cares about the suffix. So you have to simply rename the files if you want to run it there.
- NKosmatos 3y agoWhat kind of sorcery is this??? Just kidding, I’ve played around with some of the stuff @jart and other contributors have created and it’s mind blowing. Well done and keep up the good work.
- matheusmoreira 3y agoCongratulations on your release and sponsorships! > In the Cosmos, every program is statically linked and contains a PKZIP central directory where its /usr/share dependencies are embedded. Sounds really neat, even the data and configuration files are linked into the executable. Can't wait to see what else you'll come up with.
- vanderZwan 3y ago> However portability isn't the only selling point. Cosmo Libc will make your software faster and use less memory too. With that in mind, is there a "slim binary" mode that lets me only export the code to run the binaries on my system, so that I can reap these benefits for personal use without added "bloat" for a feature that I won't need? (where "bloat" is contextual, with the current context being "not actually planning to make use of portability")
- jart 3y agoAuthor here. We've got you covered. Search for `MODE=tinylinux` in the https://github.com/jart/cosmopolitan#getting-started https://github.com/jart/cosmopolitan#getting-started section of the README. If you use that build mode, then hello world for x86 linux is only 8kb in size. It's very similar to what you'd expect from Musl Libc. All the Windows / BSD / Mac / BIOS stuff gets removed from the compilation. That predefined mode is actually a friendly wrapper around a more generalized platform support system Cosmopolitan offers, which is called `-DSUPPORT_VECTOR` where you can define a bitset of specifically what platforms you want to be supported. Then dead code elimination takes care of the rest. The same concept also generally applies to microarchitecture support, where you can have as much or as little runtime dispatching as you want.
- havnagiggle 3y agoWould you consider this a competitive replacement of Busybox? Curious if you've compared, since they also take liberty in cutting out uncommon functionality.
- mananaysiempre 3y agoI think you can subset supported systems, like you could only compile for x86_64 ELF systems (aka Linux and *BSD) and have the shim be much smaller; presumably a subset of one is also acceptable. I don’t know how (or if) you can do this with the new build environment, though.
- cryptonector 3y ago
- dataflow 3y agoAs awesome as these are, they're not really portable executables if you can't set their setuid bits and expect them to run as root like with normal executables, right?
- jart 3y agoThere's a program that's part of cosmos called `assimilate` which can turn any APE binary into a platform-specific binary. jart@nightmare:~$ /opt/cosmos/bin/assimilate --help assimilate: illegal option -- - actually portable executable assimilate v1.6 copyright 2023 justine alexandra roberts tunney usage: assimilate [-xapembfchv] [-o PATH] FILE... -h show help -v show version -f ignore soft errors -b don't remove freebsd from elf os/abi -c clobber input path w/o making backup -e convert to elf regardless of host os -m convert to macho regardless of host os -x convert to amd64 regardless of host cpu -a convert to arm64 regardless of host cpu -p convert to ppc64 regardless of host cpu -o PATH write modified binary to different file If you aren't using binfmt_misc then you can also pass the `--assimilate` flag to your APE binary, to turn it into a native executable, without having to use the tool. It's baked into the shell script. Just use the `less` command on any APE file and read the shell script. Once assimilated, you're free to turn it into a setuid binary. We also have patches in flight for the Linux Kernel as well as BSDs, to make APE native. https://justine.lol/ape.patch https://justine.lol/ape.patch
- Fraterkes 3y agoVery cool! What would the "gui-version" of this look like? Would you write it once with linux bindings and the executable would succesfully create a window in every operating system?
- jart 3y agoI think it'd be pretty sweet to have a basically an APE approach to having a blank GPU framebuffer canvas, and let high level libraries do the rest. Other folks on my team have been floating the idea of getting X to build as an APE binary. Who knows what the future holds? We don't have any resources devoted however to the problem at the moment.
- nightowl_games 3y agoMaybe could APE the web GPU implementations: Google's "dawn" or Mozilla's "wpgu".
- VikingCoder 3y agoThis seems like a good place to start: https://eliemichel.github.io/LearnWebGPU/ https://eliemichel.github.io/LearnWebGPU/ I think it'd have to be built into the libc...?
- jamesgeck0 3y agoOh man, something like that would be wonderful for indie games. Targeting multiple platforms is a lot of work for a hobbyist game developer, especially if you're not using a full-on engine like Unity or Godot.
- AndyKelley 3y agoI'm getting MITM'd by my ISP when trying to view this site and some others. It manifests as an SSL certificate error, and if you ignore the warning, it shows that stupid mcafee thing. Does anyone know how to not get MITM'd by my ISP? I'm already using DNS servers 1.1.1.1, 1.0.0.1.
- adamrezich 3y agowhich ISP? that's pretty wild
- AndyKelley 3y agocenturylink. if they had any competitors, I would switch immediately. but it's a monopoly
- kridsdale3 3y agoExperiencing the same thing with the same ISP.
- beautron 3y agoSame for me on centurylink. I've run into this on a number of sites. I don't like it.
- joveian 3y agoI use a SOCKS5 proxy on ramnode.com (from when they had OpenVZ for $15/year, which I think hasn't been available as a new plan for a bit now and I think will be increased or removed as an option at the next biling period; it looks like the lowest cost option is now $42/year). I change SSH to only allow certificate login (and only the particular algorithms I want to use, and listen on ports 80 and 443 to work around some wifi limitations), enable auto OS updates, and stop everything else from listening on the network to keep the chance of something being exploitable to the minimum and it just works. I sparately pass local port 853 to Google's DNS over TLS via the SSH connection (I use ssh -o VisualHostKeys=yes -NMD localhost:2000 -L localhost:853:8.8.8.8:853 and set ALL_PROXY=socks5://127.0.0.1:2000; I've learned that the visual host keys do not help at all with the thing it is supposed to do but I find it an artistic way of saying the connection is up). I'm not sure how common it is for hosting providers to allow that kind of traffic (I think many do not) and I'm not sure how their privacy policy for that kind of use compares to others but at least they don't try to MITM traffic. Occasionally I get sites that simply block the address range (like Wikipedia for editing last I checked, although viewing works fine) and limitations or oddities will likely be worse at first (Google really wanted to redirect me to their Hong Kong search page for a while when I first stared doing this) but it is rare that I have an issue now. I'm also on CenturyLink (which I chose as still better than Comcast since you can at least use your own device) and I recommend this method (also helpful when using wifi). Another potential downside is that you don't get the local CDN caches, which I'd guess most impacts the online movie services (I don't use them and only have a 12mbps download anyway so it would hardly be the bottleneck). I think routing DNS through SOCKS helps get the closest CDN locations to the proxy (at least using encrypted DNS is a must since CenturyLink messes with that too if you try to use another DNS provider unencrypted).
- KolmogorovComp 3y ago> the Cosmopolitan monorepo has two million lines of code Anyone knows roughly how it is broken down? Because that seems massive for a small team. Or is it counting the LOCs of softwares it has wrapped up/fork of libc?
- jart 3y agoA lot of it is actually vendored code under third_party/ e.g. Python 2.6, libcxx, compiler_rt, zlib, etc. I don't like to write anything myself if I don't have to. Here's a synopsis of how many lines of code are contained in the subset of packages that me and my team (mostly) wrote ourselves. $ for x in ape examples libc/* tool/* net/* test/*/*; do echo $x $(wc -l $x/*.{c,cc,S,h,sh,mk,inc} $x/*/*.{c,cc,S,h,sh,inc} $x/*/*/*.{c,S,h,sh} $x/*.S | tail -n1 | awk1); done 2>/dev/null | sort -nrk2 | head -n25 libc/calls 38690 libc/tinymath 33400 (mostly copied from fdlibm/arm/musl/freebsd/openbsd actually) libc/intrin 28243 (a good chunk of this is from arm and llvm) libc/nt 26738 (it's just win32 interface boilerplate) libc/stdio 21829 examples 19740 (a big chunk of that is actually dash) libc/sysv 18305 tool/build 17811 test/libc/xed 17581 (mostly generated actually) libc/nexgen32e 16695 tool/net 15058 libc/str 12150 tool/viz 11511 libc/runtime 10823 test/libc/calls 9460 ape 7507 libc/sock 7436 tool/plinko 7075 libc/proc 6956 net/http 6901 libc/thread 6757 libc/vga 5518 test/libc/stdio 5057 libc/log 4759 libc/time 4749 test/libc/tinymath 4555 libc/testlib 4217 That comes out to 429,866 lines. Every file has a copyright header saying where it came from. So a lot of those lines are just copyright notices repeated over and over again. It also means if anyone is bored, there's an opportunity to do some deeper analysis.
- DrNosferatu 3y agoWhat happened to bare metal support? Nevertheless - well done!
- DrNosferatu 3y agoAny progress on compatibility with the Zig language? - Nevertheless, well done!
- stuaxo 3y agoFantastic work. For a long time I've been dreaming about things that trancend OSs, this is some very impressive portability.
- nwmcsween 3y agoHmm could this go one level higher? Could cosmopolitan be used to create a super portable bare metal unikernel applications?
- jart 3y agoAll APE executables are also unikernels that boot from BIOS. Here's a demo video of the APE executable for SectorLISP (ANSI C version) running in the Blink emulator (which I wrote originally just to test this): https://storage.googleapis.com/justine/sectorlisp2/sectorlisp64.mp4 https://storage.googleapis.com/justine/sectorlisp2/sectorlis... When you compile an APE program with cosmocc, the first 512 bytes are a master boot record where we embed a BIOS bootloader in the PE DOS stub section of the executable. APE is then able to tell when the BIOS is what loaded it, switch to 32-bit mode, set up the page tables, enter 64-bit long mode, and then call _start() and main(). I personally haven't been focusing on bare metal support myself the past several months, but we've got a talented member of the team (tkchia) who actively works on maintaining metal and expanding its capabilities. See also the list of supported system calls for bare metal here: https://justine.lol/cosmopolitan/functions.html https://justine.lol/cosmopolitan/functions.html As you can see, we still have a lot of work to do. But it's really cool to have, and I have high hopes for it someday as a cloud native deployment format. Hypervisors are in many ways the new OSes, so why do we need a traditional OS in-between?
- cromniomancer 3y agoThere is so much to unpack in this comment alone, I am absolutely floored. I can't wait to play with this and tell anyone who will listen to play along too.
- stylepoints 3y agoWhat is the most complicates program in cosmos distro that can boot on bare metal?
- hju22_-3 3y agoI wonder if those people using emacs as an OS by discount booting into it can now finally get their wish of directly booting into emacs lol.
- modeless 3y agoI'm using Pyinstaller to ship a zero-dependency Python app. It would be amazing if Cosmopolitan could make it portable too. Is anyone working on Pyinstaller+Cosmopolitan integration? I guess a key issue there would be that many Python dependencies ship C extensions which are typically distributed as prebuilt platform-specific binary "wheel" packages via pip. I guess pip would need to start hosting a Cosmopolitan flavor of wheel package in addition to the native ones?
- ahgamut 3y agoWhat packages do you use in your app? If you're not using too many C extensions, it may be possible to build your app with Cosmopolitan.
- modeless 3y agoLots of C extensions. Has anyone gotten PyTorch working with Cosmopolitan? With CUDA?
- paulclinger 3y agoThere is no support for dynamic libraries in Cosmopolitan right now, so the libraries would either need to be compiled in (statically) or included in the archive as Python-only libraries. With the later ones, it should be a matter of adding them to the zip archive within the cosmo python executable, which should make them available to your scripts. See the discussion elsewhere in this thread (https://news.ycombinator.com/item?id=38102629 https://news.ycombinator.com/item?id=38102629) for some additional details.
- jart 3y agoWhat I would prefer to see happen in the Python community is for Python packages to embed APE binaries and launch them as subprocesses (ideally using posix_spawn) because then you can mostly just ship pure Python with a few APE programs for your native needs, and nothing about the Python packaging ecosystem needs to change. That was my dream when I worked on the TensorFlow team. One of the questions I asked myself is, if a MatMul kernel takes milliseconds to perform an op, and it takes microseconds to launch a subprocess, then why do I need to dynamically link a 50mb TensorFlow DSO when I can just whip up a simple C program to perform the very small amount of native math, system calls, and data crunching that I need for TensorBoard? Well, now with Cosmopolitan, it's finally possible. Just whip up the ~100 or so lines of C/C++ code that's impossible to do with Python into a small fat static APE binary, and vendor that program like any other .txt or .dat file asset. Then launch it when you need to, while never caring or needing to worry about shipping multiple .whl files or setting up Jenkins build farms for BSDs, Windows, etc. Life stays easy.
- hughes 3y agoWhat's almost as impressive as the project itself is the author's responsiveness here. Specifically, they have already built a solution for almost everyone's "but what about my niche use case" reply. Seems to be a really well thought-out project.
- AMICABoard 3y agoSuper fast. Love of the craft! Never had an experience where wizard type of coders of projects would respond and fix so fast, even before you finish testing of the previous stuff :)
- cryptonector 3y agoWow!!
- cryptonector 3y agoHow about dynamic linking? Yeah, ok, that's hard. You might have to write an RTLD to link into the executable to find and load cosmo DLLs. Maybe not that hard... You could borrow BSD ld.so.1 code, I suppose. Ah, that brings me to something else that someone like jart might want to take on: # bringing static linking for C into the 21st century What's wrong with static linking in C? Well, it's still stuck with 1970s semantics, while dynamic linking has much nicer semantics. Specifically: - static linking flattens the dependency tree, which causes - symbol collision issues - also, there's no RPATH equiv. for static linking My thinking is to: - write dependency metadata (-lfoo, rpath, -L/...) into a "hidden" .o that has just this metadata encoded in it - make the static linker look for that metadata in dependencies and resolve conflicts the same way as in dynamic linking - for each link-edit, including the final link-edit of the executable, require only that direct -lfoo dependencies be listed Well, anyways, it's a lot to ask :(
- deleted 3y ago[deleted]
- athrun 3y agoNot disagreeing with your overall point, but symbol collision is still very much an issue with dynamic linking on Linux right? AFAIK, the gnu dynamic linker doesn't do any namespacing (as opposed to Solaris').
- cryptonector 3y agoLinux has versioned symbols, and Solaris/Illumos has direct binding. The two schemes achieve roughly the same result: that the bindings made at link-edit time are the bindings you get a run-time. In the versioned symbols case this is done via decorating symbols in the dependent with the SONAME and version of the dependency that is expected to provide them. In direct binding this is done by decorating symbols in the dependent with just the SONAME of the dependency that is expected to provide them. The versioned symbol technique allows a shared object to provide multiple versions of a symbol with the same name, which can be useful for some things, but direct binding is just much easier to use than versioned symbols: just add `-B direct` to the link-edits and you're done. Even in the absence of symbol versioning and direct binding, the fact that each object records its dependencies means that symbol conflicts will be only among those dependencies, and this can be discovered at link-edit time. LD_PRELOAD interposers, on the other hand, can cause symbol conflicts in spite of all the foregoing. For this you can use `-B protected` or similar, but you may not want to.
- ativzzz 3y agoMaybe my imagination isn't good enough or maybe I've spent too much time on web apps, but as a developer, why would I use this over just making a web app if my goal is cross compatibility? Users don't install software anymore, outside of mobile. Most things are now doable through the browser. The browser isn't perfect, but from a user perspective, it's a much better app delivery service than anything that's existed before The only things I find myself installing recently are text editors, programming languages/command line tools, and games. What else? WSL is pretty good so I can even run a lot of Linux things from within Windows now If I need something that needs raw power that's too much for a browser, like a database server or running an LLM model, I'm just gonna use Linux - why do I need cross compatibility?
- retrocryptid 3y agoBecause the world is not entirely a web browser.
- arthurcolle 3y agocould be useful for malware developers to be fair, no?
- jerbear4328 3y agowell, couldn't all advancements in this kind of technology be useful to malicious people?
- porcoda 3y ago> Users don't install software anymore, outside of mobile. That’s a pretty strong statement without any evidence to back it up. It sounds like the kind of statement I hear often from people who spend all of their time in the web-dev echo chambers. Lots of us install software and don’t spend much time in browsers beyond browsing the web and the handful of Electron apps that we have no choice but to use.
- zztop44 3y agoMuch software remains outside the browser, yes. Especially games and professional tools. But it’s not hyperbole to say the browser has become the dominant software delivery platform outside of mobile. Email, CRMs, CMSs, electronic dictionaries, word processors, online chat, filing tax returns are just a few examples of things that used to require installing native apps and now are largely browser-based.
- ccooffee 3y agoI'm amazed by this. Platform-independence _with the same binary_ is such a neat solution that would really have helped me at a prior job. Some corporate IT shops manage user machines with tooling that can't deploy software specific to machine os/version/hardware/etc. This often caused problems with 32-bit vs 64-bit windows machines or differing windows versions (XP/Vista/....). We also couldn't easily make linux or osx executables available for the end-users due to corporate IT policies.
- qwerty456127 3y ago> ARM64: Linux, MacOS, Windows (non-native) Why non-native?
- jart 3y agoThe Windows platform doesn't run the APE shell script which checks $(uname -m). I don't know yet if it's possible to have a fat portable executable. I would hope that it's possible. I may be mistaken but I vaguely seem to recall reading about portable executables that existed a long time ago that had multiple optional headers for both Windows and OS/2. It would be nice if Microsoft did, or could, make that possible today, so we can have arm64+amd64 pe binaries. Until then, we need to rely on Microsoft's excellent x86-64 emulation support.
- Art9681 3y agoThis is a dizzying amount of awesome information and im not sure what to make of it. I've been in enough rabbit holes lately. Where are the Golang examples I can go reference? Id be interested in testing this out for my Go experiments.
- nickgravel 3y agoImpressive! Tried on my M1 Mac but no immediate success though. bin ./bash zsh: exec format error: ./bash
- jart 3y agoYou need to upgrade to zsh 5.9, or backport the patch I sent them two years ago: https://github.com/zsh-users/zsh/commit/326d9c203b3980c0f841bc62b06e37134c6e51ea https://github.com/zsh-users/zsh/commit/326d9c203b3980c0f841... If you can't upgrade zsh, then the workaround is to say `sh -c ./ape-program` or `bash -c ./ape-program` instead of `./ape-program`.
- ReactiveJelly 3y agoI don't feel like programming anymore
- jacquesm 3y agoUsually when I see yet another variation on this theme my first response is 'oh not, not again', but this time it is more like 'wow, that's really cool' and I hope that it will be further established and that it will see much adoption. Of course to get fewer distribution formats you had to make one more distribution format but in this one case it might actually work.
- smcameron 3y agoCool. Somebody still needs to teach sscanf how to parse floats though. https://github.com/jart/cosmopolitan/issues/456 https://github.com/jart/cosmopolitan/issues/456 The code to do it would probably go in here: https://github.com/jart/cosmopolitan/blob/master/libc/stdio/vcscanf.c https://github.com/jart/cosmopolitan/blob/master/libc/stdio/... I mean, I know why it's not done (parsing floats correctly is a lot harder than it would at first seem to be) and I'm not complaining, more like hinting to some of the fine people that haunt this website who might find such a task interesting.
- matheusmoreira 3y agoIs anyone working on this? I'll try it out. I've been reading all I can about floats the past few days in order to add support for them in my language. Perfect opportunity.
- jart 3y agoI'm so happy to hear you're interested in this problem. There's two packages in the Cosmo repo you could depend on for doing this: third_party/double-conversion/ and third_party/gdtoa/. Both libraries are pretty good, but I think double-conversion is the more impressive of the two. It'd be great to see scanf() parse floats with double-conversion if it's possible. One last thing, if any of the non-standardized features of our scanf() implementation get in your way, then I'm not super attached to them and they can be deleted.
- matheusmoreira 3y agoI see. I'll try those libraries out. Was about to try writing my own algorithm despite not having a math background. The libraries will definitely be easier. Cosmopolitan can actually link against those despite being the libc? I'm building my copy of cosmopolitan right now. If I succeed, I'll send you a pull request on GitHub.
- matheusmoreira 3y agoPull request sent. https://github.com/jart/cosmopolitan/pull/924 https://github.com/jart/cosmopolitan/pull/924 Oops, I only now realized there's a test suite. I'll be adding tests too... After I get some sleep.
- arthurcolle 3y agohow many cl100k_base tokens is this in terms of LOC
- andrew_shay 3y agoReally cool!
- fbdab103 3y agoUsing Cloudflare DNS, I can never load jart's homepage. Does the .lol domain get blocked? Is there anyway to see "naughty" domains which might be getting intercepted?
- AMICABoard 3y agocloudflare and dns over https via cloudflared works for me...
- globular-toast 3y agoRun your own DNS server. It's really easy and a worthwhile upgrade for your home network. https://nlnetlabs.nl/projects/unbound/about/ https://nlnetlabs.nl/projects/unbound/about/
- BaculumMeumEst 3y agoone of the problems i've always had with emacs on windows is that random commands want to shell out to non-standard programs, so they fail unless you dig around and tweak your system. I hit this immediately in the APE version by trying to download use-package. Packages to install: 1 (use-package-2.4.5). Proceed? (y or n) y Operation [ Install 1 ] started Contacting host: melpa.org:443 Opening TLS connection to ‘melpa.org’... Opening TLS connection with ‘gnutls-cli --x509cafile nil -p 443 melpa.org’...failed Opening TLS connection with ‘gnutls-cli --x509cafile nil -p 443 melpa.org --protocols ssl3’...failed Opening TLS connection to ‘melpa.org’...failed
- pvsukale3 3y agoHow would one go about compiling Ruby to make a cross platform binary? I have seen the Ruby build process and it also links to libraries like OpenSSL. Reference: https://docs.ruby-lang.org/en/master/contributing/building_ruby_md.html https://docs.ruby-lang.org/en/master/contributing/building_r...
- sime2009 3y agoCosmopolitan is cool and I have some uses in mind for it that I wish to get to. But what I don't understand is the use case for an exe which supports both running as an user app on normal operating systems and from the BIOS. For which application specifically does it makes sense to run it in both these very different contexts?
- cylinder714 3y agoEmacs could become an actual operating system!
- regularfry 3y agoLook at it the other way round, from someone who wants to put something in the BIOS. It's going to be much more convenient to be able to test as much of that as possible without leaving user mode and actually having to run it by restarting a (potentially virtual) machine. But also: sbcl. You just know someone's going to do lisp-from-boot with this, if they haven't already.
- jart 3y agoDefinitely. https://justine.lol/sectorlisp2/ https://justine.lol/sectorlisp2/
- shantnutiwari 3y agoI might be stupid-- but what is this again? Nor clear from the description...
- dublinben 3y agoIf you click through to the Github homepage of the project, this is the description: Cosmopolitan Libc makes C a build-once run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. Instead, it reconfigures stock GCC and Clang to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS with the best possible performance and the tiniest footprint imaginable.
- supriyo-biswas 3y agoThe article says it has support for arm64 Macs, but I get this weird error on Sonoma: ``` ~/cosmos $ uname -sm Darwin arm64 ~/cosmos $ ./bin/python ape error: ./bin/python: prog mmap failed w/ errno 1 ~/cosmos $ ./bin/ls ape error: ./bin/ls: prog mmap failed w/ errno 1 ~/cosmos $ sudo xattr -rd com.apple.quarantine bin/* Password: ~/cosmos $ ./bin/ls ape error: ./bin/ls: prog mmap failed w/ errno 1 ``` Has anyone had any luck getting it to run on Macs?
- lkuty 3y agoIt is ok on M2 with macOS 13.6.1 (Ventura). Maybe there is something specific to Sonoma ? $ ./uname -sm Darwin arm64 ludo@mba in ~/Downloads/cosmos-3.0.1/bin $ ./python Python 3.11.4 (heads/pypack1:65ac8ac, Oct 16 2023, 02:35:05) [GCC 11.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
- skywal_l 3y agoIf I was a billionaire, I'd just give a shitload of money to Justine, Andrew Kelley and Andreas Kling (from the Serenity/LadyBird projects) and put them in a (virtual) room together and let them do their thing. You'd get a new browser running on any hardware/OS written in Zig that would just blow out the competition. Oh and let's throw in Fabrice Bellard in there too just for the kicks.
- VikingCoder 3y ago...I kind of want Patreon collections...? Like, you could make a Patreon Collection out of those people's Patreons / Buy Me A Coffee / Bitcoin wallet... And someone else could make a Collection out of a slightly different subset of people... And I could take your Collection and purposefully exclude one person from it, and publish it as a new Collection... ...and then we could all argue about which Collection to support on Patreon... Oh, and Justine could say, "Well, sure, but 50% of the support I get should actually go to this other Collection..." And then there's a Cycle in the Graph and the universe explodes...
- JaDogg 3y agoAwesome, congratulations!, I am jealous that I cannot start my own thing yet :( I have been wanting to integrate this with one of my projects. :(
- meifun 3y agoAmazing work. So many useful projects. Another Fabrice Bellard.
- VikingCoder 3y agoI'm so excited about this I can hardly think straight... I think the next thing I want is WebGPU... No, wait, I want Tailscale to be built into applications... Or the smallest possible Linux that can run this... as a Live USB...? And I want z-machine interpreters ported to this... And the Protocol Buffers Compiler... And I want to run Turbo Pascal 3.0 on this somehow... Ooh, how about Qemu ported to this? And and and... I feel like a kid trying to pick a puppy to adopt!
- barryrandall 3y agoI'm just relieved to see a "cross platform" anything that doesn't involve wrapping things in Chrome.
- VikingCoder 3y agoI need cosmo katas... I also want a place where I can contribute to bounties (money) to implementing different things in or on cosmo...