An open source cybersecurity protocol for syncing decentralized graph data.

Overview

Travis FOSSA Status Gitter

GUN is an ecosystem of tools that let you build community run and encrypted applications.

Currently, Internet Archive and HackerNoon run GUN in production.

Decentralized alternatives to Zoom, Reddit, Slack, YouTube, Wikipedia, etc. have already pushed terabytes of daily P2P traffic on GUN. We are a friendly community creating a free fun future for freedom:

The ecosystem is one nice stack of technologies that looks like this: (names -> use case)

For now, it is best to start with GUN and just use it to learn the basics, since it is so easy: (or want to read more? Skip ahead to the "What is GUN?" section.)

Quickstart

  • Try the interactive tutorial in the browser (5min ~ average developer).
  • Or npm install gun and run the examples with cd node_modules/gun && npm start (5min ~ average developer).

Note: If you don't have node or npm, read this first. If the npm command line didn't work, you may need to mkdir node_modules first or use sudo.

<script src="https://cdn.jsdelivr.net/npm/gun/gun.js"></script>
<script>
// var Gun = require('gun'); // in NodeJS
// var Gun = require('gun/gun'); // in React
var gun = Gun();

gun.get('mark').put({
  name: "Mark",
  email: "[email protected]",
});

gun.get('mark').on(function(data, key){
  console.log("update:", data);
});
</script>
  • Or try something mind blowing, like saving circular references to a table of documents! (play)
var cat = {name: "Fluffy", species: "kitty"};
var mark = {boss: cat};
cat.slave = mark;

// partial updates merge with existing data!
gun.get('mark').put(mark);

// access the data as if it is a document.
gun.get('mark').get('boss').get('name').once(function(data, key){
  // `val` grabs the data once, no subscriptions.
  console.log("Mark's boss is", data);
});

// traverse a graph of circular references!
gun.get('mark').get('boss').get('slave').once(function(data, key){
  console.log("Mark is the slave!", data);
});

// add both of them to a table!
gun.get('list').set(gun.get('mark').get('boss'));
gun.get('list').set(gun.get('mark'));

// grab each item once from the table, continuously:
gun.get('list').map().once(function(data, key){
  console.log("Item:", data);
});

// live update the table!
gun.get('list').set({type: "cucumber", goal: "scare cat"});

Want to keep building more? Jump to THE DOCUMENTATION!

What is GUN?

First & foremost, GUN is a community of the nicest and most helpful people out there. So I want to invite you to come tell us about what you are working on & wanting to build (new or old school alike! Just be nice as well.) and ask us your questions directly. :)

On that note, let's get some official shout outs covered first:

Support

Thanks to:

Robert Heessels, Lorenzo Mangani, NLnet Foundation, Sam Liu, Daniel Dombrowsky, Vincent Woo, AJ ONeal, Bill Ottman, Mike Lange, Sean Matheson, Alan Mimms, Dário Freire, John Williamson, Robin Bron, Elie Makhoul, Mike Staub, Bradley Matusiak

History

GUN was created by Mark Nadal in 2014 after he had spent 4 years trying to get his collaborative web app to scale up with traditional databases.

After he realized Master-Slave database architecture causes one big bottleneck, he (as a complete newbie outsider) naively decided to question the status quo and shake things up with controversial, heretical, and contrarian experiments:

The NoDB - no master, no servers, no "single source of truth", not built with a real programming language or real hardware, no DevOps, no locking, not just SQL or NoSQL but both (all - graphs, documents, tables, key/value).

The goal was to build a P2P database that could survive living inside any browser, and could correctly sync data between any device after assuming any offline-first activity.

Technically, GUN is a graph synchronization protocol with a lightweight embedded engine, capable of doing 20M+ API ops/sec in just ~9KB gzipped size.

Documentation

API reference

Tutorials

Examples

GraphQL

Electron

React & Native

Vue

Svelte

Webcomponents

CAP Theorem Tradeoffs

How Data Sync Works

How GUN is Built

Crypto Auth

Modules

Roadmap

This would not be possible without community contributors, big shout out to:

