Code Monkey home page Code Monkey logo

ngx-odm's Introduction

@ngx-odm/rxdb

Angular 14+ wrapper for RxDB - A realtime Database for the Web

Demo

Example Screencast

demo - based on TodoMVC

Table of contents

General info

If you don't want to setup RxDB manually in your next Angular project - just import NgxRxdbModule or go with provideRxDatabase and provideRxCollection if standalone component is your choice.

Technologies

RxDB Angular 14+
RxDB Angular

Install

npm install @ngx-odm/rxdb

Usage (NgModule)

In your AppModule

import { NgxRxdbModule } from '@ngx-odm/rxdb';
import { getRxDatabaseCreator } from '@ngx-odm/rxdb/config';

@NgModule({
  imports: [
    // ... other imports
    NgxRxdbModule.forRoot(
      getRxDatabaseCreator({
        name: 'demo', // <- name (required, 'ngx')
        storage: getRxStorageDexie(), // <- storage (not required, 'dexie')
        localDocuments: true,
        multiInstance: true, // <- multiInstance (optional, default: true)
        ignoreDuplicate: false,
        options: {
          plugins: [
            // will be loaded by together with core plugins
            RxDBDevModePlugin, // <- add only for development
            RxDBAttachmentsPlugin,
            RxDBLeaderElectionPlugin,
          ],
          storageType: 'dexie|memory', // <- storageType (optional, use if you want defaults provided automatically)
          dumpPath: 'assets/dump.json', // path to datbase dump file (optional)
        },
      })
    ),
  ],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule {}

In your FeatureModule

Schemas define how your data looks. Which field should be used as primary, which fields should be used as indexes and what should be encrypted. The schema also validates that every inserted document of your collections conforms to the schema. Every collection has its own schema. With RxDB, schemas are defined with the jsonschema-standard which you might know from other projects. https://rxdb.info/rx-schema.html

import type { RxCollectionCreatorExtended } from '@ngx-odm/rxdb/config';
// create or import your schema
const todoSchema: RxSchema = require('../../../assets/data/todo.schema.json');
// create config
const todoCollectionConfig: RxCollectionCreatorExtended = {
  name: 'todo', // <- name (required)
  schema: todoSchema, // <- schema (not required, see below)
  localDocuments: true,
  options: {
    initialDocs: [], // docs to be imported into empty collection (optional)
    schemaUrl: 'assets/data/todo.schema.json', // load schema from remote url (optional)
    replicationStateFactory: collection => {
      // provide replication state (optional)
    },
  },
};

@NgModule({
  imports: [
    // ... other imports
    NgxRxdbModule.forFeature(todoCollectionConfig),
  ],
})
export class TodosModule {
  constructor(
    @Inject(RXDB_COLLECTION) private collectionService: RxDBCollectionService<Todo>
  ) {
    this.collectionService.sync(); // INFO: collection is ready
  }
}

In your FeatureService

import { RXDB_COLLECTION } from '@ngx-odm/rxdb';
import { RxDBCollectionService } from '@ngx-odm/rxdb/collection';

@Injectable()
export class TodosService {
  private collectionService: RxDBCollectionService<Todo> =
    inject<RxDBCollectionService<Todo>>(RXDB_COLLECTION);
  // store & get filter as property of a `local` document
  filter$ = this.collectionService
    .getLocal('local', 'filterValue')
    .pipe(startWith('ALL'), distinctUntilChanged());
  // get count of documents in collection as observable
  count$ = this.collectionService.count();

  // get documents from collection as observable
  // optionally using `RxQuery` mango-queries
  todos$: Observable<Todo[]> = this.collectionService.docs();

  // add new document
  add(name: string): void {
    const payload: Todo = { guid: uuid(), name, done: false, dateCreated: Date.now() };
    this.collectionService.insert(payload);
  }

  // update property of single document
  toggle(guid: string, done: boolean): void {
    this.collectionService.set(guid, { done });
  }

  // update many documents with partial data by query
  toggleAllTodos(completed: boolean) {
    this.collectionService.updateBulk(
      { selector: { completed: { $eq: !completed } } },
      { completed }
    );
  }

  // remove many dcouments by qeury
  removeCompletedTodos(): void {
    this.collectionService.removeBulk({ selector: { completed: true } });
  }
  // ...
}

Usage (Standalone)

In your main.ts

import { provideRxDatabase } from '@ngx-odm/rxdb';
import { getRxDatabaseCreator } from '@ngx-odm/rxdb/config';

export const appConfig: ApplicationConfig = {
  providers: [
    // ... other providers
    provideRxDatabase(
      getRxDatabaseCreator({
        name: 'demo',
        localDocuments: true,
        multiInstance: true,
        ignoreDuplicate: false,
        storage: getRxStorageDexie(),
        plugins: [
          // will be loaded by together with core plugins
          RxDBDevModePlugin, // <- add only for development
          RxDBAttachmentsPlugin,
          RxDBLeaderElectionPlugin,
        ],
      })
    ),
  ],
};

bootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));

