Giter Site home page Giter Site logo

international-data-spaces-association / ids-specification Goto Github PK

View Code? Open in Web Editor NEW
30.0 11.0 14.0 3.92 MB

The Dataspace Protocol is a set of specifications designed to facilitate interoperable data sharing between entities governed by usage control and based on Web technologies. These specifications define the schemas and protocols required for entities to publish data, negotiate Agreements, and access data in a data space

Home Page: https://docs.internationaldataspaces.org/dataspace-protocol/

License: Apache License 2.0

data data-spaces dataspace dataspaces dcat idsa odrl

ids-specification's People

Contributors

hosseinzadeha avatar jimmarino avatar juliapampus avatar konfr avatar michaelsteinert avatar milux avatar mkollenstart avatar peterkoen-msft avatar sebbader-sap avatar ssteinbuss 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ids-specification's Issues

Renaming "IDS Communication Guide V2"

As discussed in the meeting on 2.2.2023, would be great to find an alternative name.
Some keywords to take into consideration:
dataspace, protocol, standard.

Changing HTTP Statuscode from 200 to 204 for endpoints with not defined response bodies

In the specification for the HTTP-Bindings of the Contract Negotiation and TransferProcess exists some endpoints with no specified response body. (Endpoints are listed at the bottom, Contract Negotiation, Transfer Process)
A clean solution is to introduce an empty response body and change the expected status code from 200 to 204.

Contract Negotiation Provider:
negotiations/:id/request
negotiations/:id/events
negotiations/:id/agreement/verification
negotiations/:id/termination

Contract Negotiation Consumer:
negotiations/:id/offers
negotiations/:id/agreement
negotiations/:id/events

Transfer Process:
transfers/:id/start
transfers/:id/completion
transfers/:id/termination
transfers/:id/suspension

Scalability issue with missing feature to request "all offers for a known asset ID"

After receiving access to the repo last week, I'm now trying to dig deeper into the protocol spec. One question I have is regarding scalability of requests when the AssetId is already known. In the 'old' specification I understood, that it was part of the IDS protocol to request 'all offers for 1 asset' with adding the 'requestedEelment' to the request to the catalog service.

Ref:
https://github.com/International-Data-Spaces-Association/IDS-G/tree/main/Communication/sequence-diagrams/data-connector-to-data-connector

With the 'new' spec, it looks to me like this part is 'outsourced' to the implementation part with the very general 'ids:filter' expression
https://github.com/International-Data-Spaces-Association/ids-specification/blob/main/catalog/message/catalog.request.message.json

I would see this as a very crucial part for scaling. Catalogs can become VERY big. Transferring the whole content even if the requester already knows the asset id is a problem. And outsourcing this scalability critical part should not be desired from my perspective.

My proposal is NOT to define all filters in IDS, but specify a way to 'filter' for one specific assetId only.

Any thoughts on this? Unfortunately I can not join the Thursday meeting this week because of a Catena-X Workshop. Maybe you can comment here if you have thoughts on this.

Thanks in advance,
Matthias Binzer

Relationship between Usage Control and Access Control

image

As a reminder to what we discussed during the sync call 2 weeks ago. Is Access Control really part of Usage Control?

Seems to appear in multiple documents, e.g.
https://internationaldataspaces.org/wp-content/uploads/dlm_uploads/IDSA-Position-Paper-Data-Sovereignty-Requirements-Analysis-of-Manufacturing-Use-Cases.pdf
Page 10.

It should be discussed whether:

"Usage control is an extension to traditional access control"

should be changed to:

"Usage control is an *addition* to traditional access control"

for more clarity.
I think "extension could be still fine, if not the picture would direct into the idea that one was "contained in" the other.

Dataset.odrl:hasPolicy 1:1 or 1:N?

As described in here:
https://github.com/International-Data-Spaces-Association/ids-specification/blob/main/catalog/catalog.protocol.md#311-odrlhaspolicy

An asset entry Dataset must have 1..N hasPolicy attributes that contain an ODRL Offer

all the examples I could find did NOT contain a list, e.g.
https://github.com/International-Data-Spaces-Association/ids-specification/blob/main/catalog/message/example/dcat.distribution.example.json#L17