ajmeyghani (Learn GUN Basics with Diagrams); anywhichway (Block Storage); beebase (Quasar); BrockAtkinson (brunch config); Brysgo (GraphQL); d3x0r (SQLite); forrestjt (file.js); hillct (Docker); JosePedroDias (graph visualizer); JuniperChicago (cycle.js bindings); jveres (todoMVC); kristianmandrup (edge); Lightnet (Awesome Vue User Examples & User Kitchen Sink Playground); lmangani (Cytoscape Visualizer, Cassandra, Fastify, LetsEncrypt); mhelander (SEA); omarzion (Sticky Note App); PsychoLlama (LevelDB); RangerMauve (schema); robertheessels (gun-p2p-auth); rogowski (AXE); sbeleidy; sbiaudet (C# Port); Sean Matheson (Observable/RxJS/Most.js bindings); Shadyzpop (React Native example); sjones6 (Flint); Stefdv (Polymer/web components); zrrrzzt (JWT Auth); xmonader (Python Port);

I am missing many others, apologies, will be adding them soon! This list is infintiely old & way out of date, if you want to be listed in it please make a PR! :)

Testing

Tests may be run with npm test. Tests will trigger persistent writes to the DB, so subsequent runs of the test will fail. You must clear the DB before running the tests again. This can be done by running the following command in the project directory.

rm -rf *data*

Additional Cryptography Libraries

These are only needed for NodeJS & React Native, they shim the native Browser WebCrypto API.

If you want to use SEA for User auth and security, you will need to install:

npm install text-encoding @peculiar/webcrypto --save

Please see our React Native docs for installation instructions!

Then you can require SEA without an error:

var GUN = require('gun/gun');
var SEA = require('gun/sea');

Deploy

Note: The default examples that get auto-deployed on npm start CDN-ify all GUN files, modules, & storage.

To quickly spin up a GUN relay peer for your development team, utilize either Heroku, Docker, any variant thereof Dokku, Flynn.io, now.sh, etc. ! Or use all of them so your relays are decentralized too!

Heroku

Deploy

Heroku deletes your data every 15 minutes, one way to fix this is by adding cheap storage.

Or:

git clone https://github.com/amark/gun.git
cd gun
heroku create
git push -f heroku HEAD:master

Then visit the URL in the output of the 'heroku create' step, in a browser.

Now.sh

npm install -g now
now --npm amark/gun

Then visit the URL in the output of the 'now --npm' step, in your browser.

Unubo