In your Component

import { provideRxCollection } from '@ngx-odm/rxdb';

@Component({
  standalone: true,
  // ...
  providers: [provideRxCollection(config)],
})
export class StandaloneComponent {
  readonly todoCollection = inject(NgxRxdbCollectionService<Todo>);
}

Using sginals & signalStore from @ngrx/signals

import { signalStore } from '@ngrx/signals';
import { withEntities } from '@ngrx/signals/entities';
import { withCollectionService } from '@ngx-odm/rxdb/signals';
import { withDevtools } from '@angular-architects/ngrx-toolkit';

export const TodoStore = signalStore(
  { providedIn: 'root' },
  withDevtools('todo'),
  withEntities<Todo>(),
  // INFO: an instance of RxCollection will be provided by this
  withCollectionService<Todo, TodosFilter, RxCollectionCreatorExtended>({
    filter: 'ALL' as TodosFilter,
    collectionConfig: TodosCollectionConfig,
  }),
  ...
);

@Component({
  standalone: true,
  // ...
  providers: [TodoStore],
})
export class StandaloneComponent {
  readonly todoStore = inject(TodoStore);

  constructor() {
    effect(() => {
      const { filter, entities } = this.todoStore;
    });
  }
}

Features

By using this module you can simplify your work with RxDB in Angular application:

  • Automatically initialize db with settings
    • optionally provide db dumb to pre-fill collections
    • optionally provide array of initial documents to pre-fill collection
    • optionally provide remote location for schema and fetch it automatically before create collection (e.g. to maintain single source of truth for schema)
    • optionally provide syncronization with remote db (CouchDB, Kinto etc.) as DB options
  • Automatically initialize RxCollection for each lazy-loaded Feature module / standalone component with config
  • Work with documents via NgxRxdbCollectionService with unified methods instead of using RxCollection directly (though you still have access to RxCollection and RxDatabase instance)
    • simple methods to work database & documents (with queries)
    • simple methods to work with local documents
    • simple methods to work with attachments
    • simple replication sync initialization
  • Work with signals and entities with @ngrx/signals and @ngrx/entity (optionally zoneless) (see example)
  • Persist collection query (mango-query-syntax) in URL with new plugin query-params-plugin (in demo, set localStorage _ngx_rxdb_queryparams )
    • provide Observable of current URL (automatically for Angular)
    • simple methods to set or patch filter, sort, limit, skip

Status

Project is: in progress

Inspiration

Project inspired by

Notes

Contact

Created by @voznik - feel free to contact me!

ngx-odm's People

Contributors

renovate[bot] avatar voznik avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

ngx-odm's Issues

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Edited/Blocked

These updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox.

  • chore(deps): update jest (@nrwl/jest, @nx/jest, jest-preset-angular)
  • fix(deps): update all dependencies (@angular-architects/ngrx-toolkit, @angular-devkit/build-angular, @angular-devkit/core, @angular-devkit/schematics, @angular-eslint/eslint-plugin, @angular-eslint/eslint-plugin-template, @angular-eslint/template-parser, @angular/animations, @angular/cli, @angular/common, @angular/compiler, @angular/compiler-cli, @angular/core, @angular/forms, @angular/language-service, @angular/platform-browser, @angular/platform-browser-dynamic, @angular/router, @angular/service-worker, @commitlint/cli, @commitlint/config-conventional, @jscutlery/semver, @nrwl/angular, @nrwl/eslint-plugin-nx, @nrwl/tao, @nrwl/web, @nrwl/workspace, @nx/angular, @nx/eslint, @nx/eslint-plugin, @nx/js, @nx/workspace, @schematics/angular, @swc-node/register, @swc/core, @types/node, @types/webpack, @typescript-eslint/eslint-plugin, @typescript-eslint/parser, actions/cache, actions/checkout, actions/deploy-pages, actions/setup-node, actions/upload-artifact, actions/upload-pages-artifact, fs-extra, husky, lcov-result-merger, ng-packagr, ngxtension, nrwl/nx-set-shas, nx, postcss-import, postcss-preset-env, postgres, prettier, query-string, reflect-metadata, rimraf, source-map-explorer, ts-node, tslib, zone.js)

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

