Giter Club home page Giter Club logo

czi-conda-forge-mgmt's Issues

Timeline view in Quetz

๐Ÿ“Œ Summary

Integrate a timeline view for events in conda-forge (such as uploads) to the Quetz maintainers' dashboard.

๐Ÿ“ Background

The Quetz instance will accumulate rich logs of the conda-forge and bioconda ecosystems.

The data collected can be useful to provide information about estimated usage, popularity, growth and other metrics.

๐Ÿš€ Tasks / Deliverables

  • TBD.

๐Ÿ“… Estimated completion

This is a stretch goal. There are no estimates for its completion.

โ„น๏ธ References

  • TBD.

Enhancements to feedstocks' verification and validation workflows

Primarily focused on performance and reliability.

๐Ÿ“Œ Summary

Improve the artifact verification and validation workflows as they are moved from cf-staging to conda-forge.

๐Ÿ“ Background

conda-forge feedstocks are repositories equipped with the build machinery provided by conda-smithy.

When a PR is merged to a feedstock branch, the resulting conda packages are not uploaded directly to conda-forge.
They are first placed in a staging channel named cf-staging.
The artifact validation bot hosted in a Heroku instance downloads the artifacts, runs some analysis and if successful, then they are copied to the actual conda-forge channel.

The analysis includes checks like:

  • File clobbering: is the package producing files that belong to another package? This is reported as an issue
  • Package name squatting: is the feedstock producing packages that belong to other feedstocks? If true, it prevents the upload.
    • This check is needed to work around the lack of permission granularity in anaconda.org

Depending on the size of the package, this causes some strains on the already overworked Heroku dyno.

๐Ÿš€ Tasks / Deliverables

  • Profile load and usage, and decide if the current implementation needs performance improvements
  • Consider hardware alternatives beyond a single machine: a multi-worker approach with auto-scaling
  • Perform risk analysis and decide if other validation aspects are needed, if server load stopped being a bottleneck

๐Ÿ“… Estimated completion

This task should be finished in the first 18 months.

โ„น๏ธ References

Migrate content from cf-infra-docs to conda-forge.org (maybe iteratively)

Survey the community for feedstock health metrics ideas

๐Ÿ“Œ Summary

Investigate and design prototype mockups with the desired features for the maintenance board

๐Ÿ“ Background

conda-forge.org/status offers a "maintainers dashboard" with information about:

  • Operational status of many of the services that conda-forge relies on, including CI, bots, CDN cloning, webservices, documentation...
  • Ongoing migrations (collection of PRs automatically issued by the bots)
  • Communication about known incidents

It could also show how "healthy" the feedstocks (conda-forge) and package-creating repositories (bioconda) are.

To inform what content should be displayed in the dashbaord, we would like ti survey the community for any other features that could be considered usegul, such as:

  • Tasks that require attention by conda-forge members or volunteers (e.g. pending reviews, blocking PRs, newcomer-friendly issues...)
  • Feedstocks list with relevant metrics about their health and maintenance status (e.g. risks of abandonment)

๐Ÿš€ Tasks / Deliverables

  • Survey the communities for dashboard panel ideas
  • Consolidate feedback and generate report

๐Ÿ“… Estimated completion

This task should be finished in the first six months.

โ„น๏ธ References

Show feedstock/repository data in Quetz

๐Ÿ“Œ Summary

Integrate feedstock data (GitHub repositories) representation in the Quetz maintainer's dashboard.

๐Ÿ“ Background

With 20K+ feedstocks, it's difficult to assess the state of each repository in a timely manner.
Maintainers are often drowned in notifications, mentions and review requests, which hinders the ability of members to help out other volunteers.

We'd like to provide better ways to assess where help is needed as part of the maintainer's dashboard.
This needs to account for both multi-repository organizations like conda-forge and monolith-based orgs like bioconda.

At this point, we should have input from the community about which metrics are relevant and informative.
The UI/UX team will have provided modern mockups that account for accessibility.