Fork this GUN repo (Unubo only deploys from your own GitHub repo's).
Add a Node.js app, select your GUN fork, set npm start start as the command and deploy.

From the experience of genderev, this only works if you set your country to the United States.

Visit the deployed app by following the 'view app' button, in your browser.

Docker

Warning: Docker image is community contributed and may be old with missing security updates, please check version numbers to compare.

Docker Automated buil Docker Pulls Docker Stars

Pull from the Docker Hub . Or:

docker run -p 8765:8765 gundb/gun

Or build the Docker image locally:

git clone https://github.com/amark/gun.git
cd gun
docker build -t myrepo/gundb:v1 .
docker run -p 8765:8765 myrepo/gundb:v1

Or, if you prefer your Docker image with metadata labels (Linux/Mac only):

npm run docker
docker run -p 8765:8765 username/gun:git

Then visit http://localhost:8765 in your browser.

License

Designed with by Mark Nadal, the GUN team, and many amazing contributors.

Openly licensed under Zlib / MIT / Apache 2.0.

FOSSA Status

YouTube . Twitter

Comments
  • GUN is not a great brand name

    GUN is not a great brand name

    It's quite hard to search the internet for references to Gun. Sometimes I use "Gun DB", but still, due to the strong polarising debate of gun use in the USA, even "Gun DB" can turn up short.

    Perhaps there's an official search term we should use - perhaps "GunDB"?. If so, all the branding and all mentions of "GUN" should be changed to "GunDB".

    Otherwise, you might consider changing the brand name in the next 1-3 years. You might choose a word where it would be easy to rank #1 in internet searches. I think "Slack" did a good job in that regard.

    Thanks.

    opened by merarischroeder 37
  • Schema

    Schema

    Support a schema record. Each field in a schema would have the following properties:

    • name (required) any object using the schema would have the same name
    • JavaScript or plugin type (required) initially would support JavaScript object types 'string', 'int', 'date', 'boolean', but could be extended to support custom types (e.g. map object could include latitude and longitude)
    • description (optional) primarily for documentation purposes
    • validation (optional) must account for XSS

    Schemas could be used for tabular or document based objects. Any object based on the schema would need to use the same names:

    { schema: { 
          A: { name: 'first-name', type: 'string', val: 'string at least 3 chars no more than 21 chars' } 
          A: { name: 'date-of-birth', type: 'date' } 
       },
       ASDF: { A: 'Bob', B: '345678098765' },
       FDSA: { A: 'Dan', B: '987654456789' }
    }
    

    The scheme does not need to be embedded in the metadata, it can be by reference.

    Extension 
    opened by metasean 37
  • react native support

    react native support

    using isomorphic-webcrypto which uses @peculiar/webcrypto for node. it also uses msrcrypto for environments without webcrypto (ie react native) and also webcrypto-liner and asmcrypto under the hood to add missing support to pbkdf2 some SEA methods required to change syntax example react-native app on expo that uses this branch with some SEA tests https://expo.io/@sirpy/gun-sea-test expo code here: https://github.com/GoodDollar/gun-expo-react-native

    opened by sirpy 34
  • Building Mobile apps with GunDB?

    Building Mobile apps with GunDB?

    Hello,

    I'm excited to discover gundb as i was looking for firebase alternatives. The problem I see is: Gun seems to be limited to web browsers as it's javascript dependent. I don't know how to leverage for building mobile-apps for iOS/Android?

    Thanks, Rajan

    opened by Rajan 25
  • Array buffer allocation failed

    Array buffer allocation failed

    2020-09-28T16:20:25.633340329Z Hello wonderful person! :) Thanks for using GUN, please ask for help on http://chat.gun.eco if anything takes you longer than 5min to figure out!
    2020-09-28T16:20:25.871157091Z AXE enabled.
    2020-09-28T16:20:25.881821005Z Relay peer started on port 8765 with /gun
    2020-09-28T16:20:43.710747982Z Disk count not same as ram count.
    2020-09-28T16:46:27.956889030Z Disk count not same as ram count.
    2020-09-28T16:46:51.712915625Z buffer.js:427
    2020-09-28T16:46:51.729062369Z     return createFromString(string, ops.encodingVal);
    2020-09-28T16:46:51.729097098Z            ^
    2020-09-28T16:46:51.729102160Z 
    2020-09-28T16:46:51.729106341Z Error: Failed to allocate memory
    2020-09-28T16:46:51.729110319Z     at createFromString (<anonymous>)
    2020-09-28T16:46:51.729797085Z     at fromStringFast (buffer.js:427:12)
    2020-09-28T16:46:51.729802762Z     at fromString (buffer.js:456:10)
    2020-09-28T16:46:51.729806694Z     at Function.from (buffer.js:306:12)
    2020-09-28T16:46:51.729810588Z     at writeFd (fs.js:1351:21)
    2020-09-28T16:46:51.729814536Z     at fs.js:1345:7
    2020-09-28T16:46:51.730371576Z     at FSReqCallback.oncomplete (fs.js:156:23) {
    2020-09-28T16:46:51.730388614Z   code: 'ERR_MEMORY_ALLOCATION_FAILED'
    2020-09-28T16:46:51.730392934Z }
    
    2020-09-29T06:25:41.528550238Z Hello wonderful person! :) Thanks for using GUN, please ask for help on http://chat.gun.eco if anything takes you longer than 5min to figure out!
    2020-09-29T06:25:41.755755073Z AXE enabled.
    2020-09-29T06:25:41.767859659Z Relay peer started on port 8765 with /gun
    2020-09-29T06:25:48.893620793Z Disk count not same as ram count.
    2020-09-29T06:29:41.368388955Z Disk count not same as ram count.
    2020-09-29T06:30:07.391507109Z internal/buffer.js:945
    2020-09-29T06:30:07.396271180Z class FastBuffer extends Uint8Array {}
    2020-09-29T06:30:07.396292758Z ^
    2020-09-29T06:30:07.396297359Z 
    2020-09-29T06:30:07.396301076Z RangeError: Array buffer allocation failed
    2020-09-29T06:30:07.396304770Z     at new ArrayBuffer (<anonymous>)
    2020-09-29T06:30:07.396998239Z     at new Uint8Array (<anonymous>)
    2020-09-29T06:30:07.397003926Z     at new FastBuffer (internal/buffer.js:945:1)
    2020-09-29T06:30:07.397008282Z     at createUnsafeBuffer (buffer.js:150:12)
    2020-09-29T06:30:07.397012161Z     at allocate (buffer.js:420:10)
    2020-09-29T06:30:07.397015975Z     at Function.allocUnsafe (buffer.js:385:10)
    2020-09-29T06:30:07.397019629Z     at concat (/app/node_modules/ws/lib/buffer-util.js:17:25)
    2020-09-29T06:30:07.397023703Z     at Receiver.dataMessage (/app/node_modules/ws/lib/receiver.js:430:21)
    2020-09-29T06:30:07.397027512Z     at Receiver.getData (/app/node_modules/ws/lib/receiver.js:367:17)
    2020-09-29T06:30:07.397031147Z     at Receiver.startLoop (/app/node_modules/ws/lib/receiver.js:143:22)
    
    2020-09-29T07:02:06.389424454Z Hello wonderful person! :) Thanks for using GUN, please ask for help on http://chat.gun.eco if anything takes you longer than 5min to figure out!
    2020-09-29T07:02:06.579548174Z AXE enabled.
    2020-09-29T07:02:06.591699323Z Relay peer started on port 8765 with /gun
    2020-09-29T07:02:15.990414655Z Disk count not same as ram count.
    2020-09-29T07:08:48.311932536Z Disk count not same as ram count.
    2020-09-29T07:08:48.312046348Z Disk count not same as ram count.
    2020-09-29T07:09:13.932896576Z terminate called after throwing an instance of 'std::bad_alloc'
    2020-09-29T07:09:14.091742655Z   what():  std::bad_alloc
    

    original log file: gun-logs.txt

    opened by septs 23
  • TypeScript

    TypeScript

    Hi, what is your opinion about TypeScript. TypeScript got a lot of attraction. Even Angular 2 is written in TypeScript. Is it something you also think about for GunDB?

    opened by BartNetJS 23
  • Simplify angular demo

    Simplify angular demo

    I wasn't really finished last time when you merged #365 :) Let's keep this open until we finished discussing what can be improved!

    This simplify some things:

    • Use ngx-pipes to transform object to array of pairs (instead of my ugly code)
    • Extract GunDb in its own file (just for clarity)
    • Introduce deletion (by clicking on an element).

    It works well, but still, as I explained in my previous PR, the problem is that I think that gun wasn't meant to be really used like this… From what I read in your examples and demos, when you want to iterate over the elements of the todo object, you use gun.get('todos').map().on(...), i.e., you execute a function for EACH of the properties which will mutate the view.

    With angular and reactive programming, a common way of writing this would be more declarative: you specify how the view is expressed in function of the set of todos (see the html code). In my case, I use something that would end up calling gun.get('todos').on(....) (it is gun-edge and its $rx function that does this by making the new state of the object, i.e. the object passed to the on(...), into an Observable event). And unfortunately, this object will contain not only the elements that would be present in the map, but also some special properties such as _ which I then have to manually remove.

    So, I'm not sure how this kind of situation is meant to be handled with gun… and maybe gun should evolve w.r.t. to this kind of need? Or is there already some utility libraries that ease this kind of us?

    opened by victornoel 22
  • Browserify for client-side build

    Browserify for client-side build

    I think it'd be nice if the client side code got split up somewhat in order to have all the logical pieces in separate modules. This would also reduce the need for having the self executing function wrappers everywhere and the use of global scope. As well, this could potentially allow us to reuse a lot of the code between the browser version and the node.js version. A potential downside is that the file size might go up a teeny bit, but that shouldn't be too much of an issue if we configure the build correctly.

    Would you guys be interested in a pull request for such a change?

    opened by RangerMauve 21
  • [WIP] Add ES modules to unbuild process

    [WIP] Add ES modules to unbuild process

    Opening a PR while still WIP. Wanted to make the diff easy for people to review. Relates to https://github.com/amark/gun/issues/789

    Status

    Builds and runs without error. .on() appears to work in a quick initial test. No other tests done yet.

    Testing

    https://github.com/rm-rf-etc/webpack-test

    Misc

    @amark if I change webpack to production mode, the file is 26KB (uncompressed). MacOS says gun.min.js is ~34KB.

    So then I tested with closure compiler (here). I just copied the text content into the box and ran it without any changes to the build options. From master: 12.57KB gzipped (33.19KB uncompressed) From webpack: 9.95KB gzipped (25.16KB uncompressed)

    opened by rm-rf-etc 19
  • Could not use static es6 import 'gun/sea' ?

    Could not use static es6 import 'gun/sea' ?

    If you do this:

    import 'gun/sea';

    we'll get:

    Uncaught Error: Cannot find module './gun.js'

    but if:

    require('gun/sea');

    everything will be OK.

    With this, is possible to do somethingcan so that I could use static es6 import?

    opened by Kirpich634 19
  • GunDB Limitations

    GunDB Limitations

    Hey @amark!

    I listened to you JS Jabber episode the other day and got thinking about how I might use Gun in a project I'm working on.

    Just a practical question, though: assuming am S3 storage adapter, what kind of concerns are there about using Gun across a large dataset?

    I'm working on a project that involves scraping a lot of JSON data - not quite "big data" levels, but enough to think carefully about database limitations. Currently at around 20GB of json right now, and growing by 2-3GB per month, and will eventually want to expand the dataset quite a bit (multiple times that).

    I know Gun operates primarily in memory, so I'm curious what walls I might run into, and if there's anything special I should be thinking about before diving into Gun.

    opened by brettneese 19
  • GunHookCallbackAuth has the wrong type in Typescript def

    GunHookCallbackAuth has the wrong type in Typescript def

    when I do gun. On('auth', (user, message, event) => {}). The user object I get at runtime is this as stated in documents

    // on success calls callback with a reference to the gun user
    // cb(at) where at is an object as below
    {
        ack: 2,
        back: object, //reference to the root object (internal)
        get: "~publicKeyOfUser",
        gun: object, //gun root (internal)
        id: 6, //id of the node in graph (internal)
        on: function onto(),
        opt: object, //uuid function object (internal)
        put: object, //object containing pub, alias and epub of the user
        root: object, //gun root reference (internal)
        sea: object, //object containing keys of the user
        soul: "~publicKeyOfUser",
        tag: object //gun in and out reference (internal)
    }
    // on failure callback is called cb(ack) where ack is as below
    {
        err: 'Wrong user or password.'
    }
    

    But the type definition in typescript is

    export type GunUser = {
      /** Username or Alias which can be used to find a user */
      alias: string;
      // auth: string;
      /** public key for encryption */
      epub: string;
      /** public key */
      pub: string;
    };
    
    

    as defined in https://github.com/amark/gun/blob/master/types/sea/GunUser.d.ts

    opened by nerocui 0
  • radix thowing error

    radix thowing error

    image

    with a gun config like:

    import Gun from "gun";
    import "gun/sea";
    // import "gun/axe";
    import "gun/lib/radix";
    import "gun/lib/radisk";
    import "gun/lib/store";
    import "gun/lib/rindexed";
    
    export const db = new Gun({
      peers: [
        "https://relay.129.153.59.37.nip.io/gun",
        "https://gun-manhattan.herokuapp.com/gun",
      ],
      localStorage: false,
    });
    
    opened by atordvairn 0
  • `put` ignores all nested variables if one of them is an empty object

    `put` ignores all nested variables if one of them is an empty object

    https://jsbin.com/raleguqaca/1/edit?js,console

    gun.get('layer0').put({
      value: true,
      emptyObject: {},
      layer1: {
        value: false, 
        value2: false,
        layer2: {a:1}
      }
    })
    
    gun.get('layer0').get('layer1').once(print)
    

    everything in layer1 wont get added because of the empty object. The once statement will only print undefined

    opened by ViteOrder 3
  • Unfinished webrtc negotiation rework

    Unfinished webrtc negotiation rework

    Why

    To be able to use single GUNs peer connection for sending video and audio in a meeting app

    How

    Implement perfect negotiation to be able to add or remove new application specific video/audio/data channels with proper renegotiation and see incoming streams on the other side

    Current state

    Abandoned. Broken and I don't even recall why. afair it is because I was only able to send one ACK for a single message

    Initial idea (afair)

    Per each peer we need separate bidirectional signalling channel so that both sides could trigger renegotiation when adding new audio/video streams. So I tried to implement bidirectional channel via ACKs, but was only able to send only one in a given "channel" (gundb specifics?)

    Why make pull request then?

    atm I abandoned the project. If someone else wants the same feature they can maybe start from here. Or this is gibberish and can be ignored.

    In any case. If you will decide to continue from here. You will probably first have to implement bidirectional communication between selected peers first and after that perfect negotiation will be easy peasy

    opened by verschmelzen 1
  • Gun ignores '/' at the end of soul policy

    Gun ignores '/' at the end of soul policy

    Heres a senario:

    {
      "mention": {
         // I want users to be able to write
        "posts": {
           // here
        },
        "comments": {
          // and here
        },
        // but not here, in the mention soul itself
      } 
    }
    

    I should be able to solve this using one certificate; one that requires the soul to start with mention/. This should work because ~pub/mention and ~pub/mention/ are two different nodes But, as shown by this jsbin, it does not. The policy {"*":"mention/"} allows people to write to ~pub/mention

    In the usecase I showed this can easily be worked around by using two certificates, but I think I think this should be fixed regardless

    opened by ViteOrder 0
  • setTimeout.each is not a function

    setTimeout.each is not a function

    I started getting error as in title.

    gun,js:1611 at t.hi (gun.js:1611:16) at r.onopen (gun.js:1703:15)

    Any idea how to fix that?

    Doesn't work only with sentry

    opened by KrzysztofZawisla 2