docker-compose
docker-compose.couch.yml
  • couchdb 3
docker-compose.kinto.yml
  • postgres 14
  • memcached 1
github-actions
.github/workflows/main.yaml
  • actions/checkout v4
  • actions/setup-node v2
  • actions/cache v2
  • nrwl/nx-set-shas v3
  • actions/upload-artifact v2
  • actions/upload-pages-artifact v2
  • actions/deploy-pages v2
.github/workflows/release.yaml
  • actions/checkout v3
  • actions/setup-node v3
npm
package.json
  • @angular-architects/ngrx-toolkit ^0.0.3
  • @angular/animations 17.0.8
  • @angular/common 17.0.8
  • @angular/compiler 17.0.8
  • @angular/core 17.0.8
  • @angular/forms 17.0.8
  • @angular/platform-browser 17.0.8
  • @angular/platform-browser-dynamic 17.0.8
  • @angular/router 17.0.8
  • @angular/service-worker 17.0.8
  • @ngrx/component ^17.0.1
  • @ngrx/operators ^17.0.1
  • @ngrx/signals ^17.0.1
  • @nrwl/angular 17.2.7
  • compare-versions ^6.1.0
  • ngxtension ^1.12.0
  • normalize.css 8.0.1
  • query-string ^8.1.0
  • reflect-metadata 0.1.13
  • rxdb ^15.9.1
  • rxjs 7.8.1
  • todomvc-app-css 2.4.3
  • todomvc-common 1.0.5
  • tslib ^2.6.2
  • uuid ^9.0.1
  • zone.js 0.14.2
  • @angular-devkit/build-angular 17.0.8
  • @angular-devkit/core 17.0.8
  • @angular-devkit/schematics 17.0.8
  • @angular-eslint/eslint-plugin ~17.0.0
  • @angular-eslint/eslint-plugin-template ~17.0.0
  • @angular-eslint/template-parser ~17.0.0
  • @angular/cli ~17.0.0
  • @angular/compiler-cli 17.0.8
  • @angular/language-service 17.0.8
  • @commitlint/cli ^17.0.0
  • @commitlint/config-conventional ^17.0.0
  • @compodoc/compodoc 1.1.23
  • @jscutlery/semver ^3.4.1
  • @nrwl/eslint-plugin-nx 17.2.7
  • @nrwl/jest 17.2.7
  • @nrwl/tao 17.2.7
  • @nrwl/web 17.2.7
  • @nrwl/workspace 17.2.7
  • @nx/angular 17.2.7
  • @nx/eslint 17.2.7
  • @nx/eslint-plugin 17.2.7
  • @nx/jest 17.2.7
  • @nx/js 17.2.7
  • @nx/workspace 17.2.7
  • @schematics/angular 17.0.8
  • @swc-node/register ~1.6.7
  • @swc/core ~1.3.85
  • @twittwer/compodoc 1.12.0
  • @types/fs-extra ^11.0.2
  • @types/jest ^29.4.0
  • @types/node 18.16.9
  • @types/webpack 4.41.25
  • @typescript-eslint/eslint-plugin 6.15.0
  • @typescript-eslint/parser 6.15.0
  • conventional-changelog-cli ^4.1.0
  • document-register-element 1.14.10
  • eslint 8.56.0
  • eslint-config-prettier 9.1.0
  • eslint-plugin-import ^2.29.1
  • eslint-plugin-jsdoc ^46.8.2
  • eslint-plugin-prettier 5.1.2
  • eslint-plugin-rxjs =5.0.3
  • eslint-plugin-rxjs-angular =2.0.1
  • fs-extra ^9.1.0
  • husky ^8.0.3
  • jest ^29.7.0
  • jest-environment-jsdom ^29.7.0
  • jest-junit ^16.0.0
  • jest-localstorage-mock 2.4.26
  • jest-marbles ^3.0.6
  • jest-preset-angular ~13.1.4
  • jsonc-eslint-parser ^2.1.0
  • lcov-result-merger ^3.1.0
  • lint-staged ^15.2.0
  • ng-packagr 17.0.3
  • nx 17.2.7
  • nyc ^15.1.0
  • postcss ^8.4.5
  • postcss-import ~14.1.0
  • postcss-preset-env ~7.5.0
  • postcss-url ~10.1.3
  • prettier 3.0.3
  • process ^0.11.10
  • rimraf 5.0.1
  • semver ^7.3.4
  • setimmediate ^1.0.5
  • source-map-explorer 2.5.1
  • ts-jest ^29.1.0
  • ts-node 10.9.1
  • type-fest ^4.3.1
  • node >=16