๐Ÿš€ Tasks / Deliverables

  • Enumerate required information and derived metrics, as well as their sources (e.g. created packages, their contents, metadata... but also "health metrics")
  • Make sure data sources are retrievable in an easy way
  • Finalize backend plugins in Quetz (prototypes should be already available)
  • Finalize frontend components (prototypes should be already available)

๐Ÿ“… Estimated completion

This task should be finished in the first 18 months.

โ„น๏ธ References

See main dashboard mission issue.

First round of recovery/security improvements on infrastructure

๐Ÿ“Œ Summary

Initial improvements to the conda-forge infrastructure as detailed in the public
roadmap focusing on critical performance and security risks.

๐Ÿ“ Background

After reviewing the audit report and approving work items, we will focus on the highest priority ones:

  • Security risks
  • Infrastructure recovery
  • Critical performance

๐Ÿš€ Tasks / Deliverables

๐Ÿ“… Estimated completion

This task should be finished in the first 12 months.

โ„น๏ธ References

  • TBD.

Deploy minimal public Quetz instance

๐Ÿ“Œ Summary

Deploy a minimal Quetz instance for conda-forge and bioconda

๐Ÿ“ Background

Quetz is an open-source server for conda packages and channel metadata.
Its UI frontend can be extended with components.

The idea is to have a running instance that the team can use to iterate on the planned features and receive feedback from the community.

๐Ÿš€ Tasks / Deliverables

  • Decide hosting / domain / infra details
  • Configure vanilla Quetz server and put it online
  • Devise workflow to make the new features available in the preview

๐Ÿ“… Estimated completion

This task should be finished in the first six months.

โ„น๏ธ References

Reduce the technical debt in conda-forge infrastructure

๐Ÿ“Œ Summary

Audit conda-forge infrastructure to generate a roadmap that can be followed over the course of the project to improve the long-term sustainability of the ecosystem.

๐Ÿ“ Background

Since its emergence in 2015, the conda-forge project has seen explosive growth in contributors, maintainers, repositories, artifacts, and packages served.
To serve such a vast ecosystem (and around 300M downloads per month), the core team has heavily relied on automation, Continuous Integration and Delivery platforms and in-kind donations from multiple infrastructure providers.

Current conda-forge's infrastructure and tooling are distributed across many GitHub repositories, external CI services (Azure DevOps, GitHub Actions, TravisCI, Drone.io, CircleCI), Heroku "dynos" and AWS instances.
Many were built as ad-hoc fixes and currently lack documentation or risk mitigation plans.

We plan to migrate the configuration and infrastructure provisioning to reproducible, vendor-agnostic tools such as Terraform, complemented with rigorous testing, vulnerability detection, and documentation strategies to enable better security, reliability, and recovery from adverse events.

๐Ÿš€ Tasks / Deliverables

See issues labeled as mission: infra ๐Ÿ› 

โ„น๏ธ References

Generate public roadmap for infrastructure and database migrations

๐Ÿ“Œ Summary

Outline risks and mitigation plans for the transition to the proposed infrastructure design.

๐Ÿ“ Background

The audit of the existing infrastructure link will generate a report of recommended changes.

Once evaluated and approved, we will compile a public roadmap that specifies how to apply and transition to the new infrastructure.
We aim to minimize unplanned disruptions and let conda-forge operate as usual.

๐Ÿš€ Tasks / Deliverables

  • Draft roadmap #44
  • Submit for review and comments
  • Create public project board

โ„น๏ธ References

  • Goal: Audit of the current infrastructure, tooling, and credentials

Self-testing and self-validation routines for the terraformed infra

๐Ÿ“Œ Summary

Infrastructure testing and validation after Terraform migration.

๐Ÿ“ Background

TBD.

๐Ÿš€ Tasks / Deliverables

  • TBD.

๐Ÿ“… Estimated completion

This is a stretch goal. There are no estimates for its completion.

โ„น๏ธ References

  • TBD.

Files-to-artifacts database / API / mapping

  • Comes from #5

Provide a way for users to find which package(s) provide a certain file (e.g. a header, or a library, or an executable), similar to what portals like pkgs.org do.