Releases(0.2019.413)
  • 0.2019.413(Apr 15, 2019)

  • 0.9.999998(Jan 16, 2019)

  • 0.6.3(Feb 24, 2017)

  • v0.3.4(Feb 8, 2016)

    • Breaking Change! list.set(item) returns the item's chain now, not the list chain.
    • Client and Server GUN servers are now more up to spec, trimmed excess HTTP/REST header data.
    • Gun.is.lex added.
    Source code(tar.gz)
    Source code(zip)
  • v0.3.3(Feb 5, 2016)

    • Native node links for shorthand graph structures You can now easily link nodes by passing it's gun reference, gun.get('mark').path('owner').put(gun.get('cat'))
    • Core integration for lists/tables/collections Gun now supports a shorthand for lists using the .set method: gun.get('users').set(gun.get('person/mark')).
    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Feb 2, 2016)

  • v0.3.1(Feb 2, 2016)

  • v0.3.0(Feb 2, 2016)

    • Server side default .wsp() renamed from .attach().
    • .set() deprecated because it did a bunch of random inconsistent things. Its useful behavior has now become implicit (see below) or can be done explicitly.
    • .not() it was previously common to return the chain inside of .not, beware that if you have code like gun.get(key).not(function(){ return this.put({}).key(key) }).val() cause .val() to be triggered twice (this is intentional, because it funnels two separate chains together) which previously didn't happen. To fix this, just don't return the chain.
    • .put() and .path() do implicit .init() by default, turn on explicit behavior with Gun({init: true}).
    • .get(soul, cb) cb is called back with err, node rather than err, graph.
    • Options opt.wire renamed from opt.hooks.
    • .val() when called empty automatically cleanly logs for convenience purposes.
    • .init() added.
    • Gun.is.val renamed from Gun.is.value.
    • Gun.is.rel renamed from Gun.is.soul.
    • Gun.is.node.soul renamed from Gun.is.soul.on.
    • Gun.union.ify renamed from Gun.union.pseudo.
    • Gun.union.HAM renamed from Gun.HAM.
    • Gun.HAM is now the actual HAM function for conflict resolution.
    • Gun._.state renamed from Gun._.HAM.
    • Maximum Callstack Exceeded is less problematic now, unless you intentionally choke the thread. #95
    • Putting a regex or Date or NaN is actually detected and causes an error now while before it was silent. #122 #123
    • .on() gets called when a key is later newly made while before it did not. #116
    • .val() should not ever get called with a relation alone (internals should resolve it), this is fixed. #132
    Source code(tar.gz)
    Source code(zip)
  • v0.2.5(Feb 1, 2016)

  • v0.2.4(Feb 1, 2016)

  • v0.0.9-n(Jan 28, 2015)

  • v0.0.9-m(Jan 28, 2015)

  • v0.0.9-l(Jan 26, 2015)

  • v0.0.9-i(Jan 24, 2015)

