Giter Site home page Giter Site logo

decidim-bulletin-board's Introduction

Gem Gem GitHub contributors Matrix codecov Maintainability Crowdin https://opencollective.com/decidim Yard Docs

The participatory democracy framework

Free Open-Source participatory democracy, citizen participation and open government for cities and organizations.
Explore the docs »

Join our Matrix.org chat rooms.

Features · Roadmap · Report Bug · Propose New Features · Read Blog

💡 What is Decidim?

Decidim is a participatory democracy framework, written in Ruby on Rails, originally developed for the Barcelona City government online and offline participation website. Installing these libraries will provide you a generator and gems to help you develop web applications like the ones found on example applications or like our demo application.

All members of the Decidim community agree with Decidim Social Contract or Code of Democratic Guarantees.


Table of Contents


🚀 Getting started

TLDR: install gem, generate a Ruby on Rails app, enjoy.

gem install decidim
decidim decidim_application

We have set up a guide on how to install, set up and upgrade Decidim. See the Getting started guide.

🙌 Contribute

Anyone can participate in Metadecidim, our own distance of Decidim for improving Decidim. The community is formed by people with different profiles and backgrounds.

How can you contribute? There are many ways to do it, some more specific to the software -improving documentation or translations, reporting bugs or proposing improvements-, but you can also participate in discussions about the governance of the community (find out how we organize ourselves).

Having a lively community is crucial to this project, so we encourage you to find out what is the best way for you to contribute to the commons! 🌱

Read more about contributions in our contribution guidelines.

🧩 Modules

If you need to have some features that we do not have yet, we recommend that you make a module. This is a Ruby on Rails engine with some APIs specific to Decidim (for registering with the menus, integration with spaces like Participatory Processes or Assemblies, with /admin or /api, etc).

As a base you can use these modules, although check first that the version is compatible with your current Decidim version. Also, you should know that until v1.0.0 we are under development, and these internal APIs can change.

We recommend that you extensively test your module.

🪪 Identity verifications and authorizations

One specific thing regarding these kind of applications is how you manage the permissions that the participants will have in the platform (aka the authorization or verification logic). This tries to solve the problem of how to verify that the user is who they say they are and that they have the right to participate in this city or organization. Read more about Authorizations in our documentation.

🚪 Authentication options

You can easily add any authentication provider to Decidim that is provided by OmniAuth. Also you have a list of modules related to authorization already developed by the community.

📘 License

If you plan to put your application in production, you will need to publish it using the same license: GPL Affero 3.

We recommend doing that on GitHub (or any other code hosting platform) before publishing.

If you have any trouble you can contact us on our Matrix.org chat room for developers.

🔎 Example applications

Since Decidim is a ruby gem, you can check out the dependent repositories to see how many applications are on the wild or tests that other developers have made. You can see a highlight of example applications in our documentation.

🔒 Security

Security is very important to us. If you have any issue regarding security, please disclose the information responsibly by sending an email to security [at] decidim [dot] org and not by creating a github/metadecidim issue. We appreciate your effort to make Decidim more secure. See full security policy.

🫶 Financial contributions

Decidim helps citizens, organizations and public institutions to democratically self-organize at every scale. Thanks to Decidim, any organization is able to configure spaces for participation (initiatives, assemblies, or processes) and enrich them through the multiple available components (meetings, surveys, proposals, participatory budgets, accountability for results, comments, and many other).

You can contribute financially to the sustainability of this project through OpenCollective.

The funds will enable the maintainers to:

  • review community contributions

  • triage issues

  • fix bugs related to performance

  • improve the design of the platform

  • write better documentation

  • improve performance of the platform security

🧑 Members

Members have the right to participate in all the participation spaces of the Metadecidim platform with voice and vote, exercise their vote in strategic and internal decisions, elect or be elected in representative bodies, request and obtain explanations about the management of the positions of the Association, receive information about the activities and make common uses that are established. Read more about becoming a Decidim association member.

Members

💻 Partners