We do have the info in the database designed in https://github.com/Quansight-Labs/conda-forge-db, but we need to serve it somewhere, preferably serverless or close-to-zero maintenance (e.g. one-click deployment). This is tricky because populating the database from scratch has a non-negligible overhead.

Tasks

  1. area: data ๐Ÿ”ข area: devops ๐Ÿ— funding: czi mission: infra ๐Ÿ›  team: quansight-labs type: task
    zklaus
  2. area: data ๐Ÿ”ข area: devops ๐Ÿ— funding: czi mission: infra ๐Ÿ›  team: quansight-labs type: task
    jaimergp

Thorough documentation for maintainers dashboard

๐Ÿ“Œ Summary

Develop end-user and maintainer documentation as needed, including security best practices for supply chain security and Quetz dashboard use.

๐Ÿ“ Background

At this point, a Quetz instance providing services for conda-forge and bioconda should be ready and running.

To ensure its long-term sustainability, thorough documentation should be available, covering user- and developer-focused topics.

๐Ÿš€ Tasks / Deliverables

  • How to access and use, recommended workflows, tips and tricks
  • How to contribute: how the source code is structured, code style, etc
  • How to deploy your own instance

๐Ÿ“… Estimated completion

This task should be done by the end of the project (24 months).

โ„น๏ธ References

Choose / create repository to store WIP documentation

๐Ÿ“Œ Summary

We need a documentation site to keep track of the audits, infra docs, and other docs or references generated through the grant.
This can then be moved to conda-forge org.

๐Ÿš€ Tasks

  • create repo
  • set up docs infra - discussed by @jaimergp and @trallard to use Docusaurus
  • build site - would suggest using Netlify to get PR previews

Improve security, performance, reliability and developer experience on conda-forge bots

๐Ÿ“Œ Summary

Work on bots to eliminate long-lived credentials, improve performance and
reliability, and develop end-user and maintainer's documentation.

๐Ÿ“ Background

The term "conda-forge bots" encompasses several pieces of automated infrastructure key to the operating status of the organization.
It has grown organically, with improvements, additions and hotfixes being made on an "as-needed" basis.
As a result the documentation has some gaps that need to be filled.

Since there was no initial design for its current state, no systematic review of its bottlenecks or risks has been performed.

This makes it difficult to maintain, and given the lack of a testing infrastructure, scary to even try if unfamiliar.

The audit report from the first year will have included security recommendations, performance improvement suggestions and reliability measures.
On top of that, we will make it easier to for newcomers to contribute to the valuable automation ecosystem in conda-forge.

๐Ÿš€ Tasks / Deliverables

  • Consolidate documentation pieces in a single place, with an excellent Getting Started guide
  • Automate credentials provisioning without relying on long-lived tokens
  • Infrastructure as code approach for the deployment of the bots

๐Ÿ“… Estimated completion

This task should be finished in the first 18 months.

โ„น๏ธ References

Audit of the current infrastructure, tooling, and credentials

๐Ÿ“Œ Summary

The goal is to audit and document existing conda-forge's infrastructure.

This will be done in public.
We need to ensure no critical security details such as credentials are exposed.

๐Ÿ“ Background

To propose technical debt reduction measures and ensure the long-term viability of the project and its growing ecosystem, we first need to understand and document the current status of the platform.

Expected challenges:

  • Large number of moving parts across services and platforms
  • Several accounts and credentials key to the normal operating conditions
  • Lack of documentation for each part
  • Scattered institutional knowledge

๐Ÿš€ Tasks / Deliverables

  1. area: documentation ๐Ÿ“– mission: infra ๐Ÿ›  team: quansight-labs type: task
    jaimergp
  2. 3 of 3
    funding: czi mission: infra ๐Ÿ›  team: quansight-labs
    jaimergp zklaus
  3. 4 of 4
    area: documentation ๐Ÿ“– funding: czi mission: infra ๐Ÿ›  team: quansight-labs type: task
    zklaus
  4. area: security ๐Ÿ” funding: czi mission: infra ๐Ÿ›  team: quansight-labs type: task
    jaimergp
  5. area: documentation ๐Ÿ“– funding: czi mission: infra ๐Ÿ›  type: task
    zklaus
  6. 4 of 5
    area: documentation ๐Ÿ“– funding: czi mission: infra ๐Ÿ›  team: quansight-labs
    jaimergp
  7. area: documentation ๐Ÿ“– funding: czi mission: infra ๐Ÿ›  team: quansight-labs type: task