packages/rxdb/package.json
  • rxdb ^15.9.1
  • tslib 2.0.3
  • @angular/common >=v14
  • @angular/core >=v14
  • rxjs ^6.6.7 || ^7.6.0
  • query-string ^8.1.0
  • node >=14.16
  • npm >=8.x

  • Check this box to trigger a request for Renovate to run again on this repository

Action Required: Fix Renovate Configuration

There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.

Error type: undefined. Note: this is a nested preset so please contact the preset author if you are unable to fix it yourself.

Upgrade RxDB to latest version

I'm submitting a...


[ ] Regression (a behavior that used to work and stopped working in a new release)
[ ] Bug report  
[ ] Performance issue
[x] Feature request
[ ] Documentation issue or request
[ ] Support request => https://github.com/voznik/ngx-odm/blob/master/CONTRIBUTING.md
[x] Other... Please describe:

Current behavior

Expected behavior

Minimal reproduction of the problem with instructions

Note: Our policy is that issues reported without a reproduction will be closed immediately and then reopened once a reproduction has been provided. Please respect the developers of this project by doing this. We give of our personal time to work on this project and would rather be spending our time fixing or enhancing the library than chasing down badly described or unreproducable issues.
Please delete this note once you have read it.

What is the motivation / use case for changing the behavior?

Environment


Libs:
- @angular/core version: X.Y.Z
- @ngx-odm/rxdb version: X.Y.Z


Browser:
- [ ] Chrome (desktop) version XX
- [ ] Chrome (Android) version XX
- [ ] Chrome (iOS) version XX
- [ ] Firefox version XX
- [ ] Safari (desktop) version XX
- [ ] Safari (iOS) version XX
- [ ] IE version XX
- [ ] Edge version XX

For Tooling issues:
- Node version: XX  
- Platform:  

Others:

Simple installation is not working?

I'm submitting a...


[ ] Regression (a behavior that used to work and stopped working in a new release)
[X] Bug report  
[ ] Performance issue
[ ] Feature request
[ ] Documentation issue or request
[ ] Support request => https://github.com/voznik/ngx-odm/blob/master/CONTRIBUTING.md
[ ] Other... Please describe:

Current behavior

Installing library following documentation doesn't work

Expected behavior

Installation is possible

Minimal reproduction of the problem with instructions

  • Create a simple angular project using NX or Angular CLI
  • npm install @ngx-odm/rxdb
  • try to import
    import { provideRxDatabase } from '@ngx-odm/rxdb';
    import { getRxDatabaseCreator } from '@ngx-odm/rxdb/config';
  • Start project

What is the motivation / use case for changing the behavior?

Using library should work

Environment


Libs:
- @angular/core version: 17.0.2
- @ngx-odm/rxdb version: 5.1.0


Browser:
- [ ] Chrome (desktop) version XX
- [ ] Chrome (Android) version XX
- [ ] Chrome (iOS) version XX
- [ ] Firefox version XX
- [ ] Safari (desktop) version XX
- [ ] Safari (iOS) version XX
- [ ] IE version XX
- [ ] Edge version XX

For Tooling issues:
- Node version: 20.10
- Platform:  Mac

Others:
Checking node_modules I can see source code of the project rather than packaged libraries

image

X [ERROR] TS2304: Cannot find name 'Nil'. [plugin angular-compiler]

I'm submitting a...


[ ] Regression (a behavior that used to work and stopped working in a new release)
[x] Bug report  
[ ] Performance issue
[ ] Feature request
[ ] Documentation issue or request
[ ] Support request => https://github.com/voznik/ngx-odm/blob/master/CONTRIBUTING.md
[ ] Other... Please describe:

Current behavior

  • when npm start, I get error:
X [ERROR] TS2304: Cannot find name 'Nil'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:10:29:
      10 │     function keys<T>(object: Nil | T): Array<StringifiedKey<T>>;
         ╵                              ~~~


X [ERROR] TS2304: Cannot find name 'StringifiedKey'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:10:45:
      10 │     function keys<T>(object: Nil | T): Array<StringifiedKey<T>>;
         ╵                                              ~~~~~~~~~~~~~~


X [ERROR] TS2304: Cannot find name 'Nil'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:11:39:
      11 │ ...tion keysOfNonArray<T>(object: Nil | T): Array<StringifiedKey<T>>;
         ╵                                   ~~~


X [ERROR] TS2304: Cannot find name 'StringifiedKey'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:11:55:
      11 │ ...tion keysOfNonArray<T>(object: Nil | T): Array<StringifiedKey<T>>;
         ╵                                                   ~~~~~~~~~~~~~~


