Bitburner source code.

Overview

Bitburner

Join Discord

Build Status

Bitburner is a programming-based incremental game that revolves around hacking and cyberpunk themes. The game can be played at https://danielyxie.github.io/bitburner or installed through Steam.

See the frequently asked questions for more information . To discuss the game or get help, join the official Discord server.

Documentation

The game's official documentation can be found on Read The Docs. Please note that this is still a work-in-progress.

The in-game documentation is generated from the TypeScript definitions.

Anyone is welcome to contribute to the documentation by editing the source files and then making a pull request with your contributions. For further guidance, please refer to the "As A Documenter" section of CONTRIBUTING.

Contribution

There are many ways to contribute to the game. It can be as simple as fixing a typo, correcting a bug, or improving the UI. For guidance on doing so, please refer to the CONTRIBUTING document.

You will retain all ownership of the Copyright of any contributions you make, and will have the same rights to use or license your contributions. By submitting a pull request you agree to grant me perpetual, worldwide, non-exclusive, transferable, royalty-free, and irrevocable rights to use, publish, and distribute your contributions to the project. A formal Contributor's License Agreement will be drawn up in the future.

If you would like to make significant contributions to the project as a collaborator, please reach out to @danielyxie to help coordinate the effort.

Comments
  • Work formulas are broken

    Work formulas are broken

    1. ns.formulas.work.classGains(ns.getPlayer(),"algorithms","Summit University") throws Cannot read properties of undefined (reading 'earnings')
    2. ns.formulas.work.factionGains(ns.getPlayer(),"field",1) throws Cannot read properties of undefined (reading 'hackExp')
    3. ns.formulas.work.crimeGains("DRUGS") does not require owning Formulas.exe (also crime types are case sensitive ALL CAPS while courses, locations, universities, and work types are all case insensitive / lower case (Faction names, however, are case sensitive CamelCase, just to buck trend as well)).
    • [x] Minimal scripts to reproduce the issue
    • [x] Steps to reproduce
    • [x] Version of the game, e.g. Bitburner v2.1.0 (8f4636cb)
    opened by Draco18s 11
  • MISC: Significantly improve the speed of script creation

    MISC: Significantly improve the speed of script creation

    In my browser (Chrome 107.0.5304.107 Windows 10) this improves noop script execution from 8281.063/sec to 13942.606/sec - a 68% speedup!

    The 'ns' API has to be wrapped, so that functions can access the context (primarily the WorkerScript) without leaking it to the player. Before, this happened by walking the whole API tree and creating new wrapping functions for every script, which is understandably expensive.

    Now we take advantage of class #private fields to securely hold the context, allowing the wrapping functions to exist on the prototype and only need to be created once. These are widely available (>93% according to caniuse) and work with Electron.

    Benchmarks

    benchmark.js

    /** @param {NS} ns */
    export async function main(ns) {
        const resolved = Promise.resolve();
        const perf = globalThis.performance;
        let speedMax = 0;
        for (let i = 0; i < Number(ns.args[0]); ++i) {
            const start = perf.now();
            let end, cycles;
            for (cycles = 0; (end = perf.now()) - start < 1000; cycles++) {
                ns.exec("/lib/noop.js", "home");
                await resolved;
            }
            const speed = (cycles * 1000) / (end - start);
            speedMax = speed > speedMax ? speed : speedMax;
            ns.tprintf("Iter %2d: %.3f/sec", i, speed);
            await new Promise(resolve => setTimeout(resolve));
        }
        ns.tprintf("Best: %.3f/sec", speedMax);
    }
    

    /lib/noop.js

    /** @param {NS} ns */
    export function main(ns) {}
    

    Output

    Before

    [home ~/]> run benchmark.js 30
    Running script with 1 thread(s), pid 128630 and args: [30].
    Iter  0: 7246.000/sec
    Iter  1: 7737.905/sec
    Iter  2: 6598.361/sec
    Iter  3: 6433.427/sec
    Iter  4: 7428.571/sec
    Iter  5: 7370.000/sec
    Iter  6: 7113.155/sec
    Iter  7: 7682.927/sec
    Iter  8: 8137.167/sec
    Iter  9: 7428.029/sec
    Iter 10: 7266.000/sec
    Iter 11: 7976.000/sec
    Iter 12: 7094.581/sec
    Iter 13: 7966.000/sec
    Iter 14: 7235.018/sec
    Iter 15: 7076.754/sec
    Iter 16: 7199.560/sec
    Iter 17: 7373.051/sec
    Iter 18: 7654.469/sec
    Iter 19: 7538.738/sec
    Iter 20: 8281.063/sec
    Iter 21: 7820.218/sec
    Iter 22: 7871.554/sec
    Iter 23: 6979.604/sec
    Iter 24: 6813.956/sec
    Iter 25: 7170.283/sec
    Iter 26: 7546.000/sec
    Iter 27: 7093.872/sec
    Iter 28: 7173.848/sec
    Iter 29: 7616.099/sec
    Best: 8281.063/sec
    

    After

    [home ~/]> run benchmark.js 30
    Running script with 1 thread(s), pid 65008 and args: [30].
    Iter  0: 13535.525/sec
    Iter  1: 11431.000/sec
    Iter  2: 12362.346/sec
    Iter  3: 10344.966/sec
    Iter  4: 12774.723/sec
    Iter  5: 11089.891/sec
    Iter  6: 12011.000/sec
    Iter  7: 9351.324/sec
    Iter  8: 10857.314/sec
    Iter  9: 10649.000/sec
    Iter 10: 12542.000/sec
    Iter 11: 10861.000/sec
    Iter 12: 12526.000/sec
    Iter 13: 11858.000/sec
    Iter 14: 12429.757/sec
    Iter 15: 13491.000/sec
    Iter 16: 12009.000/sec
    Iter 17: 10983.803/sec
    Iter 18: 11814.819/sec
    Iter 19: 13811.000/sec
    Iter 20: 12753.073/sec
    Iter 21: 12450.000/sec
    Iter 22: 11474.525/sec
    Iter 23: 12557.744/sec
    Iter 24: 13942.606/sec
    Iter 25: 13336.000/sec
    Iter 26: 11866.000/sec
    Iter 27: 12286.000/sec
    Iter 28: 10080.000/sec
    Iter 29: 10176.000/sec
    Best: 13942.606/sec
    
    opened by d0sboots 8
  • SleeveWorkGains available in documentation, but not in NS scripts

    SleeveWorkGains available in documentation, but not in NS scripts

    This page and type def exist, but there does not appear to be any code that constructs, returns, or otherwise deals with this interface.

    Either the type def (and therefor doc) need to be removed, or a method of obtaining this information needs to be exposed.

    • [x] Version of the game, e.g. Bitburner v2.1.0 (8f4636cb)
    opened by Draco18s 6
  • Ignore `dist` folder from git version contorl

    Ignore `dist` folder from git version contorl

    [Tanimodori] Currently the dist folder is under git version control. The js bundle size of the project is ~17MB (main.bundle.js, main.bundle.js.map, vendor.bundle.js, vendor.bundle.js.map) and the .git folder is ~345MB now which is growing bigger and bigger and leads to performance drop of IDEs. Here is a list of commit numbers and .git folder size of popular project on github for comparisons.

    | project | .git size | #commit | size per commit | |----------------------------------------------------|-------------|---------|-----------------| | vite | ~25MB | ~4800 | ~5KB | | rollup | ~24MB | ~5000 | ~5KB | | electron | ~126MB | ~26800 | ~5KB | | this project | ~345MB | ~7200 | ~48KB |

    This project has roughly 10x size of .git folder compared to other project. I see no benefits put them under git version control so I suggest removing them from git (and history maybe) before this project become unmaintainable.

    opened by TheMas3212 5
  • UI: Sidebar performance optimizations

    UI: Sidebar performance optimizations

    UI: Sidebar performance optimizations

    Status

    Not ready for merge. Needs bug fixing (see Added Bugs) and has possible improvements (see Possible future improvements).

    Current optimizations

    • Changed ListItem of type button to ListItemButton . The button value of ListItem is deprecated.
    • Moved some calculated values into useMemo hooks.

    Effects

    Moving some calculations inside useMemo hooks reduced the scripting time from an average of 4ms to about 1ms. Changing the ListItem to ListItemButton reduced the overall time down to an average of 18ms.

    Possible future improvements

    All of the functions for calling the router functions don't need to be re-defined and could be moved outside of the function. Not sure if that would be a good idea, maybe post your opinion about that

    Added bugs IMPORTANT

    Changing the buttons, added unexpected space around the button. My css is not that great, so I'll leave that to someone else.

    Linked issues

    Closes #238

    Formatting

    • [X] lint
    • [X] format
    opened by G4mingJon4s 4
  • DOC: `ns.codingcontract.attempt()`: how to use the optional parameter `opts`

    DOC: `ns.codingcontract.attempt()`: how to use the optional parameter `opts`

    Explain how to use the optional parameter opts of the function ns.codingcontract.attempt(). It is not obvious that an object should be passed in, using the key/value format of the interface CodingAttemptOptions. I have seen players passed in true for this fourth parameter. The Bitburner server of Discord have had many questions about the parameter opts.

    The correct way to use the fourth parameter opts is to pass in an object along the key/value format of CodingAttemptOptions. Also update the documentation of opts and the return value. I have formatted the documentation to use at most 90 characters because it is no fun to scroll across to read a very long line. Others might disagree with this formatting and that's OK. I can change the doc back to very long lines.

    opened by quacksouls 4
  • CORPORATION: Added check to buy amount

    CORPORATION: Added check to buy amount

    CORP: Added check to buy amount

    The code now checks wether or not the given buy amount is a finite number, before changing the buy amount

    Linked issues

    Closes #127

    opened by G4mingJon4s 4
  • NETSCRIPT: Greatly speed scp() and write() of js by deferring RAM calculation

    NETSCRIPT: Greatly speed scp() and write() of js by deferring RAM calculation

    scp() and write() are very slow, because they have to recalculate ram costs.

    In the course of investigating a typo, I realized that there's no need for ns.scp() and ns.write() to calculate ram at all. They can defer the work until when the script is executed. The only visible artifact is that RAM costs will be incorrect until the script is run; however, they were already wrong for scp anyway, when it overwrites files. (Check the diff carefully)

    benchmark:

    /** @param {NS} ns */
    export async function main(ns) {
        const perf = globalThis.performance;
        let speedMax = 0;
        for (let i = 0; i < Number(ns.args[0]); ++i) {
            const start = perf.now();
            let end, cycles;
            for (cycles = 0; (end = perf.now()) - start < 1000; cycles++) {
                ns.write("scpdata.js", "export function main() {}", "w");
            }
            const speed = (cycles * 1000) / (end - start);
            speedMax = speed > speedMax ? speed : speedMax;
            ns.tprintf("Iter %2d: %.3f/sec", i, speed);
            await new Promise(resolve => setTimeout(resolve));
        }
        ns.tprintf("Best: %.3f/sec", speedMax);
    }
    

    Before:

    [home ~/]> run benchmark.js 20
    Running script with 1 thread(s), pid 66553 and args: [20].
    Iter  0: 1464.707/sec
    Iter  1: 1722.828/sec
    Iter  2: 1836.449/sec
    Iter  3: 1989.602/sec
    Iter  4: 2137.359/sec
    Iter  5: 1888.245/sec
    Iter  6: 1694.831/sec
    Iter  7: 1734.480/sec
    Iter  8: 1933.420/sec
    Iter  9: 2327.767/sec
    Iter 10: 2209.779/sec
    Iter 11: 2060.588/sec
    Iter 12: 2266.773/sec
    Iter 13: 1991.000/sec
    Iter 14: 2030.594/sec
    Iter 15: 2214.557/sec
    Iter 16: 2169.915/sec
    Iter 17: 2079.376/sec
    Iter 18: 2131.000/sec
    Iter 19: 2058.794/sec
    Best: 2327.767/sec
    

    After:

    [home ~/]> run benchmark.js 20
    Running script with 1 thread(s), pid 1 and args: [20].
    Iter  0: 355124.000/sec
    Iter  1: 360699.000/sec
    Iter  2: 360630.000/sec
    Iter  3: 336384.000/sec
    Iter  4: 367969.000/sec
    Iter  5: 307557.244/sec
    Iter  6: 339932.000/sec
    Iter  7: 335873.000/sec
    Iter  8: 350184.000/sec
    Iter  9: 330100.000/sec
    Iter 10: 349447.276/sec
    Iter 11: 334633.000/sec
    Iter 12: 337402.000/sec
    Iter 13: 333241.000/sec
    Iter 14: 365532.000/sec
    Iter 15: 342055.000/sec
    Iter 16: 305680.000/sec
    Iter 17: 314308.000/sec
    Iter 18: 364318.000/sec
    Iter 19: 304195.000/sec
    Best: 367969.000/sec
    

    Test script showing the typo issue, and new behavior:

    /** @param {NS} ns */
    export async function main(ns) {
        ns.rm("scpdata.js");
        ns.write("scpdata.js", `export function main(ns) {}`, "w");
        ns.tprint("Size of base scpdata: " + ns.getScriptRam("scpdata.js"));
        ns.rm("scpdata.js", "n00dles");
        ns.scp("scpdata.js", "n00dles");
        ns.write("scpdata.js", `export function main(ns) {
            ns.tprint("I like " + ns.getServer("n00dles").hostname);
        }`, "w");
        ns.tprint("Size of new scpdata: " + ns.getScriptRam("scpdata.js"));
        ns.scp("scpdata.js", "n00dles");
        ns.tprint("Size of new on n00dles: " + ns.getScriptRam("scpdata.js", "n00dles"));
        ns.exec("scpdata.js", "n00dles");
        await ns.sleep(0);
        ns.tprint("Size on n00dles after exec: " + ns.getScriptRam("scpdata.js", "n00dles"));
    }
    

    Before:

    [home ~/]> run scp.js
    Running script with 1 thread(s), pid 66558 and args: [].
    scp.js: Size of base scpdata: 1.6
    scp.js: Size of new scpdata: 3.6
    scp.js: Size of new on n00dles: 1.6
    scp.js: Size on n00dles after exec: 3.6
    scpdata.js: I like n00dles
    

    After:

    [home ~/]> run scp.js 
    Running script with 1 thread(s), pid 2 and args: [].
    scp.js: Size of base scpdata: 0
    scp.js: Size of new scpdata: 0
    scp.js: Size of new on n00dles: 0
    scp.js: Size on n00dles after exec: 3.6
    scpdata.js: I like n00dles
    
    opened by d0sboots 3
  • UI: Fix keyboard shortcuts for other keyboard layouts

    UI: Fix keyboard shortcuts for other keyboard layouts

    A prior change changed from event.key to event.code. I'm not sure why this commit was made, since there's no further explanation in the commit message. But using event.code breaks non-QWERTY keyboard layouts, so reverting improves my (Dvorak) experience greatly. Also, it's strongly warned against at MDN: https://developer.mozilla.org/en-US/docs/Web/API/Element/keydown_event#event_properties

    This also fixes ScriptEditorRoot.tsx, where some code snuck in that wasn't using any of the constants.

    This reverts commit 016a9a873fba71388bdbaa1423134fd1f2335a15.

    Testing

    Tried the various hotkeys, they work correctly for Dvorak now. In particular, Ctrl-X (which is physically Ctrl-B) now cuts text instead of exiting to the terminal in the script editor.

    Switching to Qwerty, the hotkeys match their "usual" behavior. I didn't detect any weird cases, and I tried a bunch in both layouts.

    opened by d0sboots 3
  • Close/open game causes current in game scripts to be used, not originals from when first run.

    Close/open game causes current in game scripts to be used, not originals from when first run.

    To reproduce: Run a script on a server Change the source code of the script to use different arguments or print something new Close the game Open the game

    Result: The supposedly still running process uses the updated script, not the old script from when it was run the first time (before game close)

    Expected: That the overwritten file would be saved in the background, until all processes using it are gone. And that old version of the script would be used when the Steam game opens.

    Steam's Bitburner v2.1.0 (8f4636cb)

    opened by OneOfMany07 3
  • DOC: `ns.singularity.workForFaction()`: update doc and examples

    DOC: `ns.singularity.workForFaction()`: update doc and examples

    Fixes #166. Since v2.0, while working for a faction the player immediately gets their rewards, e.g. faction reputation and XP. Update the documentation of ns.singularity.workForFaction() to reflect this immediate gain. Update the examples accordingly.

    opened by quacksouls 3
  • Rep gained with SOA Does not match UI

    Rep gained with SOA Does not match UI

    Listed rep gain is exactly half of the actual gain. See screenshots: image image image

    Rep gain is shown as 3550.67 actual gain is 7102 ±1. This is irrespective of faction favor, the WKS harmonizer, and other multipliers.

    • [x ] Steps to reproduce
      • check SOA rep
      • do an infiltration
      • compare new SOA rep with amount gained in rewards screen
    • [x ] Version of the game, e.g. Bitburner v2.1.0 (0133945c)
    opened by Draco18s 0
  • Hospital Unusable after BitNode Reset

    Hospital Unusable after BitNode Reset

    After starting BitNode 2 for the first time, the health stat does not appear to increase as expected (either by leveling up defense or by using a hospital).

    Version: Bitburner 2.1.0 release Possibly related to https://github.com/danielyxie/bitburner/issues/4242

    Steps to Reproduce:

    1. Load attached save file,
    2. Connect to w0r1d_d43m0n,
    3. Install backdoor,
    4. Select and enter BitNode2,
    5. Notice, health shows 17/10,
    6. Fail an infiltration mini-game at joesguns,
    7. Cancel infiltration,
    8. Attempt to heal at Hospital,
    9. Observe, no health is returned and the debug panel shows the error below.

    Uncaught TypeError: Cannot read properties of undefined (reading 'getCost') at getHealed (file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/main.bundle.js:21:1023391) at Object.He (file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:16072) at Ke (file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:16226) at file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:34213 at Or (file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:34307) at Mr (file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:34721) at file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:40369 at Be (file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:116040) at file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:36180 at Ar (file:///C:/Program%20Files%20(x86)/Steam/steamapps/common/Bitburner/resources/app/dist/vendor.bundle.js:247:36210) PreBitNodeReset.zip

    opened by koenenalexander 0
  • NETSCRIPT: level parameter of getActionRepGain is not really optional

    NETSCRIPT: level parameter of getActionRepGain is not really optional

    https://github.com/bitburner-official/bitburner-src/blob/303c54c85c7fddbeee312d224c4083ab1e4264de/src/NetscriptFunctions/Bladeburner.ts#L141-L155

    On line 148, it seems the intention is make level parameter optional; if level parameter is not given, use current level of given action.

    However, on line 144, if level parameter is not given properly, runtime error is thrown.

    opened by bupjae 0
  • [Balance] Infiltration SOA Rewards don't account for infiltration length

    [Balance] Infiltration SOA Rewards don't account for infiltration length

    As it is right now I can either infiltrate Rho Constrution (Maximum Level: 5) and get 3509.28 reputation for Shadows of Anarchy, or I can infiltrate Bachman and Associates (Maximum Level: 15) and get 5725.30

    I can do the first one about three times in the same time it takes me to do the second with the same likelihood of success on each challenge (99% as both are trivial 0/100 difficulty). Oh and if I run out of HP on the 15th challenge doing B&A I'm out the full 5700 whereas if I was 15 deep in Rho, I'd be out 3500 (of 10500), keeping 7000.

    The code only takes into account the starting security level of the targeted company (485 for Rho and 1350 for B&A) and the difficulty of the infiltration (so....0) with all other factors even (whether or not I have the WKS Harmonizer, my favor with SOA, etc).

    So why would I ever infiltrate a place other than Joe's Guns if I want to get the most faction rep possible for the least amount of time and effort?

    I mean sure I suppose I could infiltrate Megacorp's 50 levels deep, but my expected payout is on the order of 10,000 rep, which I can get by infiltrating Rho three times. I don't even see this being any better when automated with sleeves/singularity/etc: wouldn't it still be more efficient to go after the weaker targets forever?

    For comparison, Clarke Inc has a (ui displayed) difficulty of 36 and a depth of 18 and the reward is... a whopping 6,676.02--still less than double Rho Construction.

    • [x] Steps to reproduce
    • [x] Version of the game, e.g. Bitburner v2.1.0 (8f4636cb)
    opened by Draco18s 0
  • A way to find sleeve remaining cycles/bonus time

    A way to find sleeve remaining cycles/bonus time

    • [ ] Version of the game v2.2.0

    Could we get an api function that returns the remaining cycles/bonus time a given sleeve has? Could be in sleeve skills or its own function call. Right now there is no way outside of exploits to get these values. Hopefully easy to add, but would be very useful for many.

    opened by Zelow79 0
Owner
null
Automation scripts I use for my Bitburner gameplay videos.

Bitburner Automation Note: I release a new piece of code when I finish a video segment in the series. If it's a multi-part series, the scripts will no

Chris Rabe 68 Dec 25, 2022
Typescript & Debugging for Bitburner

Bitburner Scripts + Typescript + Local Server A Typescript template project with debugging support, import rewrites and developer convenience. How to

Mio Bambino 8 Nov 28, 2022
Repo for the official bitburner filesynchronisation package.

bitburner-filesync A file synchronisation utility for Bitburner, using the Remote File API. It allows players to synchronize scripts and text files fr

null 15 Dec 23, 2022
Shikhar 4 Oct 9, 2022
A VS Code extension to practice and improve your typing speed right inside your code editor. Practice with simple words or code snippets.

Warm Up ?? ??‍?? A VS Code extension to practice and improve your typing speed right inside your code editor. Practice with simple words or code snipp

Arhun Saday 34 Dec 12, 2022
Reference for How to Write an Open Source JavaScript Library - https://egghead.io/series/how-to-write-an-open-source-javascript-library

Reference for How to Write an Open Source JavaScript Library The purpose of this document is to serve as a reference for: How to Write an Open Source

Sarbbottam Bandyopadhyay 175 Dec 24, 2022
A recreation of a startpage posted on Reddit without the source, so I rewrote it in Next.js + Tailwind for the open source community.

Startpage "Figma Balls" Rewrite Why Did I Make This I saw a startpage posted on the subreddit r/startpages that I thought looked nice, but when I look

Thomas Leon Highbaugh 5 Mar 29, 2022
An Open-Source Platform to certify open-source projects.

OC-Frontend This includes the frontend for Open-Certs. ?? After seeing so many open-source projects being monetized ?? without giving any recognition

Open Certs 15 Oct 23, 2022
This is a project for open source enthusiast who want to contribute to open source in this hacktoberfest 2022. 💻 🎯🚀

HACKTOBERFEST-2022-GDSC-IET-LUCKNOW Beginner-Hacktoberfest Need Your first pr for hacktoberfest 2k22 ? come on in About Participate in Hacktoberfest b

null 8 Oct 29, 2022
freeCodeCamp.org's open source codebase and curriculum. Learn to code for free.

freeCodeCamp.org's open-source codebase and curriculum freeCodeCamp.org is a friendly community where you can learn to code for free. It is run by a d

freeCodeCamp.org 359.2k Jan 7, 2023
Backup of faker.js source code.

This is mirrored project from faker.js. This is created because it seemed to have been hacked. faker.js - generate massive amounts of fake data in the

dohyeon lee 2 Jan 8, 2022
✨This is My Personal Website's Source Code. 👨‍💻 I Make it with Next.js and WindiCSS

?? drackin.tk This is my personal website with Next.js + WindiCSS ☁ Weather API You can use my Weather API to see weather of locations. Simple Request

Drackin Best 5 Dec 15, 2022
Infinity bot list source code leak

This is not DMCAable!!! The repo was listed under MIT. Check package.json. "No weapon formed against me shall prosper" - Toxic Dev (510065483693817867

null 6 Feb 14, 2022
ToolJet an open-source low-code framework to build and deploy internal tools quickly without much effort from the engineering teams

ToolJet is an open-source low-code framework to build and deploy internal tools quickly without much effort from the engineering teams. You can connect to your data sources, such as databases (like PostgreSQL, MongoDB, Elasticsearch, etc), API endpoints (ToolJet supports importing OpenAPI spec & OAuth2 authorization), and external services (like Stripe, Slack, Google Sheets, Airtable) and use our pre-built UI widgets to build internal tools.

ToolJet 15.6k Jan 3, 2023
⚡️ Monorepository containing all the source code for the Foxxie Project

⚡️ Monorepository containing all the source code for the Foxxie Project

Foxxie 5 Jun 30, 2022
Source code for the #30DayChartChallenge webpage

Call me Sam: a theme for Hugo Sam is a Simple and Minimalist theme for Hugo. It lets you categorize and showcase your content the way you want to. Foc

#30DayChartChallenge 3 Apr 18, 2022
🎊 Source code of the previous version of swoth.xyz.

swoth.xyz Developed with ?? by Swôth ?? Usage Install packages. $ npm install Start development server at ::3000 port. $ npm run dev Build for product

Swôth 11 Dec 17, 2022
Source code and 3D assets for the Rings (for Loot) NFT project

Rings (for Loot) Rings (for Loot) is the first and largest 3D interpretation of an entire category in Loot. Adventurers, builders, and artists are enc

null 46 Dec 24, 2022