๐Ÿ“… Estimated completion

This task should be finished in the first six months.

โ„น๏ธ References

Add OCI registry support in conda/mamba

๐Ÿ“Œ Summary

Make conda and mamba support OCI registries as repodata and packages sources.

๐Ÿ“ Background

Having an OCI mirror is only the archival part.
The tooling has to learn how to "speak" to it.

conda and mamba should be able to download repodata and packages from OCI-backed servers.

๐Ÿš€ Tasks / Deliverables

  1. vote

โ„น๏ธ References

Implement dashboard interface

๐Ÿ“Œ Summary

Extend the deployed Quetz dashboard with the newly designed interfaces for maintainers.

๐Ÿ“ Background

This is the frontend counterpart of "Review and add needed Quetz plugins for the backend".

The needed UI elements need to be designed and implemented in the Quetz frontend, following the style guide proposed in the first milestone.

๐Ÿš€ Tasks / Deliverables

dashboard-drivethrough.mov

๐Ÿ“… Estimated completion

This task should be finished in the first 12 months.

Serve Python import maps outside libcfgraph

  • Comes from #5
  • Depends on #54

This in the only source of data that we can't serve via OCI-backed or Anaconda.org-backed info/ metadata directly because it requires a global package search. We need to figure out how to present these maps without relying on libcfgraph-like setups (i.e. not another JSON in a repo?).

One way is to reutilize the files-to-artifacts mapping and compute the import-maps on the spot, because they can be inferred by the location of __init__.py modules, mostly.

Finalize oras-py implementation

๐Ÿ“Œ Summary

Work with the broader packaging community to complete the implementation of oras-py.

๐Ÿ“ Background

oras-py is the Python client of the ORAS project, which aims to provide an opinionated abstraction for the storage of arbitrary artifacts on OCI services.
In order to leverage OCI-based artifacts in the conda ecosystem, this library will be needed by many tools.

๐Ÿš€ Tasks / Deliverables

  • TBD.

๐Ÿ“… Estimated completion

This task should be finished in the first 12 months.

โ„น๏ธ References

  • Github Packages: OCI-compliant storage on Github
  • OCI: Open Container Initiative
  • ORAS: OCI Registry As Storage
  • oras-py: a Python library to interact with an OCI registry

Building a maintainers dashboard with Quetz

๐Ÿ“Œ Summary

Prepare the conda ecosystem for OCI-based storage compatibility.

๐Ÿ“ Background

There is no straightforward way to monitor the operational status of conda-forge's infrastructure.

conda-forge.org/status offers a "maintainers dashboard" with information about:

  • Operational status of many of the services that conda-forge relies on, including CI, bots, CDN cloning, webservices, documentation...
  • Ongoing migrations (collection of PRs automatically issued by the bots)
  • Communication about known incidents

Unfortunately, this is far from being comprehensive view of ongoing maintenance tasks, bottlenecks, or the overall health of the many bots and infrastructure pieces.

Having a detailed picture of the infrastructure and automation tools will significantly improve the maintainers' workflow and aid with identifying critical risksโ€” which is essential to keeping up with the increasing growth and demand from the community.

Quetz is chosen as an open-source server for hosting conda packages, thus allowing for increased transparency and extensibility.
This would have the added benefit of centralizing the currently scattered-across-repositories packaging metadata in a canonical, API-first, performant-at-scale database, laying the foundation for further infrastructure automation and improvements to the building processes.

๐Ÿš€ Tasks / Deliverables

See issues labeled as mission: dashboard ๐ŸŽ›

โ„น๏ธ References

OCI-Quetz integrations

๐Ÿ“Œ Summary

Make Quetz understand OCI-backed servers as a packages source.

๐Ÿ“ Background

