Zero-native - Build desktop + mobile apps with Zig and web UI

Apparently, Vercel is using Zig now.

This appears to be the first major software project primarily “written” in Zig by Vercel.

9 Likes

Interesting. Not exactly an Electron competitor, but seems to be something along those lines. Nice to see someone trying Zig out.

Create a native desktop app with a web UI in under a minute.

Not sure they fully understand what a “native desktop app” is. It’s still a browser in a trench coat.

2 Likes

Agree with you but even I who really don’t like javascript can agree that a ui beyond something like imGui would be pretty dreadful in a native language. Unless you have a whole framework like Qt or something.

I am guilty of not advertising my projects enough but we have webview example in tokamak too. No vercel, and I think it’s way simpler.

4 Likes

I didn’t follow Vercel, but I guess it’s why they wanted / how they attracted mitchellh on the board.

Just stumbled across this too. It says in their README (now at GitHub - vercel-labs/native: Toolkit for building native desktop apps · GitHub):

No browser, no WebView, no JS runtime in the binary

Their build.zig is quite something, and definitely reeks of “nah, still using web tech” - maybe using the system’s WebView in some capacity.

1 Like

It’s heavily AI developed, so I could see that they would have on their README that it is “native” and doesn’t use a browesr/js runtime while still using a webkit or webview binding.

If they are linking to webkit/webview dynamically, then technically the binary produced doesn’t have a browser/webview/js runtime.

native app shell with WebView content.

Yeah, this is still just a browser in a trench coat.

It’s a nice way to make easy to distribute apps since it doesn’t need to bundle electron or another browser. Plus you can use web tech for UI which is all mostly common across platforms with benefit of native functions when you want them.

2 Likes

At least, you can give it a try first to see how it works.