but only a single policy/offer.

Also from ODRL or Dcat, I could not understand that this is a list. Can we reference the 'upstream' source that odrl:hasPolicy can be a list - or if this is a specific 'Dcat profile' change, it should be listed as such here I guess:
https://github.com/International-Data-Spaces-Association/ids-specification/blob/main/catalog/catalog.protocol.md#5-dcat-and-odrl-profiles

Define ids:DataPlaneType

TransferRequestMessage is referring to a data exchange format that we, as example, set to an IDS enum. We need to have further discussions to come to a decision about that. Should the IDSA predefine transfer protocols or should adopters/users of this protocol agree on existing standards/be free to define new ones?

Remove comments

Comments should be removed as they are rendered by GitBook

RFC: Introduce a 'Policy Repository'

I want to kindly ask to give feedback regarding the following proposal:

Example snippet from the catalog example:

      "odrl:hasPolicy": [ 
        {
          "@context": {
            "@vocab": "https://www.w3.org/TR/odrl-model/"
          },
          "@id": "urn:uuid:2828282:3dd1add8-4d2d-569e-d634-8394a8836a88",
          "permission": [
            {
              "action": "use",
              "constraint": [
                {
                  "leftOperand": {
                    "@value": "spatial"
                  },
                  "rightOperand": {
                    "@value": "EU"
                  },
                  "operator": "EQ"
                }
              ],
              "duty": []
            }
          ],
          "prohibition": [],
          "obligation": []
        }
      ],

https://raw.githubusercontent.com/International-Data-Spaces-Association/ids-specification/71f06f718147f12a4d333e9a9e604d13944882b1/catalog/message/catalog.json

Since this is very redundant, because many of those policies / offers are very similar, I think it would be also allowed to use IDs as a reference instead of the entire node of the object, meaning:

"odrl:hasPolicy": [
    {
        "@type": "odrl:Offer",
        "@id": "https://provider.com/edc/offer/1",
   },
   {// next possible policy }
],

At least that is my - still limited - understanding of:
https://www.w3.org/TR/vocab-dcat-3/#conformance

Additional constraints in a profile MAY include:
Controlled vocabularies or IRI sets as acceptable values for properties

and if this is the case, I would even slightly change the id of the policy and make it a "content addressable storage" by using the hash of the policy itself (as a URL) to reference it. So it would look like:

"odrl:hasPolicy": [
    {
        "@type": "odrl:Offer",
        "@id": "https://provider.com/policies/cdfd26aaf5b1fdc6d71af7c1349869f9314b67626bc1eec44e64af674e357eed",
   },
   {// next possible policy }
],

where the cdfd26aaf5b1fdc6d71af7c1349869f9314b67626bc1eec44e64af674e357eed is a sha256 hash of the policy itself. Serialization / canonicalization details need to apply of course.

That means there would be a new endpoint containing all possible policies: a policy repository under /policies/{hash}

The only way that this is possible at all, is because of the separate profile which says:
https://github.com/International-Data-Spaces-Association/ids-specification/blob/main/catalog/catalog.protocol.md#5-dcat-and-odrl-profiles

Each ODRL Offer must NOT include an explicit target attribute.

because hashing the policy WITH a target wouldn't work :-)

The advantages would be:

  • Reduce data transfer, assuming many datasets use the same policy
  • Reduce processing overhead (on both sides, but mainly) on the consumer side, because it's immediately clear whether the policy is already known and can be accepted (allow-listed policies...)
  • uniqueness of policies may allow some further optimizations during the flow

Possible DISadvantages:

  • Are policies protected content already? And is the hash 'unique' enough to 'protect' its content? Further access control could be applied, too, but probably is not worth it. I guess it's better to add the full policy to the dataset instead of a reference if there are concerns. Can be decided per dataset of course.

Any thoughts on this?

docs: Fix unclear security properties of "security tokens"

This issue is somewhat related to #50, yet more specific.

This specification currently mentions security tokens multiple times, also stating that OAuth or did:web might be good candidates for such tokens. However, it does not mention the utter importance of relay protection or any other security properties of such tokens.

In a typical setup, it is very likely that the same token will be used for transactions with multiple parties. In a naive implementation, any such party may misuse a received token to impersonate the actual owner of the token or request resources on its behalf.
This issue can only be solved by some sort of cryptographic binding as already described in IDS-G, yet there is no mention at all of such semantic requirements, conveying the wrong impression that properly done security can simply be "plugged" into an existing DataSpace by adding tokens, which is just plain wrong in most cases.

In my view, the current specification encourages unsafe implementations with semantic security faults that already have been discussed years ago (and also solved for e.g. HTTPS and IDSCP2 bindings) in the IDS context, see International-Data-Spaces-Association/IDS-G#79

I see two things that are needed here in order to fix this:

  1. We should absolutely mention semantic security requirements regarding these tokens, at least on a high level, such that the issue is understood by adopters of this standard.
  2. When providing a documented binding example like HTTPS, this binding should cover at least a high level description of how this security property can be achieved, see IDS-G PR above.

The only reasonable alternative in my opinion would be to completely strip any notion of "security tokens" from this standard.
This doesn't solve the issue, and of course I'm all for the former option, but removing the "security tokens" altogether at least makes clear that this standard is not intended to recklessly promote half-baked "security features", promoting this task to another layer.

I will do a PR ASAP to suggest a fix for this issue.

Unneeded `correlationId` attribute in the `TransferProcess` messages

The TransferProcess messages bring, in addition to processId, a correlationId, that, in fact, it is not needed:
as done in the ContractNegotiation, the processId will represent a correlation id that could be used by both parts to identity the same CN/TP. It will be enough for the scope.

What is the difference between 'Usage Policy' and License?

Since Usage Policies is the 'new' part of what IDS is capable of doing, I think it needs to be explained how it relates to 'licenses' like e.g. 'Creative Commons' and other, also proprietary licenses (paper contracts).

Opinions on that?

Update figure and renaming data connector to connector

          I would argue against the name "data connector".. I know "data space/dataspace connector" is bad because of all the projects etc. but these documents are not specifying data standards, transfers etc. Rather, the connector is adding data space communication and trust concepts into IT landscapes. We are defining connectors for a data space supporting a data space protocol and doing data space stuff. WDYT? (also referring to the figure introduced with this PR)

Originally posted by @juliapampus in #24 (comment)

Explain "IRI"

In the contract negotiation specification it's stated that

A CN is uniquly identified through an IRI. Each CN requires a newly generated IRI, which may not be used in a CN after a terminal state has been reached.

But it's not explained what an IRI is, I looked in all the repository but cannot find anything related.
Maybe it's just a typo of URI

Why `ContractNegotiation` states report `PROVIDER` and `CONSUMER` while `TransferProcess` ones not?

Looking at the specifications, for transfer process states are:

The TP states are:
- **REQUESTED** - An asset has been requested under an `Agreement` by the consumer and the provider has sent an ACK response.
- **STARTED** - The asset is available for access by the consumer or the provider has begun pushing the asset to the consumer endpoint.
- **COMPLETED** - The transfer has been completed by either the consumer or the provider.
- **SUSPENDED** - The transfer has been suspended by the consumer or the provider.
- **TERMINATED** - The transfer process has been terminated by the consumer or the provider.

While for contract negotiation are:

The CN states are:
- **CONSUMER_REQUESTED** - A contract for an asset has been requested by the consumer based on an offer and the provider has sent an ACK response.
- **PROVIDER_OFFERED** - The provider has sent a contract offer to the consumer and the consumer has sent an ACK response.
- **CONSUMER_AGREED** - The consumer has accepted the latest contract offer and the provider has sent an ACK response.
- **PROVIDER_AGREED** - The provider has accepted the latest contract offer, sent an agreement to the consumer, and the consumer has sent an ACK response.
- **CONSUMER_VERIFIED** - The consumer has sent an agreement verification to the provider and the provider has sent an ACK response.
- **PROVIDER_FINALIZED** - The provider has sent a finalization message including his own agreement verification to the consumer and the consumer has sent an ACK response. Data is
now available to the consumer.
- **TERMINATED** - The provider or consumer has placed the contract negotiation in a terminated state. A termination message has been sent by either of the participants and the
other has sent an ACK response. This is a terminal state.

Is there a reason why on contract negotiation the states strictly related to consumer activities are marked with the CONSUMER_ prefix and the provider ones with PROVIDER_ while in the transfer process this convention is not used?
In fact TransferProcess REQUESTED is representing a consumer activity, while STARTED is representing a provider action.

I would propose to remove these prefix from the Contract Negotiation states where the part that triggered it, e.g.:

  • REQUESTED - (the consumer requested a negotiation)
  • OFFERED - (the provider offered a negotiation)
  • VERIFIED - (the consumer verified the negotiation)
  • FINALIZED - (the provider finalized the negotiation)

while the CONSUMER_AGREED and PROVIDER_AGREED are the only states that effectively need the prefix.

Inconsisency in `transfer.process.protocol.md`

In two different parts of the transfer.process.protocol.md there are two clashing sentences.

First, it's stated that a consumer could issue a TransferRequestMessage

#### Pull Transfer
A pull transfer is when the consumer data plane initiates retrieval of asset data from a producer endpoint. For example, after the consumer has issued an `TransferProcessStart,`
message, the consumer requests the data from the producer-specified endpoint.

But then seems that only the provider can send it:

### 2. Transfer Start Message
![](./message/diagram/transfer-start-message.png)
**Sent by**: Provider
**Resulting State**: STARTED

My guess is that only the provider should be able to start a transfer, because, as seen in the state machine diagram, the consumer "requests" it, and the provider "starts" it

Focus on "data access" or "data usage" contracts?

From the introduction:

How contract agreements that govern data access are syntactically expressed and electronically negotiated.

could this be changed into maybe

How contract agreements that govern data access AND/OR data usage are syntactically expressed and electronically negotiated.

The question behind might be a bit larger:
During discussions I learned that negotiated agreement should eventually replace existing legal ("paper") contracts. If we follow this picture, we need to ask what is the granularity of those "paper" contracts today.
Example:
A supplier produces LED lights of a certain type, let's say 'FancyLedLight'. the supplier produces 1 Billion of those things and each get a serial number 00000...1 00000...2 and so on.

Do we create and negotiate an agreement for each and every serial number? If not, and we say we create 1 an asset for the type (FancyLedLight) because the policies is the same for all of those produced 'instances' of the part, we might get additional access decisions in the data source / backend system (e.g. based on the requester's identity). In such a use case, the clear benefit is the negotiated usage policy, BUT access needs to be handled separately / additionally, e.g. attribute based (ABAC) with additional information from e.g. a sales database.

I hope the slightly longer example helps to explain my question :-)

Provide OpenApi definition of https bindings

catalog.binding.https.md says:

The OpenAPI definitions for this specification can be accessed here.

Would be a nice idea to have an OpenApi definition of the HTTPS bindings.

Same goes for negotiation and transfer.

ContractRequestMessage 'target' in negotiation process required or redundant?

In the catalog process, the profile explicitly says:

Each ODRL Offer must be unique to a dataset since the target of the offer is derived from its enclosing context.
Each ODRL Offer must NOT include an explicit target attribute.

https://github.com/International-Data-Spaces-Association/ids-specification/blob/main/catalog/catalog.protocol.md#5-dcat-and-odrl-profiles

How is this during the negotiation process?
The example message for ContractRequestMessage shows both, a "dspace:dataSet": "urn:uuid:3dd1add8-4d2d-569e-d634-8394a8836a88" and a dspace:offer -> odrl:target which is the same and probably is always the same, right?
https://github.com/International-Data-Spaces-Association/ids-specification/blob/main/negotiation/message/contract-request-message.json


Matthias Binzer
Robert Bosch GmbH

Clean up repo

  • Consistent file naming
  • Consistent directory structure:
message
- schema
- diagram
- example
  • Fix SUMMARY.md
  • Fix typos, word highlighting

did:web as the ONLY allowed did method?

An Identity Provider is a trust anchor that generates ID tokens used to verify the identity of a Participant Agent. Multiple identity providers may operate in a dataspace. The identity standard used by a provider is not defined but could be OAuth2 or Decentralized Identifiers using did:web. An identity provider may be a third-party or a participant itself (for example, in the case of decentralized identifiers).
https://github.com/International-Data-Spaces-Association/ids-specification/blob/main/model/information.model.md

We should not allow-list only did:web but leave it open towards the dataspace to define which did method (did:*) is allowed.

Cleanup shapes

Some properties from the .json and .puml are missing in the .ttl files or are inconsistent regarding types.

Errors are not a subClass of a message but of an error.

Split `ContractNegotiationEventMessage`

In the contract negotiation specs there's a message that's used for two different scopes:

### 5. ContractNegotiationEventMessage
![](./message/diagram/contract-negotiation-event-message.png)
**Sent by**: Provider or Consumer
**Resulting State**: PROVIDER_FINALIZED, CONSUMER_AGREED, TERMINATED
**Example**: [ContractNegotiationEventMessage](./message/contract-negotiation-event-message.json)
**Response**: OK or ERROR
**Schema**: [ContractNegotiationEventMessageShape](./message/shape/contract-negotiation-event-message-shape.ttl) and the [ContractNegotiationEventMessage JSON Schema](./message/schema/contract-negotiation-event-message-schema.json)
#### Description
When the `ContractNegotiationEventMessage` is sent by a provider with an `eventType` property set to `FINALIZED`, a contract agreement has been finalized and the associated asset
is accessible. The state machine is transitioned to the `PROVIDER_FINALIZED` state. Other event types may be defined in the future. A consumer responds with an error if the signature
can't be validated or is incorrect.
It is an error for a consumer to send a `ContractNegotiationEventMessage` with an eventType `finalized` to the provider.
When the `ContractNegotiationEventMessage` is sent by a consumer with an `eventType` set to `ACCEPTED`, the state machine is placed in the `CONSUMER_AGREED` state.
It is an error for a provider to send a `ContractNegotiationEventMessage` with an eventType `ACCEPTED` to the consumer.
Note that contract events are not intended for propagation of agreement state after a contract negotiation has entered a terminal state. It is considered an error for a consumer or
provider to send a contract negotiation event after the negotiation state machine has entered a terminal state.

Why not splitting it into two more self-explaining messages like:
ControlNegotiationFinalizeMessage (sent by the provider to the consumer)
ControlNegotiationAcceptMessage (sent by the consumer to the provider)

Usage of Term Information Model

We might want to change the term Information Model in this spec to avoid confusion and to be more precise.

  • The term Information Model was used in IDS before and is used for the ontology representing the Information Layer of the IDS-RAM
  • From my perspective it is not an information model, but more a structural model that describes the entities and their relationship in a data space.
  • The term information model addressed more the domain of data engineering (at least referring to Wikipedia). The term conceptual model would represent better the scope of the model, as we do not describe a data model, but more the relationships of the different entities or concepts in data space (also Wikipedia.

IDS Namespaces

The IDS Information Model introduced two main namespaces, ids (long: https://w3id.org/idsa/core/) for the classes and properties (aka. 'T-Box') and idsc (long: https://w3id.org/idsa/code/) for instances (aka. 'A-Box'). This separation is not sufficient anymore as:

  1. Parts of the ids namespace will be in the scope of this specification, other parts not. Reviewing the protocol specification is therefore very hard.
  2. The schemas (shapes) have an additional one (shapes: https://github.com/International-Data-Spaces-Association/InformationModel/tree/master/testing/). I'd even say this namespace is more a technical dept...
  3. Versioning is not really thought through yet.

Trust dimension of Data Connector interactions

I would like to try to map the protocol discussion and focus with my personal view of the world:

Trust setup and negotiation in the IDS (or other data spaces) - Connector centric view

Introduction

To establish trust into data exchange processes, several means of secure deployment, security features and certification aspects can be facilitated:

  • Secure deployment in a Trusted Execution Environment such as AMD SEV-SNP or Intel SGX (TDX).
    • Verification via Remote attestation of trust properties towards external parties.
  • Establishment of Secure Boot via TPM
    • Verification via Remote attestation of trust properties towards external parties.
  • Verification of the issued certification level (Such as C5 cloud certification) by verifying the identity properties of a service.
  • Storage of data on encrypted volumes, storing private keys in HSMs, ...

These means need to be facilitated to establish trust between parties. We assume the data transaction relationships as sketched in the next section:

##Assumed data workflow / component interaction

trust_negotiation drawio

  1. An Identity Provider (IdP) issues trust related claims to IDS Connector. In IDS context, this is currently the combination of CA and DAPS. Trust related claims are issued by the DAPS.
  2. Data Connector A is looking for specific data. Metadata includes:
  • Data characteristics.
  • Contract conditions (e.g., C5 cloud certification, execution environment preconditions)
  • Connector address offering data offering (Data Connnector B)
  • Owner
  1. Both parties negotiate a usage contract. This could include:
  • "Only process on a specific container or processing context"
  • "Only process in a Trusted Execution Environment"
  • "Do not forward to another party"
  1. Both connectors set up the data workflow
  2. Data is exchanged.

Trust implications

Several implications arise fom this:

  1. Both parties trust the same IdP (no matter of how centralized or de-centralized). So we have a trust relationship between Connector A/B and the IdP.Identity claims such as certification level or hardware trust anchor support need to be verified between both Data Connectors.
  2. Metadata is potentially untrusted. Metadata and identity claim validation has to be done between Data Connectors.
  3. Both Data Connectors trust that the other parties Data Connector is "trustworthy":
  • Both Data Connectors are deployed in a secure deployment environment.
  • Both Data Connectors are configured properly.
  • Both Data Connectors are not tampered with.
  1. Data Connectors configure data sink and data source to grant access and acquire data for the specified data workflow. Data Connectors have privileged access to data sink and data source. (Remark: This is why in the IDS concepts, we have an overarching trust entity between data services and the Connector Core Services and see this overarching entity as a "Connector".)
  2. Data Service associated with Data Connector A consumes data Data Service defined by Data Connector B. This second trust relationship requires verififcation of negotiated trust properties between services.

Proposal for trust integration

The current protocols are useful and needed. However, trust is omitted from the discussions so far. We believe that trust implication are associated with every step as discussed above. The specification so far is deliberately abstract. But we believe that these topics should at least be addressed in an explanatory section stating that these topics need do be defined in another spec. At some point, some extensions or detailing needs to be done:

  1. Trust related claims need to be verified on Control plane level as well as Data plane level, since both are involded in trustworthy data transer setup and data exchange.
  2. Trust negotiation needs to be part of Data Connector contract negotiation.
  3. Trust negotiation needs to be part of the Data Plane interaction.

I would be happy to hear your thoughts.

Distributed execution, policies

Hi,

Apologies in advance, this is not the right place to put this, but it's all I have access to and it seems the right people will read this if I post it here. Please contact me by email (see below) rather than replying here, and perhaps the maintainers would be so kind as to delete this issue when we have established contact?

I joined the Dataspace Protocol Preview session on Thursday, and asked some questions. Thanks! It was very enlightening.

For the past couple of years, I've been working on a design for a federated data sharing system, intended primarily for data analytics but otherwise fairly similar to IDS in its goals of user sovereignty, flexibility, scalability, and interoperability. It has policies (specific ones, with an algorithm for interpreting them) and distributed execution (for compute-to-data, trusted third party, federated learning, etc.) as well as data downloads.

If that sounds interesting, I have a preprint (to be published open access) at https://arxiv.org/abs/2210.17155, and a proof-of-concept at https://github.com/SecConNet/mahiru (Apache License 2.0). Being a proof-of-concept it's not as user-friendly as my other software, but if you want to try to run it, this is where to start: https://github.com/SecConNet/mahiru/blob/develop/docs/distributed_scenarios.rst. For lack of user interfaces it's not spectacular however, so the paper is probably what you want.

You can contact me at l dot veen at esciencecenter dot nl if you have questions or would like to talk.

Thanks,

Lourens

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.