Any organization offering services on Decidim can contribute back to the commons by becoming a Partner. Each Partner commits to include a clause in each new service contract around Decidim, explicitly stating that a small percentage is allocated to the maintenance of the source code. For a company, the percentage is 3%, and for a nonprofit organization, it is 1.5%. Read more about becoming a Decidim association partner.

Partners

📖 Learn More

Decidim Resource Description

🚀 Our latest releases

New features and bug fixes.

🧩 Modules

Find out new ways of enhancing Decidim.

🗳 Propose new Features

Is there any missing feature? Propose a new one!

📓 Docs

Full documentation for creating and customizing your own Decidim application.

📒 API Reference

Detailed reference on Decidim’s API.

🔎 Examples

See some ways where Decidim is used, with code examples.

📬 Blog

All the latest news and releases from Decidim.

💬 Join Matrix.org

Need help with your specific use case? Say hi on Matrix!

🗺 Roadmap

See where Decidim is working to build new features.

🙌 Contribute

How to contribute to the Decidim project and code base.

🎩 Credits

decidim-bulletin-board's People

Contributors

agustibr avatar ahukkanen avatar alecslupu avatar andreslucena avatar dependabot[bot] avatar ferblape avatar gchacart avatar leio10 avatar microstudi avatar oriolgual avatar orlera avatar paarals avatar slickepinne avatar txus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

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

decidim-bulletin-board's Issues

Update docker image to last version

After pulling out the last image I see that has an old version (0.15.2). It should have the last available version (0.22.3).

imatge

Ideally, this would be autogenerated and pushed by Github Actions automatically but I'm aware this could be a huge effort.

Related to #210

Verifier undocumented

Vote auditing is not explained, it needs links and documentation on how to do it. The current state makes it completely useless in practical terms.

At least the README should have instructions (working in several operating systems) on how to verify a vote.

  • Finish PR #192
  • Add instructions
  • Verify existence of tests

Voting can be done at the specified time and date, even if the steps are not completed

Describe the bug

I have set up an election to start at 18:00 until 19:00. However, I haven't completed all the steps to open the voting; I still need to perform the Key Ceremony. Nevertheless, when it's 18:00, in the public site, I see that I can vote, even though I encounter an error when trying to save the vote.

To Reproduce

  1. Create an election and set a specific time and date.
  2. Publish the election and the elections component.
  3. Wait for the designated time and date to arrive.
  4. You can vote even though the vote is not being saved.

Expected behavior

Voting should not be possible if the "Voting period" step is not activated.

Screenshots

  1. Creation of the election
    imatge

  2. Status of the election
    imatge

  3. Voting in the public section
    imatge
    imatge
    imatge

Stacktrace

No response

Extra data

Additional context

No response

Broken CI: template is not valid

The CI is broken after the last commits.

  1. [CI] Server - Unit tests

Error: .github/workflows/server-workflow.yml (Line: 161, Col: 16):
Error: The template is not valid. .github/workflows/server-workflow.yml (Line: 161, Col: 16): hashFiles('voting_schemes/electionguard/python-wrapper/**') failed. Fail to hash files under directory '/home/runner/work/decidim-bulletin-board/decidim-bulletin-board'

  1. In [CI] Server - E2E tests