I don’t see any browser dependencies here. However, you can also create a webview-based app too.

	linux-vdso.so.1 (0x00007f31142d1000)
	libgtk-4.so.1 => /usr/lib/libgtk-4.so.1 (0x00007f3113600000)
	libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0x00007f311423b000)
	libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0x00007f3114201000)
	libcairo.so.2 => /usr/lib/libcairo.so.2 (0x00007f31134c3000)
	libgraphene-1.0.so.0 => /usr/lib/libgraphene-1.0.so.0 (0x00007f31141e1000)
	libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0x00007f31132e4000)
	libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007f311417e000)
	libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007f3113181000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007f3112e00000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f31142d3000)
	libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007f3114177000)
	libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x00007f3114163000)
	libharfbuzz.so.0 => /usr/lib/libharfbuzz.so.0 (0x00007f311304b000)
	libharfbuzz-subset.so.0 => /usr/lib/libharfbuzz-subset.so.0 (0x00007f3112ccb000)
	libfribidi.so.0 => /usr/lib/libfribidi.so.0 (0x00007f311302b000)
	libcairo-gobject.so.2 => /usr/lib/libcairo-gobject.so.2 (0x00007f311415a000)
	libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007f3112c50000)
	libepoxy.so.0 => /usr/lib/libepoxy.so.0 (0x00007f3112b43000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007f3112a0c000)
	libgstplay-1.0.so.0 => /usr/lib/libgstplay-1.0.so.0 (0x00007f31129e8000)
	libgstvideo-1.0.so.0 => /usr/lib/libgstvideo-1.0.so.0 (0x00007f3112909000)
	libgstreamer-1.0.so.0 => /usr/lib/libgstreamer-1.0.so.0 (0x00007f3112796000)
	libgstgl-1.0.so.0 => /usr/lib/libgstgl-1.0.so.0 (0x00007f3112700000)
	libgstallocators-1.0.so.0 => /usr/lib/libgstallocators-1.0.so.0 (0x00007f31126f6000)
	libXi.so.6 => /usr/lib/libXi.so.6 (0x00007f31126e1000)
	libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f311259f000)
	libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0x00007f3112580000)
	libcloudproviders.so.0 => /usr/lib/libcloudproviders.so.0 (0x00007f3112568000)
	libtinysparql-3.0.so.0 => /usr/lib/libtinysparql-3.0.so.0 (0x00007f3112494000)
	libvulkan.so.1 => /usr/lib/libvulkan.so.1 (0x00007f31123f6000)
	libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f31123b9000)
	libtiff.so.6 => /usr/lib/libtiff.so.6 (0x00007f3112321000)
	libjpeg.so.8 => /usr/lib/libjpeg.so.8 (0x00007f3112279000)
	libxkbcommon.so.0 => /usr/lib/libxkbcommon.so.0 (0x00007f311221a000)
	libwayland-client.so.0 => /usr/lib/libwayland-client.so.0 (0x00007f311220a000)
	libwayland-egl.so.1 => /usr/lib/libwayland-egl.so.1 (0x00007f3113026000)
	libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f31121f6000)
	libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0x00007f31121e9000)
	libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0x00007f31121e4000)
	libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0x00007f31121dc000)
	libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0x00007f31121cf000)
	libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0x00007f31121ca000)
	libcairo-script-interpreter.so.2 => /usr/lib/libcairo-script-interpreter.so.2 (0x00007f31121a8000)
	libcups.so.2 => /usr/lib/libcups.so.2 (0x00007f3112117000)
	libcolord.so.2 => /usr/lib/libcolord.so.2 (0x00007f31120c0000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f3112093000)
	libthai.so.0 => /usr/lib/libthai.so.0 (0x00007f3112088000)
	libglycin-2.so.0 => /usr/lib/libglycin-2.so.0 (0x00007f3111c00000)
	libz.so.1 => /usr/lib/libz.so.1 (0x00007f311206d000)
	libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f3111b30000)
	libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007f3112061000)
	libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f3112034000)
	libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007f3112025000)
	libxcb-shm.so.0 => /usr/lib/libxcb-shm.so.0 (0x00007f3112020000)
	libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0x00007f3111a81000)
	libmount.so.1 => /usr/lib/libmount.so.1 (0x00007f3111a25000)
	libffi.so.8 => /usr/lib/libffi.so.8 (0x00007f3112010000)
	libpcre2-8.so.0 => /usr/lib/libpcre2-8.so.0 (0x00007f3111977000)
	libgraphite2.so.3 => /usr/lib/libgraphite2.so.3 (0x00007f3111954000)
	libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f3111926000)
	libgsttag-1.0.so.0 => /usr/lib/libgsttag-1.0.so.0 (0x00007f31118e7000)
	libgstpbutils-1.0.so.0 => /usr/lib/libgstpbutils-1.0.so.0 (0x00007f31118a2000)
	libgstbase-1.0.so.0 => /usr/lib/libgstbase-1.0.so.0 (0x00007f311181a000)
	liborc-0.4.so.0 => /usr/lib/liborc-0.4.so.0 (0x00007f311171e000)
	libunwind.so.8 => /usr/lib/libunwind.so.8 (0x00007f3111703000)
	libdw.so.1 => /usr/lib/libdw.so.1 (0x00007f3111661000)
	libEGL.so.1 => /usr/lib/libEGL.so.1 (0x00007f311164f000)
	libGLX.so.0 => /usr/lib/libGLX.so.0 (0x00007f311161e000)
	libwayland-cursor.so.0 => /usr/lib/libwayland-cursor.so.0 (0x00007f3112003000)
	libX11-xcb.so.1 => /usr/lib/libX11-xcb.so.1 (0x00007f3111ffe000)
	libgudev-1.0.so.0 => /usr/lib/libgudev-1.0.so.0 (0x00007f3111612000)
	libdrm.so.2 => /usr/lib/libdrm.so.2 (0x00007f31115fb000)
	libgbm.so.1 => /usr/lib/libgbm.so.1 (0x00007f31115f3000)
	libjson-glib-1.0.so.0 => /usr/lib/libjson-glib-1.0.so.0 (0x00007f31115c9000)
	libxml2.so.16 => /usr/lib/libxml2.so.16 (0x00007f3111493000)
	libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0x00007f31112fa000)
	libdeflate.so.0 => /usr/lib/libdeflate.so.0 (0x00007f31112e2000)
	libjbig.so.2.1 => /usr/lib/libjbig.so.2.1 (0x00007f31112d2000)
	liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007f311129d000)
	libzstd.so.1 => /usr/lib/libzstd.so.1 (0x00007f31111b7000)
	libwebp.so.7 => /usr/lib/libwebp.so.7 (0x00007f3111130000)
	liblzo2.so.2 => /usr/lib/liblzo2.so.2 (0x00007f311110f000)
	libavahi-common.so.3 => /usr/lib/libavahi-common.so.3 (0x00007f31110fe000)
	libavahi-client.so.3 => /usr/lib/libavahi-client.so.3 (0x00007f31110eb000)
	libgnutls.so.30 => /usr/lib/libgnutls.so.30 (0x00007f3110e00000)
	liblcms2.so.2 => /usr/lib/liblcms2.so.2 (0x00007f311107f000)
	libudev.so.1 => /usr/lib/libudev.so.1 (0x00007f311102f000)
	libdatrie.so.1 => /usr/lib/libdatrie.so.1 (0x00007f3111024000)
	libseccomp.so.2 => /usr/lib/libseccomp.so.2 (0x00007f3110dd3000)
	libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007f3111011000)
	libbrotlidec.so.1 => /usr/lib/libbrotlidec.so.1 (0x00007f3110dc4000)
	libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f3110dbf000)
	libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f3110db5000)
	libblkid.so.1 => /usr/lib/libblkid.so.1 (0x00007f3110d75000)
	libsystemd.so.0 => /usr/lib/libsystemd.so.0 (0x00007f3110c2d000)
	libgstaudio-1.0.so.0 => /usr/lib/libgstaudio-1.0.so.0 (0x00007f3110ba3000)
	libelf.so.1 => /usr/lib/libelf.so.1 (0x00007f3110b85000)
	libGLdispatch.so.0 => /usr/lib/libGLdispatch.so.0 (0x00007f3110b0a000)
	libicuuc.so.78 => /usr/lib/libicuuc.so.78 (0x00007f3110800000)
	libsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0 (0x00007f3110b01000)
	libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x00007f3110aae000)
	libleancrypto.so.1 => /usr/lib/libleancrypto.so.1 (0x00007f3110400000)
	libp11-kit.so.0 => /usr/lib/libp11-kit.so.0 (0x00007f311025e000)
	libidn2.so.0 => /usr/lib/libidn2.so.0 (0x00007f3110a8a000)
	libunistring.so.5 => /usr/lib/libunistring.so.5 (0x00007f3110077000)
	libtasn1.so.6 => /usr/lib/libtasn1.so.6 (0x00007f3110a74000)
	libhogweed.so.7 => /usr/lib/libhogweed.so.7 (0x00007f3110a2d000)
	libnettle.so.9 => /usr/lib/libnettle.so.9 (0x00007f31107a4000)
	libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f31106fd000)
	libbrotlicommon.so.1 => /usr/lib/libbrotlicommon.so.1 (0x00007f31106da000)
	libicudata.so.78 => /usr/lib/libicudata.so.78 (0x00007f310e000000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f310dc00000)