X [ERROR] TS2304: Cannot find name 'ObjectIteratee'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:12:44:
      12 │ ...Own<T>(object: T, iteratee: ObjectIteratee<T, boolean | void>): T;
         ╵                                ~~~~~~~~~~~~~~


X [ERROR] TS2304: Cannot find name 'ObjectIteratee'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:13:54:
      13 │ ...ray<T>(object: T, iteratee: ObjectIteratee<T, boolean | void>): T;
         ╵                                ~~~~~~~~~~~~~~


X [ERROR] TS2304: Cannot find name 'Nil'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:14:31:
      14 │     function forEach<T extends Nil | readonly any[]>(array: T, ite...
         ╵                                ~~~


X [ERROR] TS2304: Cannot find name 'ArrayIteratee'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:14:73:
      14 │ ...y[]>(array: T, iteratee: ArrayIteratee<NonNullable<T>[number], ...
         ╵                             ~~~~~~~~~~~~~


X [ERROR] TS2536: Type 'number' cannot be used to index type 'NonNullable<T>'. [plugin angular-compiler]

    node_modules/@ngx-odm/rxdb/utils/lib/utils.d.ts:14:87:
      14 │ ...eratee: ArrayIteratee<NonNullable<T>[number], boolean | void>): T;
         ╵                          ~~~~~~~~~~~~~~~~~~~~~~


X [ERROR] TS2304: Cannot find name 'ObjectIteratee'. [plugin angular-compiler]

Expected behavior

  • ng compile to work

Minimal reproduction of the problem with instructions

  • install: npm install @ngx-odm/rxdb
  • adding to ng config:
 provideRxDatabase(
      getRxDatabaseCreator({
        name: 'demo',
        localDocuments: true,
        multiInstance: true,
        ignoreDuplicate: false,
        allowSlowCount: true,
        // storage: getRxStorageDexie(), // INFO: can be ommited, will be provide by `storageType` string
        options: {
          plugins: [
            // will be loaded by together with core plugins
            RxDBDevModePlugin,
            RxDBAttachmentsPlugin,
            RxDBLeaderElectionPlugin,
          ],
          storageType: localStorage['_ngx_rxdb_storage'] ?? 'dexie',
          dumpPath: 'assets/data/db.dump.json',
        },
      })
    ),

Note: Our policy is that issues reported without a reproduction will be closed immediately and then reopened once a reproduction has been provided. Please respect the developers of this project by doing this. We give of our personal time to work on this project and would rather be spending our time fixing or enhancing the library than chasing down badly described or unreproducable issues.
Please delete this note once you have read it.

What is the motivation / use case for changing the behavior?

Environment


Libs:
- @angular/core version: 17.3.3
- @ngx-odm/rxdb version: 6.0.1
"typescript": "~5.4.4"


Browser:
- [x] Chrome (desktop) version XX
- [ ] Chrome (Android) version XX
- [ ] Chrome (iOS) version XX
- [ ] Firefox version XX
- [ ] Safari (desktop) version XX
- [ ] Safari (iOS) version XX
- [ ] IE version XX
- [ ] Edge version XX

For Tooling issues:
- Node version: v20.12.0
- Platform:  Windows

Others:

Error Message when deleting a todo with example code

I'm submitting a...


[ ] Regression (a behavior that used to work and stopped working in a new release)
[x] Bug report  
[ ] Performance issue
[ ] Feature request
[ ] Documentation issue or request
[ ] Support request => https://github.com/voznik/ngx-odm/blob/master/CONTRIBUTING.md
[ ] Other... Please describe:

Current behavior

When using the removeTodo method from demo an error is thrown.
Demo does not use this method, copy pasted to new project for testing arround.

removeTodo(todo: Todo) {
    this.todosService.remove(todo.id);
}

Document gets deleted but throws this error:
Throws this error: https://github.com/pubkey/rxdb/search?q=DOC11

Expected behavior

Should delete without error message.

Minimal reproduction of the problem with instructions

Just add a delete button to a todo item and bind it to the removeTodo Method.

What is the motivation / use case for changing the behavior?

I would expect that it deletes without an error :-)

Environment


Libs:
- @angular/core version: ~10.2.0
- @ngx-odm/rxdb version: ~^2.5.0-alpha

Browser:
- [x] Chrome (desktop) version 90.04...
- [ ] Chrome (Android) version XX
- [ ] Chrome (iOS) version XX
- [ ] Firefox version XX
- [ ] Safari (desktop) version XX
- [ ] Safari (iOS) version XX
- [ ] IE version XX
- [ ] Edge version XX

For Tooling issues:
- Node version: 12.13.0
- Platform: Windows

Others:
nope

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.