(...)
Bundle complete! 6 Gemfile dependencies, 61 gems now installed.
Use bundle info [gemname] to see where a bundled gem is installed.
cd voting_schemes/electionguard/python-wrapper && make install
make[1]: Entering directory '/__w/decidim-bulletin-board/decidim-bulletin-board/voting_schemes/electionguard/python-wrapper'
python3 -m pip install --upgrade pip
Requirement already satisfied: pip in /root/.pyenv/versions/3.8.11/lib/python3.8/site-packages (21.1.1)
Collecting pip
Downloading pip-22.0.4-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 21.1.1
Uninstalling pip-21.1.1:
Successfully uninstalled pip-21.1.1
WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
Successfully installed pip-22.0.4
cd ../electionguard-python && make environment build
make[2]: Entering directory '/__w/decidim-bulletin-board/decidim-bulletin-board/voting_schemes/electionguard/electionguard-python'
🔧 ENVIRONMENT SETUP
make install-gmp
make[3]: Entering directory '/__w/decidim-bulletin-board/decidim-bulletin-board/voting_schemes/electionguard/electionguard-python'
📦 Install gmp
Operating System identified as Linux
make install-gmp-linux
make[4]: Entering directory '/__w/decidim-bulletin-board/decidim-bulletin-board/voting_schemes/electionguard/electionguard-python'
🐧 LINUX INSTALL
sudo apt-get install libgmp-dev
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
libgmp10 libgmpxx4ldbl
Suggested packages:
gmp-doc libgmp10-doc
The following packages will be upgraded:
libgmp-dev libgmp10 libgmpxx4ldbl
3 upgraded, 0 newly installed, 0 to remove and 74 not upgraded.
Need to get 903 kB of archives.
After this operation, 1024 B of additional disk space will be used.
Do you want to continue? [Y/n] Abort.
make[4]: *** [Makefile:55: install-gmp-linux] Error 1
make[4]: Leaving directory '/__w/decidim-bulletin-board/decidim-bulletin-board/voting_schemes/electionguard/electionguard-python'
make[3]: *** [Makefile:34: install-gmp] Error 2
make[3]: Leaving directory '/__w/decidim-bulletin-board/decidim-bulletin-board/voting_schemes/electionguard/electionguard-python'
make[2]: *** [Makefile:13: environment] Error 2
make[2]: Leaving directory '/__w/decidim-bulletin-board/decidim-bulletin-board/voting_schemes/electionguard/electionguard-python'
make[1]: *** [Makefile:9: install] Error 2
make[1]: Leaving directory '/__w/decidim-bulletin-board/decidim-bulletin-board/voting_schemes/electionguard/python-wrapper'
make: *** [voting_schemes/electionguard/makefile.mk:93: install_electionguard_python_wrapper] Error 2
Error: Process completed with exit code 2.
(...)

Hide trustee share data when the results are not published

We should hide the trustee share data from the election log entry data until the election results are published because any user could compute the result with that data.

After discussing this with @leio10 and @txus we reach the conclusion that this can be solved in two different ways:

  • Hide the data when the tally has ended
  • Authenticate the trustee using some kind of signature verification

Document README.md for gems

Migrate docker image to Decidim organization

Conceal api_key in logs

The Rails log prints the API KEY send by authorities (Decidim Election module), should it be concealed same way as passwords?