Having an OCI mirror is only the archival part.
The tooling has to learn how to "speak" to it.

Quetz should be able to list packages uploaded to OCI servers as done with Anaconda.org.

๐Ÿš€ Tasks / Deliverables

  • TBD.

๐Ÿ“… Estimated completion

This task should be finished in the first 12 months.

โ„น๏ธ References

  • TBD.

Enabling mirroring capabilities with OCI-based storage

๐Ÿ“Œ Summary

Prepare the conda ecosystem for OCI-based storage compatibility.

๐Ÿ“ Background

OCI (Open Container Initiative) registries are a well-defined standard for versioned blob storage already implemented by many public cloud providers (i.e. GitHub).
We plan to leverage the OCI registry on GitHub Packages to develop a community-maintained mirror for bioconda and conda-forge.

Besides, adopting an OCI-based strategy will provide additional flexibility for metadata expansion.
With this in mind, we aim to produce and capture more comprehensive package metadata, which we will later use for: maintenance dashboards, package search functions, and security checks.

A prototype mirror is already available at the channel-mirrors organization.

๐Ÿš€ Tasks / Deliverables

See issues labeled as mission: mirror ๐Ÿชž

โ„น๏ธ References

Implement sigstore (or equivalent) in conda/mamba

๐Ÿ“Œ Summary

Evaluate the feasibility of integrating sigstore into the conda/mamba package managers.

๐Ÿ“ Background

sigstore is the open-source standard for signing packages and containers.

๐Ÿš€ Tasks / Deliverables

  • TBD.

๐Ÿ“… Estimated completion

This is a stretch goal. There are no estimates for its completion.

โ„น๏ธ References

Finalize migration to Pulumi

๐Ÿ“Œ Summary

Migration to Terraform for critical infrastructure parts.

๐Ÿ“ Background

At this point, the infrastructure should have accumulated enough improvements with or without IaC approaches.
Finalizing its migration to Terraform or similar will help us with provisioning, scalability, recovery and risk aversion.

Having this goal in the 24 months milestone does not mean it should only start in the last six months of the project,
rather than it should be completed by this time.

๐Ÿš€ Tasks / Deliverables

  • TBD.

๐Ÿ“… Estimated completion

This task should be done by the end of the project (24 months).

โ„น๏ธ References

Document used services and who has access to each one

Use IaC to document and manage who has access to each infrastructure piece.

We have decided to use Pulumi mostly due to its Python scripting support (helpful for custom providers like anaconda.org) and the included cloud dashboard.

Experiments

Packaging

  1. review-requested staged-recipes

Useful resources

Document existing infrastructure

Tasks to complete

  1. funding: czi mission: infra ๐Ÿ›  team: quansight-labs type: task
  2. area: documentation ๐Ÿ“– funding: czi mission: infra ๐Ÿ›  team: quansight-labs type: task

Resources

Quetz maintainers dashboard mockups

๐Ÿ“Œ Summary

Investigate and design prototype mockups with the desired features for the maintenance board

๐Ÿ“ Background

conda-forge.org/status offers a "maintainers dashboard" with information about:

  • Operational status of many of the services that conda-forge relies on, including CI, bots, CDN cloning, webservices, documentation...
  • Ongoing migrations (collection of PRs automatically issued by the bots)
  • Communication about known incidents

This panel has grown organically over the years without significant UX or accessibility analysis.
We will provide mockups that offer the same functionality with a consistent UI informed by best practices in UX and accessibility.

๐Ÿš€ Tasks / Deliverables

๐Ÿ“… Estimated completion

This task should be finished in the first six months.

โ„น๏ธ References

Improve/adopt DevSecOps practices

๐Ÿ“Œ Summary

Further improvement and adoption of DevSecOps practices across the conda-forge/bioconda workflows

๐Ÿ“ Background

The audit report should have revealed gaps in the infrastructure where security could be improved.
We will tackle this by adopting practices borrowed from DevSecOps approaches.

๐Ÿš€ Tasks / Deliverables

  • TBD.

๐Ÿ“… Estimated completion

This task should be done by the end of the project (24 months).