An example repository on how to start building graph applications on streaming data. Just clone and start building 💻 💪

Example Streaming App ?? ?? This repository serves as a point of reference when developing a streaming application with Memgraph and a message broker

Memgraph 40 Dec 20, 2022
Peer-to-Peer Databases for the Decentralized Web

OrbitDB OrbitDB is a serverless, distributed, peer-to-peer database. OrbitDB uses IPFS as its data storage and IPFS Pubsub to automatically sync datab

OrbitDB 7.4k Jan 1, 2023
A pure node.js JavaScript Client implementing the MySQL protocol.

mysql Table of Contents Install Introduction Contributors Sponsors Community Establishing connections Connection options SSL options Connection flags

null 17.6k Jan 1, 2023
Open source code of classic.minecraft.net

Minecraft classic Open source This Project is a clone for classic.minecraft.net. Owner of this Repo (CodeWhiteWeb) doesn't have any rights to this pro

CodeWhiteWeb 4 Dec 16, 2022
Yaade is an open-source, self-hosted, collaborative API development environment.

Yaade - Yet Another API Development Environment Yaade is an open-source, self-hosted, collaborative API development environment. ?? Why did you develo

null 1k Dec 28, 2022
StashQL is a light-weight, open-source npm package that improves the speed of your GraphQL queries in your application.