bulletin_1  | D, [2021-11-12T09:48:12.651742 #7] DEBUG -- : [05dc3b0e-8b2f-4263-a323-76a8aaf7a640]   Authority Load (0.6ms)  SELECT "clients".* FROM "clients" WHERE "clients"."type" = $1 AND "clients"."unique_id" = $2 AND "clients"."api_key" = $3 LIMIT $4  [["type", "Authority"], ["unique_id", "electionsaudit"], ["api_key", "A2s4e52tqKV09IXDzVQc7aE1LKxWnRTuHJLskjiRSarwHwzStez9ELp8BVfhY95R4ySXdwNzE2Sjb6WAD4opCuWBqC6VM0pHyZwfitfmk8cX8eRoPh95ssDHs2QQQFyj"], ["LIMIT", 1]]

TODOs in javascript files not done

We have multiple TODOs in JS files. If they are already handled then we should remove them:

electoral_district_id: "a-place", // TODO: hardcoded place

votes_allowed: contest.number_elected, // TODO: review later

// TODO: this will not be necessary when the auditable data contains the plain vote.

Make decidim-bulletin_board gem compatible with Rails 7

Right now the decidim-bulletin_board ruby client gem is locked to Rails 6:

s.add_dependency "rails", "~> 6.0", ">= 5.0.0"

In order to continue the Decidim Rails 7 upgrade, we need to first make this gem compatible with Rails 7.

I have not yet investigated whether anything is incompatible with Rails 7 right now but I'm opening this so that we can track those issues here.

TODOs with extra verification not done

In the Key generation stage of the protocol, the keys from every trustee seem to be unverified. This is an extract of the python Bulletin Board code:

Although this might not be critical, we should decide to verify or not to verify.

Update the NPM dependencies

When you run a clean npm install at the server app or the JS packages contained in this repo, we get the following deprecation messages:

npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142

To replicate this, do the following:

  • Go to the server app cd bulletin_board/server
  • Remove the node_modules folder if it already exists rm -rf node_modules
  • Install the NPM packages npm i

Also, we get NPM audit issues that should be fixed:

25 vulnerabilities (7 moderate, 16 high, 2 critical)

These should be fixed as well.

So, let's update the NPM dependencies in all packages that contain NPM dependencies:

  • bulletin_board/server
  • bulletin_board/js-client
  • voting_schemes/dummy/js-adapter
  • voting_schemes/electionguard/js-adapter
  • verifier
  • voting_schemes/electionguard/verifier

Related to:
#220, #221, #222, #223, #224, #236, #237, #244, #245, #254, #255, #257, #267, #268, #269, #270

Problem with setting up a vote in an elections component

Describe the bug

In a participatory process, I have set up an elections component to conduct a vote. Once I have completed all the steps of the vote and click on "setup elections," I encounter the following error:
imatge

To Reproduce

The problem is here: https://decidim-elections.dev.pokecode.net/admin/participatory_processes/component-elections1/components/1/manage/elections/1/steps/create_election

Expected behavior

Initiate the vote and be able to proceed with the following steps.

Screenshots

No response

Stacktrace

No response

Extra data

Additional context

No response

Update graphql gem to 1.13.x

When doing the Ruby 3 upgrade, I noticed that upgrading the graphql gem to 1.13.x causes a lot of the following kind of errors:

Called on #<Class:0x0000555b1dc9d308> from:
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-guard-2.0.0/lib/graphql/guard.rb:17:in `block in <class:Guard>'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/filter.rb:32:in `call'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/filter.rb:12:in `call'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/filter.rb:12:in `call'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/filter.rb:32:in `call'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/filter.rb:12:in `call'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:94:in `block in initialize'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:329:in `block in read_through'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:325:in `visible?'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:226:in `block in visible_type?'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:329:in `block in read_through'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:227:in `visible_type?'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:238:in `block in visible_and_reachable_type?'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:329:in `block in read_through'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:250:in `visible_and_reachable_type?'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:215:in `visible_field?'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:63:in `public_send'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:63:in `visible_entry?'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/member/has_fields.rb:46:in `block in get_field'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/member/has_fields.rb:42:in `each'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/member/has_fields.rb:42:in `get_field'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema.rb:1264:in `get_field'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:139:in `block (2 levels) in get_field'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:329:in `block in read_through'
  /.../versions/3.0.2/lib/ruby/gems/3.0.0/gems/graphql-1.13.11/lib/graphql/schema/warden.rb:148:in `get_field'
Legacy `.graphql_definition` objects are deprecated and will be removed in GraphQL-Ruby 2.0. Remove `.graphql_definition` to use a class-based definition instead.

It is apparently some compatibility issue with the graphql-guard gem judging by the stack trace but I did not find any particular issue referring to this problem in their repository. The closest one I found out was related to the deprecation message also seen in the bulletin board outputs (as above): exAspArk/graphql-guard#53

This issue needs to be further investigated and I would say the most likely candidate for this issue is with the graphql-guard integration. Another problem is that graphql-guard does not seem to support newer versions (> 2.x.x) of the graphql gem right now. It also seems that the graphql-guard project is at a stale state currently: exAspArk/graphql-guard#50

The last commit and last release of that gem was about 2 years ago, in April 2020.

A voter can enter the voting booth even if the election isn't setup

Describe the bug

Given that I'm a registered user and there is an Election created and this election is configured with an start_date of yesterday and an end_date of tomorrow, then I can enter to the voting booth even though this Election isn't setup (sent to the BB). It should check if the Election is at least blocked.

The same happens if the election is configured with an end_date of yesterday.

To Reproduce

  1. Sign in as admin
  2. Configure an Election with an start_date of yesterday and an end_date of tomorrow
  3. Go to the frontend view
  4. Click on the "Start voting" button

See that there's a somewhat cryptic modal error that it couldn't find the election

Expected behavior

It should not show the button
It should not allow entering by the URL

Screenshots

Selection_614

Stacktrace

In the console there's this error:

TypeError: (intermediate value).data.election is null

Extra data

  • Decidim Version: 0.28.0.dev

Additional context

No response

Change default rails port

While working on development, we're using the port 8000 by default. As @alecslupu mentioned in a review:

I already had something else binding 8000, I had to reconfigure the bulletin board ports here and in the secrets.yml.

As 8000 is a pretty popular port, maybe would be better to document the workaround ?

We need to define one and change it in the default configurations of this repository and also of decidim/decidim:

Now we're using port 5017 for the testing instance, so 5016 might be a good number, as this range isn't assigned in the IANA:

5016-5019: Unassigned

And also doesn't seem to be popular for other services. As an exercise, compare it with 8000.

Acceptance criteria

  • Port changed in puma.rb
  • Port changed in secrets.yml template in decidim/decidim
  • Port changed in documentation/READMEs/etc

Make bulletin board compatible with ruby 3.1 and OpenSSL 3.0

Decidim 0.28 has bumb ruby version to 3.1. This ruby version supports OpenSSL 3.0 if shipped with the underlying OS.

However some dependent gems are not yet compatible with OpenSSL3:

Check if your system is using OpenSSL 3 or 1.1 by running:

ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 3.0.2 15 Mar 2022

There is a workaround that allows to use ruby 3.1 by recompiling it using the old OpenSSL 1.1. For instance, in Ubuntu 22.04:

Manually install openssl 1.1 dev libraries (you might need some additional dev libraries in case the ./config step fails:

wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz                         
tar xf openssl-1.1.1n.tar.gz
cd openssl-1.1.1n 
./config --prefix=/opt/openssl-1.1.1n --openssldir=/opt/openssl-1.1.1n shared zlib
make                  
make test
sudo make install
sudo rm -rf /opt/openssl-1.1.1n/certs
sudo ln -s /etc/ssl/certs /opt/openssl-1.1.1n

Manually compile ruby 3.1 with openssl-1.1, in case you are using rbenv, just exec:

RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.1.1n rbenv install 3.1.1

Result:

ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 1.1.1n  15 Mar 2022

With this, you can use bulletin_board again in Decidim using ruby 3.1

Documentation on Cryptographic Parameters

Some details of the cryptographic defaults used in the main library used to encrypt the election should be available for transparency and clarity.

The following parameters should have a link to where there are defined for easy checks:

The parameter p used to compute the modular arithmetic operations must be a prime number whose discrete logarithm is not solvable in an assumable time in image. This means that p -1 must have a large prime factor which makes the discrete logarithm problem difficult.

The size of this parameter p must be of 4096 bits

The parameter q must be a prime number which divides -1` and its length is 256 bits.

The parameter r must be computed as r=(p -1)/q

The parameter g must be a generator in image. This means that, in image, g can be expressed as a combination (under the group operation) of finitely many elements of the subset and their inverses.

The messages sent from Decidim server and to the BulletinBoard are signed using 4096-bit RSA keys and SHA-256 hashes.

Finally, since the system uses external libraries, links to the bug-reporting pages of those libraries should be available through the documentation.

Backend Polling Stations

In order to use the Polling Stations, I need:

  • Voting space
  • Type: Hybrid
  • Create component: Elections
  • Create election: Test election

Then, I need:

  • Create Polling Officers (at least 2)
    imatge
  • Create Polling Station
    imatge
  • Bug 1: President and Choose polling officers are different formats
  • Bug 2: Polling Officers added in the Polling Station are removed every time you edit the Polling Station
    imatge

Instalation and configuration for starters

Hello!

We try to install this cloning the repository and following the readme for server (https://github.com/decidim/decidim-bulletin-board/blob/develop/bulletin_board/server/README.md) but the rails db:create gives us error on PSQL authentication. We alredy have a decidim working and try to put in application.yml the credentials for a DB to bulletin-board but don´t work.

We search the decidim documentation but no lucky there too...

Can anyone give us some light on this?

We are trying to install on the same machine as decidim, this is ok?

We have a ubuntu 20.04 as OS

Thanks
Guilherme

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.