โ„น๏ธ References

Access control: on- and off-boarding core members

๐Ÿ“Œ Summary

Document the onboarding and off-boarding process, with the aim of eventually automating most steps.

๐Ÿ“ Background

When a user joins any of the conda-forge teams, members of the core team need to manually provision the permissions across the required services.
The list of services and the required permissions are not fully enumerated,
and members sometimes acquire the needed credentials by manually requesting it to other members, as needed.

This also means there's no comprehensive list or way of knowing who has access to each service.

๐Ÿš€ Tasks / Deliverables

Tasks

  1. 2 of 3
    area: devops ๐Ÿ— area: security ๐Ÿ” funding: czi mission: infra ๐Ÿ›  team: quansight-labs type: task
    jaimergp

๐Ÿ“… Estimated completion

This task should be finished in the first six months.

โ„น๏ธ References

  • ...
  • ...
  • ...

Design and implement a database for the conda-forge graph and relevant metadata

๐Ÿ“Œ Summary

Migration of existing data sources into a purpose-built database, including a suitable
data schema and schema validation.

๐Ÿ“ Background

The metadata supporting the diverse automations at conda-forge is made of a number of repositories that serve JSON files in a given directory structure.

Depending on the tool, the metadata will be used to build a graph.
This data is downloaded, and the graph recreated, every time the job runs, adding to substantial overhead as conda-forge grows.

Other tools depend on a different presentation of the metadata, and are supported a different repository.
This means that the same data is duplicated just to be presented in a different way.

This is not sustainable or considerate with the available resources, and we would prefer a single source of truth that runs in a performant way.

๐Ÿš€ Tasks / Deliverables

๐Ÿ“… Estimated completion

This task should be finished in the first 12 months.

โ„น๏ธ References

ENH - Project management

TODO

  • Add workflows for:
    • Adding issues/PRs to the project board
    • Automated report (internal reporting)

Client-side access to anaconda.org-provided .conda metadata in conda-forge.org/packages

Quansight-Labs/conda-metadata-app#7 shows a snippet where a Docusaurus page could access Anaconda.org to query the .conda metadata live. Sadly this is not possible for .tar.bz2 artifacts, so those would need to be retrieved from either OCI or an intermediate API server (e.g. https://condametadata-1-n5494491.deta.app/).

It would use URLs like the current /status dashboard does for migrations (see https://deploy-preview-12--cf-infra-docs.netlify.app/status/).

Run a scalable mirror of conda-forge on GitHub packages.

๐Ÿ“Œ Summary

Create and maintain a mirror of conda-forge and bioconda on Github packages

๐Ÿ“ Background

Using the OCI capabilities of Github Packages, we can store conda artifacts.
This can be used as a mirror for archival purposes, at the very least.

๐Ÿš€ Tasks / Deliverables

  1. vote

๐Ÿ“… Estimated completion

This task should be finished in the first 12 months.

โ„น๏ธ References

Improve infrastructure diagrams

#34 added some preliminary diagrams but these are not final. Diagrams are great to create a visual image of what's out there, which seems handy in conda-forge, given the amount of moving pieces we have.

I started a mindmap diagram with mermaid to provide this mental model of all the infrastructure (without relationships, just the inventory). You can see it here:

Once we have that I guess we can start breaking it down in chunks, with each chunk having the relationships between elements when needed.

Review and add needed Quetz plugins for the backend

๐Ÿ“Œ Summary

After reviewing the feedback received from the community, implement new plugins or repurpose existing ones in Quetz.

๐Ÿ“ Background

The UI/UX mockup tasks will have provided a set of needs and features requests for the Quetz dashboard.
In this task we will review which ones are already available in Quetz, which ones need some work, and which ones need to be implemented from scratch.

The plugins might need new data sources and integrations not yet available at the time of implementation.

๐Ÿš€ Tasks / Deliverables

  • Review community feedback and how it fits the existing plugins
  • Implementation (to be expanded with itemized list of changes and required plugins)

๐Ÿ“… Estimated completion

This task should be finished in the first 12 months.

โ„น๏ธ References

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.