Table of Contents What is StashQL? Install Getting Started Queries Mutations refillCache clearRelatedFields Logging The Team What is StashQL? StashQL

OSLabs Beta 67 Sep 30, 2022
open source ffxiv community discord bot that's incredibly easy to self-host

Venat Venat is an open-source Discord bot for the Final Fantasy XIV community that is incredibly easy to self-host. Description We aim to offer the fo

The Convocation 16 Jun 9, 2022
AlaSQL.js - JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or Excel.

Please use version 1.x as prior versions has a security flaw if you use user generated data to concat your SQL strings instead of providing them as a

Andrey Gershun 6.1k Jan 9, 2023
Azure Data Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.

Azure Data Studio is a data management tool that enables working with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.

Microsoft 7k Dec 31, 2022
An open letter against Apple's new privacy-invasive client-side content scanning.

Apple Privacy Letter An open letter against Apple's new privacy-invasive client-side content scanning technology. View the letter Sign the letter This

Nadim Kobeissi 655 Dec 19, 2022
If you are a Slack browser user, this userscript will allow you to auto-redirect without Slack asking if you want to open on the desktop app.

Auto-redirect for browser Slack users If you are a Slack browser user, this userscript will allow you to auto-redirect without Slack asking if you wan

Felipe Santos (he/him) 6 Aug 23, 2022
TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, PostgreSQL and SQLite databases.

TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, PostgreSQL and SQLite datab

MikroORM 5.4k Dec 31, 2022
Composable data framework for ambitious web applications.

Orbit Orbit is a composable data framework for managing the complex needs of today's web applications. Although Orbit is primarily used as a flexible

Orbit.js 2.3k Dec 18, 2022
:green_book: SheetJS Community Edition -- Spreadsheet Data Toolkit

SheetJS js-xlsx Parser and writer for various spreadsheet formats. Pure-JS cleanroom implementation from official specifications, related documents, a

SheetJS 32k Jan 9, 2023
Bluzelle is a smart, in-memory data store. It can be used as a cache or as a database.

SwarmDB ABOUT SWARMDB Bluzelle brings together the sharing economy and token economy. Bluzelle enables people to rent out their computer storage space

Bluzelle 225 Dec 31, 2022
Add hic et nunc data into your websites and Node.js scripts

hic et nunc API Guide Build websites and Node.js scripts with hic et nunc data hic et nunc is a decentralized NFT marketplace built on the Tezos block

Ian Petrarca 34 May 3, 2022
Jsynchronous.js - Data synchronization for games and real-time web apps.

Jsynchronous.js Synchronize your rapidly changing app state with all connected browsers. Jsynchronous ensures all clients see the same data as what’s

Sirius 111 Dec 16, 2022
Python ELT Studio, an application for building ELT (and ETL) data flows.

PELT Studio The Python Extract, Load, Transform Studio is an application for performing ELT (and ETL) tasks. Under the hood the application consists o

Schlerp 55 Nov 18, 2022
membuat sebuah module pengganti database engine untuk mengelola data secara advance

Donate Sosial Media Introduction Database atau basis data adalah kumpulan data yang dikelola sedemikian rupa berdasarkan ketentuan tertentu yang salin

Jefri Herdi Triyanto 6 Dec 17, 2021