Create Desktop apps with Deno 🦕

Overview


🦕 Astrodon

Desktop App Framework (not there yet!) for Deno, based in Tauri

Discord Server


Note: Only Windows and Linux is supported at the moment. Feel free to open an issue if you have any trouble!

😎 Features

  • Create webview windows with your own title and URL
  • Send messages from Deno -> Webview

A lot is still missing, but we will get there!

🎁 Demo

Easily run the demo:

deno run -A --unstable --reload https://raw.githubusercontent.com/astrodon/astrodon/main/examples/hello_world/demo.ts

📜 To-do

  • Port more features from Tauri
  • Create a Tauri context on the fly instead of relying in tauri.conf.json
  • An optional cli to create and manage Astrodon projects
  • Support MacOS
  • Support Webview -> Deno messages
  • Fix https://github.com/tauri-apps/tauri/issues/3172 instead of relying in a fork

👩‍💻 Development

Requisites:

  • If you want to compile the binaries yourself: install the dependencies as indicated in Tauri's Guide.
  • Create a .env file, use examples/.env.example as a template.

Run the demo locally:

cargo build
deno run -A --unstable demo/demo.ts

MIT License

Comments
  • type errors when running demo

    type errors when running demo

    deno run -A --unstable --reload https://raw.githubusercontent.com/astrodon/astrodon/main/demo/demo.ts

    Check https://raw.githubusercontent.com/astrodon/astrodon/main/demo/demo.ts
    error: TS2694 [ERROR]: Namespace 'Deno' has no exported member 'UnsafePointer'.
      private app_ptr: Deno.UnsafePointer | undefined;
                            ~~~~~~~~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:26:25
    
    TS2322 [ERROR]: Type '"pointer"' is not assignable to type 'NativeType | "buffer"'.
          create_app: { parameters: ["pointer", "usize"], result: "pointer" },
                                     ~~~~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:43:34
    
    TS2322 [ERROR]: Type '"pointer"' is not assignable to type 'NativeType'.
          create_app: { parameters: ["pointer", "usize"], result: "pointer" },
                                                          ~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:43:55
    
    TS2322 [ERROR]: Type '"pointer"' is not assignable to type 'NativeType | "buffer"'.
          run_app: { parameters: ["pointer"], result: "pointer" },
                                  ~~~~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:44:31
    
    TS2322 [ERROR]: Type '"pointer"' is not assignable to type 'NativeType'.
          run_app: { parameters: ["pointer"], result: "pointer" },
                                              ~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:44:43
    
    TS2322 [ERROR]: Type '"pointer"' is not assignable to type 'NativeType | "buffer"'.
            parameters: ["pointer", "usize", "pointer"],
                         ~~~~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:46:22
    
    TS2322 [ERROR]: Type '"pointer"' is not assignable to type 'NativeType | "buffer"'.
            parameters: ["pointer", "usize", "pointer"],
                                             ~~~~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:46:42
    
    TS2322 [ERROR]: Type '"pointer"' is not assignable to type 'NativeType'.
            result: "pointer",
            ~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:47:9
    
    TS2694 [ERROR]: Namespace 'Deno' has no exported member 'UnsafePointer'.
        ) as Deno.UnsafePointer;
                  ~~~~~~~~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:61:15
    
    TS2694 [ERROR]: Namespace 'Deno' has no exported member 'UnsafePointer'.
        this.app_ptr = this.lib.symbols.run_app(this.app_ptr) as Deno.UnsafePointer;
                                                                      ~~~~~~~~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:62:67
    
    TS2694 [ERROR]: Namespace 'Deno' has no exported member 'UnsafePointer'.
        ) as Deno.UnsafePointer;
                  ~~~~~~~~~~~~~
        at https://raw.githubusercontent.com/astrodon/astrodon/main/mod.ts:69:15
    
    Found 11 errors.
    
    help wanted 
    opened by andykais 9
  • [doubt] Astrodon deno ts rust relation ?

    [doubt] Astrodon deno ts rust relation ?

    I hope to see more explanation for relation between ( deno, ts ) and ( Astrodon/tauri , rust ) for Astrodon consumer and Astrodon developer. for example is rust for Astrodon consumer in certain situation ? what skils needed for me or any dev to be able to contribue to Astrodon ?

    discussion 
    opened by elycheikhsmail 8
  • demo example don't work for me

    demo example don't work for me

    when run deno run -A --unstable https://deno.land/x/astrodon/examples/hello_world/demo.ts I get

    ely@ely-ThinkPad-T450s:~$ deno run -A --unstable https://deno.land/x/astrodon/examples/hello_world/demo.ts
    Download https://deno.land/x/astrodon/examples/hello_world/demo.ts
    Warning Implicitly using latest version (0.1.0-alpha.2) for https://deno.land/x/astrodon/examples/hello_world/demo.ts
    Download https://deno.land/x/astrodon/examples/hello_world/astrodon.config.ts
    Warning Implicitly using latest version (0.1.0-alpha.2) for https://deno.land/x/astrodon/examples/hello_world/astrodon.config.ts
    error: Uncaught (in promise) CacheError: /home/ely/superapp/astrodon/0.1.0-alpha.2/lib/libastrodon.so is not valid.
        throw new CacheError(`${path} is not valid.`);
              ^
        at protocolFile (https://deno.land/x/[email protected]/file_fetcher.ts:12:11)
        at async fetchFile (https://deno.land/x/[email protected]/file_fetcher.ts:41:14)
        at async FileWrapper.fetch (https://deno.land/x/[email protected]/file.ts:95:18)
        at async FileWrapper.get (https://deno.land/x/[email protected]/file.ts:113:12)
        at async cache (https://deno.land/x/[email protected]/cache.ts:67:10)
        at async Wrapper.cache (https://deno.land/x/[email protected]/cache.ts:21:12)
        at async download (https://deno.land/x/[email protected]/plug.ts:96:16)
        at async Module.prepare (https://deno.land/x/[email protected]/plug.ts:105:16)
        at async Function.new (https://deno.land/x/[email protected]/modules/astrodon/mod.ts:115:21)
        at async https://deno.land/x/[email protected]/examples/hello_world/demo.ts:18:13
    ely@ely-ThinkPad-T450s:~$ 
    

    I have ubuntu 20.04 as sytem it seems there a pb for caching binary, I suggess to have to two command one for dowload and cach binary and the second for create ui

    opened by elycheikhsmail 5
  • Api demo failed

    Api demo failed

    I create gui.ts file and copy past

    
    import { AppWindow  } from "https://deno.land/x/astrodon/mod.ts";
    
    const win = new AppWindow("Window A");
    
    win.setHtml("<h1>Hello World :)</h1>");
    
    await win.run();
    
    

    I get the following error :

    ely@ely-ThinkPad-T450s:~/Documents/fullstack/astrodon-explore$ deno run -A --unstable gui.ts
    Check file:///home/ely/Documents/fullstack/astrodon-explore/gui.ts
    error: TS2305 [ERROR]: Module '"https://deno.land/x/[email protected]/mod.ts"' has no exported member 'AppWindow'.
    import { AppWindow  } from "https://deno.land/x/astrodon/mod.ts";
             ~~~~~~~~~
        at file:///home/ely/Documents/fullstack/astrodon-explore/gui.ts:1:10
    
    
    opened by elycheikhsmail 4
  • Astrodon app store

    Astrodon app store

    Astrodon desktop store

    I know astrodon still in dev and is not yet stable

    But I suggess to plan to build ecosystem around astrodon

    • astrodon store (AS) : Take as input dev code ( deno-ts + spa ) + app description and other meta Then build the app for target plateform (on cloud ) or take as input the build directly save it on the cloud and return it the zipped executable to astrodon store client on demand
    • astrodon store client (ASC): desktop app
    • allow to the final user to search for a specific app
    • install astrodon desktop app by click under the hood ASC ask for needed permissions and install needed component This will be good for all :
    • dev who create desktop app based astrodon : it will be easy to deliver product to there client and it will be easy for client to install here app
    • astrodon author and mentainer Will have more conroller of app installation and get possibility to monitise this project then they can recrute some dev for full time.
    • final user can get good user experience.

    In some way I aime to get have ecosystem like playStore+androidStudio+... but for desktop app multiplateform base on deno and web tech.

    This is just a suggestion.

    opened by elycheikhsmail 3
  • [feat] General improvements

    [feat] General improvements

    • Add: Build configuration object to the astrodon.config.ts standard
    • Add: globalThis.astrodonProduction prop on build
    • Add: CLI Build command
    • Add: CLI Init command
    • Add: App.getDataPath mehod
    • Add: unpackAssets export to the Builder module
    • Add: Astrodon templates module
    • Add: Vue template starter
    • Add: Dafault template starter
    • General refractoring
    enhancement 
    opened by denyncrawford 2
  • Suggestion : Replace hacky method to auto-close the cmd window

    Suggestion : Replace hacky method to auto-close the cmd window

    I have been looking into some way to compile GUI deno app to run on Windows with Tauri before, with great success but without making much FFI effort.

    Here is what I have (found & made)

    First simple method is to change a byte into the deno compile binary from Typescript after it's done. the other method is directly a suggestion i have made in the denoland/deno repo that adds the -subsystem option in deno compile in order to select if you wish to bundle a GUI app or a console app (windows only)

    From this issue https://github.com/denoland/deno/discussions/11638

    // --allow-read --allow-write change_exe_subsystem.ts
    
    async function readN(r: Deno.Reader, n: number): Promise<Uint8Array | null> {
      const buf = new Uint8Array(n);
      let nRead = 0;
      // a null value of r.read() will nullish coalesce into NaN and
      // polute nRead, causing (nRead < n) to be false and the loop to exit
      while (nRead < n) {
        nRead += await r.read(buf.subarray(nRead)) ?? NaN;
      }
      return isNaN(nRead) ? null : buf;
    }
    
    async function writeAll(w: Deno.Writer, buf: ArrayBufferView): Promise<void> {
      const bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
      let nWritten = 0;
      while (nWritten < bytes.byteLength) {
        nWritten += await w.write(bytes.subarray(nWritten));
      }
    }
    
    function view(buf: ArrayBufferView) {
      return new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
    }
    
    // replace 'my_oak_server.exe' with your server binary
    const PATH_TO_BINARY = "./my_oak_server.exe";
    const bin = await Deno.open(PATH_TO_BINARY, { read: true, write: true });
    
    // we're going to validate (loosely) that its a valid EXE/MZ
     // reset to index 0, just to be sure
    await bin.seek(0, Deno.SeekMode.Start);
    const magicBytes = await readN(bin, 2);
    if (magicBytes == null) {
      console.log("Encountered EOF at magicBytes");
      Deno.exit(1);
    }
    const binMagic = new TextDecoder().decode(magicBytes);
    
    if ("MZ" != binMagic) {
      console.log(`☹ we didnt find a valid exe at ${PATH_TO_BINARY}`);
      Deno.exit(1);
    }
    
    // we now know we have a valid exe file
    // next we need to get the offset of the 'PE Header'
    const PE_ADDRESS_OFFSET = 0x3C;
    await bin.seek(PE_ADDRESS_OFFSET, Deno.SeekMode.Start);
    // read the peHeaderPointer as 32bit little-endian int/dword/u32
    const peHeaderPointerBytes = await readN(bin, 4);
    if (peHeaderPointerBytes == null) {
      console.log("Encountered EOF at peHeaderPointerBytes");
      Deno.exit(1);
    }
    const peHeaderPointer = view(peHeaderPointerBytes).getUint32(0, true);
    
    // we've got the offset of the PE header now
    // we'll go to that offset, then a further 92 bytes
    // this is where the subsytem field is
    await bin.seek(peHeaderPointer + 92, Deno.SeekMode.Start);
    
    // WINDOWS subsystem (don't show a terminal)
    // CONSOLE subsystem (show a terminal when running)
    const SUBSYSTEM_WINDOWS = 2;
    const SUBSYSTEM_CONSOLE = 3;
    
    // before we modify the value we'll do a very rough check
    // to make sure that we are modifying the right field
    // we'll need to get it as a little-endian u16
    const subsystemBytes = await readN(bin, 2);
    if (subsystemBytes == null) {
      console.log("Encountered EOF at subsystemBytes");
      Deno.exit(1);
    }
    const subsystem = view(subsystemBytes).getUint16(0, true);
    if (!(SUBSYSTEM_WINDOWS == subsystem || SUBSYSTEM_CONSOLE == subsystem)) {
      console.log("Oops! The subsystem is not WINDOWS=2 or CONSOLE=3.");
      console.log("We might be editing the wrong field,");
      console.log("  _or_ the EXE uses a different subsystem.");
      Deno.exit(1);
    }
    
    // okay, now we are pretty sure about the file
    // let's update its subsystem
    const newSubsystemData = new Uint16Array(1);
    view(newSubsystemData).setUint16(0, SUBSYSTEM_WINDOWS, true);
    // go back to the subsytem field
    await bin.seek(peHeaderPointer + 92, Deno.SeekMode.Start);
    // write out our data.
    await writeAll(bin, newSubsystemData);
    
    // finish up with a helpful message
    const newSubsystemValue = view(newSubsystemData).getUint16(0, true);
    if (SUBSYSTEM_WINDOWS == newSubsystemValue) {
      console.log(`Done! Changed ${PATH_TO_BINARY} subsystem=2, WINDOWS.`);
    }
    else if (SUBSYSTEM_CONSOLE == newSubsystemValue) {
      console.log(`Done! Changed ${PATH_TO_BINARY} subsystem=3, CONSOLE.`);
    }
    

    And my suggestion to add directly to Deno :

    https://github.com/denoland/deno/discussions/12941

    Both are great, but I believe for Astrodon it can be easier to just not "close" the console and instead just make it a real GUI app (Windows will know the difference)

    this is a suggestion, let me know what you think.

    enhancement 
    opened by hironichu 2
  • ⬆️ Bump crossbeam-utils from 0.8.5 to 0.8.8

    ⬆️ Bump crossbeam-utils from 0.8.5 to 0.8.8

    Bumps crossbeam-utils from 0.8.5 to 0.8.8.

    Release notes

    Sourced from crossbeam-utils's releases.

    crossbeam-utils 0.8.8

    • Fix a bug when unstable loom support is enabled. (#787)

    crossbeam-utils 0.8.7

    • Add AtomicCell<{i*,u*}>::{fetch_max,fetch_min}. (#785)
    • Add AtomicCell<{i*,u*,bool}>::fetch_nand. (#785)
    • Fix unsoundness of AtomicCell<{i,u}64> arithmetics on 32-bit targets that support Atomic{I,U}64 (#781)

    crossbeam-utils 0.8.6

    • Re-add AtomicCell<{i,u}64>::{fetch_add,fetch_sub,fetch_and,fetch_or,fetch_xor} that were accidentally removed in 0.8.0 0.7.1 on targets that do not support Atomic{I,U}64. (#767)
    • Re-add AtomicCell<{i,u}128>::{fetch_add,fetch_sub,fetch_and,fetch_or,fetch_xor} that were accidentally removed in 0.8.0 0.7.1. (#767)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • [feat] Adapt deno_tauri

    [feat] Adapt deno_tauri

    This is a summary of all the changes we have been working on for the past 2.5 months. Original poc deno_tauri.

    Description

    Astrodon doesn't use FFI anymore, instead it has it's own Deno runtime that integrates natively with Wry. This allows Astrodon to stay performant while ensuring cross-platform compatibility, which we previosuly didn't have.

    Astrodon is not meant to be a simple library, but a framework in which to build apps on.

    Changes

    Config file

    Astrodon projects now require some more information, like the app's name, version, description, etc.. Like shown in the example.

    Example:

    export default <AppConfig> {
      entry: join(__dirname, "demo.ts"),
      dist: join(__dirname, "dist"),
      info: {
        name: "MarcApp",
        id: "marc.app
        version: "0.1.0",
        author: "Marc Espín",
        shortDescription: "Some description",
        longDescription: "Moooore description!!",
        homepage: "https://github.com/marc2332",
        copyright: "2022",
        icon: [],
        resources: [],
        permissions: { // You can also specify the Deno permissions your app will be run with
          allow_hrtime: true,
          prompt: true,
          allow_net: [],
        },
      },
    };
    

    Cli

    Astrodon now has a CLI you can use if you want ( we recommend you to), unless you have very specific cases.

    It has these commands:

    astrodon build

    Used to build the standalone version of your app. Cross-compiling is supported too.

    astrodon run

    Used to run your app in development mode.

    astrodon init

    Easily create a new project.

    Development & build scripts

    If the CLI built-in build and run commands are not enough for you, you can make use of the internal APIs, like showed in here with Builder and Develop.

    Installers

    We provide an integration with deno_installer, this means you can easily create Installers for your apps, it supports the three major OS, Windows, MacOS And Linux. But, you cannot cross-compile the installers since each one depends on OS-dependencies.

    Runtimes

    NOTE: These are just the internals of Astrodon, you won't need to care about this.

    Astrodon runtime, this is the Deno Runtime with built-in APIs for wry. This serves as base layer for the development and standalone runtimes.

    The Development Runtime is only used for development purposes, it has some development-only features such as parsing TypeScript, HTTP imports, which we believe it only makes sense while developing.

    That's why there is also the Standalone Runtime, it's a more lightweight version and it's meant to be used only production. It puts the source code of your app (not your frontend assets yet, for that you would need to pack them with the installer for now, we also plan to bundle them) in a binary alongside the runtime, like Deno does, with eszip).

    Since we do not use Deno's CLI, the final executable size is smaller. But, this comes with some trade-offs, like not supporting deno test, if Deno's CLI was more modularized...

    Conclusion

    There is still a lot of work to-do, but I think we are going pretty good. For now, we will keep working on this next release 0.2.0-alpha.1 and publish it when it's ready.

    enhancement 
    opened by marc2332 0
  • [feat] Add Deno ops tests

    [feat] Add Deno ops tests

    This adds a unit test on modules/astrodon-tauri that makes sure the ops registered on the Deno runtime are working good.

    Ops checked:

    • runWindow
    • sendToWindow
    • listenEvent
    • closeWindow
    opened by marc2332 0
  • [feat] Runtime refactoring

    [feat] Runtime refactoring

    This cleans up a lot the code used in the runtime (astrodon-tauri/-development/-standalone).

    Important changes:

    • struct EventsManager: This handles all the message communication of Deno to/from Wry.
    • struct DenoRuntime(I should probably pick a better name): self explanatory
    • struct WryRuntime(I should probably pick a better name): self explanatory

    All the changes have been checked with cargo clippy ,formatted with cargo fmt, and also tested manually (we are missing unit tests D:)

    enhancement 
    opened by marc2332 0
  • Could not open library: libssl.so.1.1

    Could not open library: libssl.so.1.1

    Download https://deno.land/x/[email protected]/examples/hello_world/astrodon.config.ts
    error: Uncaught (in promise) Error: Could not open library: Could not open library: libssl.so.1.1: cannot open shared object file: No such file or directory
      return Deno.dlopen(file, symbols);
                  ^
        at Object.opSync (deno:core/01_core.js:170:12)
    
    
    bug 
    opened by ajsb85 0
  • Segmentation fault (core dumped)

    Segmentation fault (core dumped)

    deno run -A --unstable --reload https://deno.land/x/[email protected]/examples/hello_world/demo.ts
    ...
    Download https://deno.land/x/[email protected]/examples/hello_world/astrodon.config.ts
    Segmentation fault (core dumped)
    
    
    opened by ajsb85 2
  • ops[opName] is not a function

    ops[opName] is not a function

    deno run examples/hello_world/demo.ts 
    ⚠️  ️Deno requests net access to "dog.ceo". Run again with --allow-net to bypass this prompt.
       Allow? [y/n (y = yes allow, n = no deny)]  y
    error: Uncaught (in promise) TypeError: ops[opName] is not a function
        return (Deno as any).core.opAsync("run_window", {
                                  ^
        at Object.opAsync (deno:core/01_core.js:150:35)
    
    
    opened by ajsb85 3
  • Add support for common dialogs and notifications

    Add support for common dialogs and notifications

    Would be awesome if we had support for common used dialogs, such as a file picker, Yes/No chooser... And also notifications

    Research needs to be done

    astrodon-tauri astrodon-core astrodon-apis 
    opened by marc2332 0
  • Add support for redirected URLs

    Add support for redirected URLs

    Module loader used for development, should be able to load from redirected URLs.

    This can be done by looking at the original_hased_url.metadata.json, and looking under the "location" header, which tells us the redirected file URL, then it can be hashed to get the file location.

    bug astrodon-tauri-development 
    opened by marc2332 0
Releases(0.1.0-alpha.2)
Owner
Astrodon
Desktop App Framework for Deno, based in Tauri
Astrodon
A very small app to run three.js apps on the desktop with Deno

3D visualization with Three.js on Deno on Desktop This is a small Deno app that renders a (webkit) webview on desktop. Along with a page running Three

Jorge Romero 23 Dec 30, 2022
A very small app to run three.js apps on the desktop with Deno

Birb Engine - 3D with Three.js on Deno on Desktop This is a project for making a game engine! Intended to be customizable and about as flexible as dev

Jorge Romero 5 Jun 17, 2022
Desktop App for mdSilo: Tiny Knowledge silo on your desktop.

mdSilo A mind silo for storing ideas, thought, knowledge with a powerful writing tool. built with React and Tauri. Demo Discord This is desktop app, a

D.Loh 203 Dec 27, 2022
This provides an extension integration with Docker Desktop to run k9s quickly and easily through the Docker Desktop interface.

k9s extension for Docker Desktop This provides an extension integration with Docker Desktop to allow k9s quickly and easily through the Docker Desktop

James Spurin 14 Dec 16, 2022
This is a simple boilerplate for a Deno website, deployed with Deno Deploy.

Simple Deno Website Boilerplate This is a simple website boilerplate built using Deno and deployed using Deno Deploy. Demo at simple-deno-website-boil

Bruno Bernardino 15 Dec 3, 2022
TypeSafe MongoDB Atlas Data API SDK for Deno & Deno Deploy

Atlas SDK atlas_sdk is a TypeSafe MongoDB Atlas Data API SDK for Deno & Deno Deploy Links Docs Import Replace LATEST_VERSION with current latest versi

Erfan Safari 20 Dec 26, 2022
Deno bindings for yoga, using Deno FFI.

deno_yoga Deno bindings for yoga, using Deno FFI. Usage flags: --allow-ffi: Requires ffi access to "yogacore.dll", "libyogacore.so", "libyogacore.dyli

迷渡 6 Feb 11, 2022
🛣️ A tiny and fast http request router designed for use with deno and deno deploy

Rutt Rutt is a tiny http router designed for use with deno and deno deploy. It is written in about 200 lines of code and is pretty fast, using an exte

Denosaurs 26 Dec 10, 2022
A small, but powerful HTTP library for Deno & Deno Deploy, built for convenience and simplicity

Wren Wren is a small, but powerful HTTP library for Deno & Deno Deploy, built for convenience and simplicity. convenient aliases for HTTP responses au

Jakub Neander 69 Dec 12, 2022
deno-ja (Deno Japanese community) showcase

Showcase Deno本家よりも気軽に作ったものを公開できるようなShowcaseです。 スクリーンショットの撮影方法 短めのidを決めていただいて、下記のようにスクリプトを実行してください。 deno task screenshot [url] [id] ※エラーが出る場合は、下記を実行してみ

deno-ja 17 Oct 28, 2022
A command-line tool to manage Deno scripts installed via deno install

??️ nublar nublar is a command-line tool to manage your scripts installed via deno install. ??️ Installation deno install --allow-read --allow-write -

Shun Ueda 16 Dec 26, 2022
Titlebar template for Electron-based desktop apps

Electron-Titlebar-Template CSS based MacOs UI Titlebar Template for Electron-based desktop apps Titlebar can: minimize maximize fullscreen close You c

null 3 May 18, 2022
Freewall is a cross-browser and responsive jQuery plugin to help you create grid, image and masonry layouts for desktop, mobile, and tablet...

Freewall Freewall is a cross-browser and responsive jQuery plugin to help you create many types of grid layouts: flexible layouts, images layouts, nes

Minh Nguyen 1.9k Dec 27, 2022
Open apps directly in GNOME Software by clicking Install from Flathub and apps.gnome.

Flatline Open apps directly in GNOME Software by clicking Install from Flathub and apps.gnome. Load the extension in Firefox Clone the repository Open

Cleo Menezes Jr. 43 Nov 7, 2022
Sample apps showing how to build music and video apps for Xbox using a WebView.

description languages name page_type products urlFragment Sample showing how to build music and video apps using primarily web technologies for Xbox.

Microsoft 11 Dec 14, 2022
why make apps to increase focus -- when you can make apps to reduce focus

impossifocus ?? What is this? ImpossiFocus will measure focus by reading your brainwaves -- and if you're in the zone, it'll ensure that changes with

Aleem Rehmtulla 10 Nov 30, 2022
The fastest way ⚡️ to create sitemap in your Deno Fresh project 🍋

Fresh SEO ??     Quickly creating sitemaps for your Deno Fresh project. Getting Started Run the setup at the root of your project. deno run

Steven Yung 34 Dec 19, 2022
Create nbundle-powered Notion apps with one command

⚠️ This project is under development and is not ready for public use. All 1.0.x releases are considered alpha releases, are not stable, and may have b

nbundle 11 Nov 29, 2022
A sandbox coding environment, desktop app, inspired by CodePen and JSFiddle

CodeBox CodeBox is a coding environment with HTML, CSS and JavaScript editors with a live preview panel to show what the code would look like in the b

Virej Dasani 98 Dec 20, 2022