Git Product home page Git Product logo

8knot's Introduction

8Knot

Pre-Commit Build-Push

Welcome to 8Knot!

Introduction

8Knot is a Dash data web-app built by Red Hat's Open Source Program Office (OSPO).

The number of repositories and projects that GitHub hosts is staggering. Even more impressive is the rate at which this number is growing. Projects on GitHub range from student projects to technological monoliths like the Linux Kernel. Understanding the growth trajectory, contributor behavior, progress blockers, etc. intuitively is no longer feasible for individual large projects, and is even less so for groups of projects. It is necessary that community architects and contributors alike have an accessible, correct, and extendable resource that can aggregate and interpret the data describing these communities.

The goal of this application is to serve Open Source community mangers, stakeholders, contributors, and enthusiasts by providing an insightful and convenient interface to the Open Source project data set collected by the project Augur (CHAOSS).


Contributing

Please see our guide to contributing to this project at the following site: CONTRIBUTORS.md

Once you've read that, please follow our guidance on how to add additional figures and pages to the application: new_viz_guidance.md


Application File Structure

The file-structure of our application is intuitive. Non-application files are omitted from this overview:

8Knot
+-- pages/
    |   +-- index/
               |     +-- index_callbacks.py
               |     +-- index_layout.py
        +-- welcome/
               |     +-- welcome.py
               |     +-- visualizations/
                            |     +-- name_of_visualization_1.py
                            |     ...
                            |     +-- name_of_visualization_n.py
        +-- contributions/
               |     +-- contributions.py
               |     +-- visualizations/
                            |     ...
        +-- contributors/
               |     +-- cntrb_behavior.py
               |     +-- cntrb_type.py
               |     +-- visualizations/
                            |     ...
        +-- chaoss/
               |     +-- chaoss.py
               |     +-- visualizations/
                            |     ...
        +-- affiliation/
               |     +-- affiliation.py
               |     +-- visualizations/
                            |     ...
        +-- codebase/
               |     +-- codebase.py
               |     +-- visualizations/
                            |     ...
        +-- visualization_template/
               |     +-- viz_template.py
        +-- utils/
+-- app.py
+-- _celery.py
+-- _login.py
+-- _bots.py
.
.
.
+-- ~other files~

The application 'Dash' instance is defined in the 'app.py' file, as is the app.server object that our WSGI server uses, and the manager for the task-queue.

The 'Dash' application instance imports the application's base layout from the '/pages/index/index_layout.py' file. The logic to process user input to components is laid out in this file (search bar, page selectors) is defined in '/pages/index/index_callbacks.py.'

Each page of the application is in its own 'pages' folder. On each page a variety of metrics and figures are rendered. These, for each page, are in the 'page_name/visualizations/' folder, and are imported into the file 'page_name.py.'

If one were to add a figure or a metric to a page, they would add it to that page's 'visualizations' folder and import the visualization into the page's respective 'page_name.py' file.


Motivations and Augur

Open Source software is everywhere, yet it is difficult to find data about Open Source projects. Project community managers, advocates, contributors, and enthusiasts ought to be able to see high-level behavioral, health, and growth trends in their repository that assist their own intuition.

Augur, a project in the CHAOSS Foundation, is closing this gap by collecting structured data about Free and Open Source Software (FOSS).

Quoting Augur's own README.md:

"Augur’s main focus is to measure the overall health and sustainability of open source projects, as these types of projects are system critical for nearly every software organization or company. We do this by gathering data about project repositories and normalizing that into our data model to provide useful metrics about your project’s health."

8Knot's contribution to further closing this gap is to provide an interface to the data collected and organized by Augur as a data web-app with both essential statistical figures, and higher-order machine learning and data science-informed insights.


State of Development

In the insightful words of Karl Fogel from his book "Producing Open Source Software":

"This is alpha software with known bugs. It runs, and works at least some of the time, but use at your own risk."

We are incredibly happy to have people try our application in any state, and we doubly welcome any thorough bug reports. We would seriously recommend, however, that any conclusions drawn from this app, either realized from our deployed application or from a local instance, be scrutinized heavily until we make a proper, stable, >1.0 release.


Communication

Please feel free to join our Matrix channel!

We would prefer any initial communication be through Matrix but if you would prefer to talk to one of our maintainers, please feel free to peruse our AUTHORS.md file where you can find contact details.


Usage Examples

If you would like to see the current state of our application, we would love any user-stories or bug-reports from visiting our alpha-deployment!

8Knot

If you would prefer to look at our most up-to-date work, please check out the following section.


Architectural Comment

Our demonstration application run in Oregon (AWS us-west2), while the Augur database that we use is in Columbus, MO. To improve user experience, we implement a cache using PostgreSQL as a side-car to our application.

This has added significant application complexity that will be rebuilt and removed in the near future once we've replication our Augur database to the same data-center as our application.

If you experience trouble with the existing caching architecture, please log an issue or reach out to us directly.


Deploying 8Knot Locally and for Development

We've tried to make it as easy as possible to run your own 8Knot instance.

Credentials

You will need credentials of the following form, named env.list, at the top-level of the 8Knot directory that you clone. The credentials below are valid, so you can copy and use them to access a testing instance of an Augur database.

These credentials are suitable for development, but please replace any secrets with different values in production.

    AUGUR_DATABASE=graphish
    AUGUR_HOST=chaoss.tv
    AUGUR_PASSWORD=cableTV99!
    AUGUR_PORT=5432
    AUGUR_SCHEMA=augur_data
    AUGUR_USERNAME=coup
    8KNOT_DEBUG=True
    REDIS_PASSWORD=1234
    DEFAULT_SEARCHBAR_LABEL=chaoss
    POSTGRES_PASSWORD=somepassword
    SECRET_KEY=somethingsecret

8Knot doesn't handle user accounts or data collection requests on its own. To support these features, you'll need to add the following additional configuration to your env.list file.

You'll need to register your 8Knot instance with an Augur front-end application to get an AUGUR_APP_ID and an AUGUR_CLIENT_SECRET. All parameters wrapped in < > will need to be replaced below. <endpoint> variables refer to the host of the Augur front-end that you're using.

8Knot uses these parameters to manage user accounts via an OAuth2.0 flow, so user passwords are never handled directly.

    AUGUR_LOGIN_ENABLED=True
    AUGUR_APP_ID=<id>
    AUGUR_CLIENT_SECRET=<secret>
    AUGUR_SESSION_GENERATE_ENDPOINT=<endpoint>/api/unstable/user/session/generate
    AUGUR_USER_GROUPS_ENDPOINT=<endpoint>/api/unstable/user/groups/repos?columns=repo_id,repo_git
    AUGUR_USER_ACCOUNT_ENDPOINT=<endpoint>/account/settings
    AUGUR_USER_AUTH_ENDPOINT=<endpoint>/user/authorize?client_id=<AUGUR_APP_ID>response_type=code
    AUGUR_ADMIN_NAME_ENDPOINT=<endpoint>/api/unstable/application/
    AUGUR_ADMIN_GROUP_NAMES_ENDPOINT=<endpoint>/api/unstable/application/groups/names
    AUGUR_ADMIN_GROUPS_ENDPOINT=<endpoint>/api/unstable/application/group/repos
    OAUTH_CLIENT_NAME=augur
    OAUTH_CLIENT_ID=<id>
    OAUTH_CLIENT_SECRET=<secret>
    OAUTH_AUTHORIZE_URL=<endpoint>/user/authorize
    OAUTH_TOKEN_URL=<endpoint>/api/unstable/user/session/generate
    OAUTH_REDIRECT_URI = localhost:8080/

Note: You'll have to manually fill in the <AUGUR_APP_ID> in the AUGUR_USER_AUTH_ENDPOINT environment variable.

In-depth instructions for enabling 8Knot + Augur integration is available in AUGUR_LOGIN.md. An overview of OAuth's implementation in 8Knot can be found here: user-accounts-in-8knot.md.

Runtime

We use containers to minimize the installation requirements for development and single-machine production deployments. If you do not have Docker on your system, please follow the following guide: Install Docker

We use Docker's Compose feature to spin up all application resources together. Please make sure you have Docker Compose installed on your system. You can find documentation on doing so here: Docker Compose

If the following commands return sensible results then Docker and Docker Compose are installed:

docker && docker compose || docker-compose

(above just runs docker and docker-compose and checks if both work)

NOTE: As of 3/29/24 we recommend using Podman and Podman Desktop instead of Docker and Docker Desktop. It will be our default development environment going forward. There are many guides to transitioning from Docker (Desktop) to Podman (Desktop), but here's a rough outline of our "golden path."

  1. Uninstall Docker Desktop. This will require a GUI uninstall and looking through your apps + filesystem for remnants.
  2. Install Podman and Podman Desktop. You'll also explicitly have to provision a Podman Machine if you're on a Mac.
  3. Enable the "Docker compatibility add-on" available in Podman Desktop. This will route traffic headed for a Docker machine to the running Podman machine. (Under the hood, this points Podman at the Docker socket."
  4. Install docker-compose. This is a standalone, open source tool that Podman Compose delegates compose responsibilities to.

At this point, the Podman docs claim that one should have moved over to Podman as a drop-in replacement for Docker. However, here are two steps that we noticed were necessary in some cases.

  1. In $HOME/.docker/config.json replace "credsStore" with "credStore" (minus an 's') to solve registry credentialing problems.
  2. Set export DOCKER_HOST=<your_podman_machine_socket_path> to the Podman machine's socket on your system, which you can find in the Resources tab of Podman Desktop. The path starts with unix://.

Build and Run

8Knot is a multi-container application.

The app-server, worker-pools, redis-cache, and postgres-cache containers communicate with one another via docker networking.

All of the build/tear-down is done with docker compose.

To start the application, run at the top-level of the 8Knot directory:

docker compose up --build

Due to a known deadlock, we recommend scaling-up the number of worker-pool pods deployed. There need to be (#visualizations + 1) celery threads available for the callback_worker pool.

A concrete example: I have 6 CPU's allocated to my Docker runtime, so Celery workers will default to a concurrency of 6 processes. However, there are 7 visualizations on the Overview page. Therefore, I will scale the 'callback_worker' pod to 2 instances, guaranteeing that there are (2 * #CPUs = 12) available processing celery threads, ensuring that the known deadlock will be avoided.

docker compose up --build --scale worker-query=2 --scale worker-callback=2

To stop the application:

ctrl-c

To clean up the stopped containers, run:

docker compose down --volumes

The application should be available locally at 'http://localhost:8080'


Development Note

We use pre-commit to handle our code quality checks. Before you make a PR please make sure to install pre-commit and pass all of the checks that it requires.

8knot's People

Contributors

bproffitt avatar cdolfi avatar christinaexyou avatar codekow avatar jameskunstle avatar jonasbn avatar jwflory avatar michaelclifford avatar sgoggins 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  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

8knot's Issues

Integrate non-visualization "metrics" to Overview Page

Refer to the miro board design for reference

The work pipeline for non visualization data points is TBA

Non-Visualizations Required for Completion(short hand, refer to miro board for more details):

  • README Description if available
  • mailing list (if accessible from repo)
  • Code of Conduct (Y/N)
  • License
  • Contributor Guideline (Y/N)
  • Website Link
  • Social Media Link
  • Languages in Repo
  • Company Involvement List
  • # of Releases
  • Last Release, number and date

Collaborate for UX/UI design guidance

TODO:

  • meet with tigger and liz to get input
  • determine color scheme
  • determine basic design template for pages
  • design for opening page

dash bootstrap themes

Enhancement: Inform user of Plotly view change ability

Plotly gives the ability to change view, which would be important to users with tables that have edited views and a user wants to see a different subset. Determine how to have noted functionality pop up. This may already be a plotly functionality that may need to be turned on

Chaoss collaboration trial

With transitioning into the visualization creation phase of this project, the goal of explorer was to provide a deeper perspective than other tooling available. Choass metrics working group has spent time collaborating and working through the theoretical side of this, the "what to measure and why" side, with diverse perspectives in the open source landscape. More details to come on the break down of tasks

Visualization to be created (more to be added):

  • Drive By/Repeat Contributions
  • First time Contributions Per Quarter
  • Contributor types over time
  • #52
  • #53

Visualization: Love-orbit

Updates to come with more details. As a starting point as we explore anonymity, we will start a graph ploting the number of contributors over time with a variable "love score". This will allow for seeing active contributors based on multiple different inputs scaled over time (issues, PRs, comments, etc)

Inspiration: https://github.com/orbit-love/orbit-model

Code/Repo Clean up

After getting a little farther in the dash app, the following things need to be done to improve the repo and allow for better experience for new developers to come in:

TODO:

  • Move db_interface folder
  • clean up code that was created to use for repeating functions, make it applicable to what we know now
  • made py file to have all call back code for queries to keep index page clean
  • add comments in index page explaining where the call backs are and how to add more
  • update all of the in line comments for current app
  • clean code from a design perspective (CSS, formatting) to make sure the code is all consistent

Notes on the last bullet point: We use a lot of different template code using different strategies with formatting (class_name, style, etc). Before things build too much, lets get this all consistent for when we build there is not weird format issue and we have items to use as templates

Add deterministic requirements using pipenv

Right now we install our Dash application requirements from a requirements.txt file.

We ought to have closer control of which versions of modules we use when necessary to ensure that
our production state matches our development state as nearly as possible, avoiding "gotcha's" arising
from unvetted library incompatibilities that appear in prod but not in dev.

We can do this by converting from the typical python "pip install -r requirements.txt" workflow to a pipenv workflow.

Dash code review?

As we are starting the development process with dash, can we find someone with significant experience in dash to do some code review? Especially as myself and @JamesKunstle are getting more acquainted with dash, it would be beneficial to have some tuned eyes on our work

Bus factor graph

Bus factor esc graph: show the number/percent of files that have been updated by 1,2,3, etc contributors in x amount of time (input by user)

2 Bucket Bus Factor:

  • Files changed in past 18 months
  • Contributors active in past 18 months
  • Intersection

Current TODOs:

  • @sgoggins creating initial query for this visualization

Backend OO rework

To support faster integration of visualizations from sandiego-rh/sandiego into sandiego-rh/explorer, it is necessary to flesh out a more organize backend.

Connecting to the Augur DB, setting the dbschema, and getting a repo's id from its name, among other operations, are common to all visualization scripts and ought to be presented to the user as a a simple user interface.

New Visualization: Seasonality of Community:

The seasonality of a community pertains to the different time based cycles on community activity. As described by @GregSutcliffe :
"

  • The day-of-week is useful to maintainers when thinking about things like when to post news, event invites etc, and when to be available/have office hours. #203
  • Day-of-year gives maintainers some way to adjust expectation for the coming time-horizon (i.e is it March? I might expect a dip in contribution then, and should not panic when it happens). Clearly this does not work for new projects (STL requires 2 time periods, so 2 years for this) #205
  • Not shown, but other seasonalities are possible. Hourly? Might reveal geographic information (i.e. if you get peaks at UTC +/-1 then you perhaps have an EU-centric community) #205
  • Non-periodic things can be done too, holidays are common. Also I once used an STL with "holidays" corresponding to release dates to analyse the effect of new releases on people upgrading from old versions."

The trend is useful to maintainers and contributors alike - the former will want to know how the project is faring, the latter will want to know if the project is alive and worth contributing too"

Criteria for acceptance(to be updated):

  • Determine which of the following to measure, why, and how
  • Create a small write up to go with the charts to make them accessible and understandable for all
  • Make conscious design choices that make it readable for people with non data science-statistics background
  • create a notebook with the visuals

Bug: Time out error on query call back

⛑️Callback error updating contributions.data2:54:12 PM
Callback error updating contributions.data

504 Gateway Time-out

The server didn't respond in time.

@sgoggins this is on the query you made, any thoughts? Might have to move to materialize view

Determine next page to start on for explorer

We should start to think about the next page(s) for explorer once the overview page is on the "plug and chug" phase on visualizations.
Questions:

  • What page should be next?
  • What are some proposed visualizations for this page?
  • What are the pages we play on doing? How many? What grouping?

Reorganize repo to enable multipage callbacks

Page layouts of non-main pages don't have access to callbacks of app object because they're 'lower' in the directory hierarchy than app.py.

The repository needs to be reorganized to fix this, and the best way to do this is likely with URL routing via the index.py invocation page.

How does layering pages work with column width?

It is known that the overall view of a dash app has a 12 units to work with. When we have layered page view, we have 9 units to work with. When coding the pages (not index page), do we have 12 to work with or 9? Will figure out better wording to explain this question

Search bar- Object across pages

We want our user to be able to change their inputs to the search bar on any page they are on where it triggers updates across pages. More details to come

Create basic Search bar

This will be the initial step with completing the search bar to be accessible across pages.
TODO:

  • Determine best dash object for search bar to be connected across many visualizations and pages (is there a single object for it or must it be directly connected to a single graph?)
  • create search bar with repos/orgs as searchable inputs
  • allow for multiple selections
  • show selected options on search page

Create testing framework

Our application lacks any testing process before it is deployed or merged into dev or main. A difficulty in testing our app is that the data we are using are constantly updating- we need to target functions of the app that are data-agnostic.

The following are good candidate technical tests:

  • Augur database is available
  • Query to Augur with known return (up to max historical time) matches previously expected return value (past data isn't changing underfoot)
  • Augur query of reasonably large size doesn't take too long
  • App doesn't raise any runtime errors on deployment (run the app, hooks into logging for graph rendering)
  • Large query takes any amount of time but doesn't error out.
  • Moving between tabs w/ web driver changes url route as expected (Selenium)

We should have the long-run ability to test:

  • different versions of python
  • different operating systems (good practice for contributor accessibility)

We'll begin by implementing tests in PyTest and move to using Tox later when we want to test across environments. GithubActions handles these OS environments as well, so that's an option.

Charming data Dash Overview

@cdolfi will be going through the following videos and documenting notes and reflections here:

  1. Introduction to Dash Plotly Data Visualization in Python - https://youtu.be/hSPmj7mK6ng
  2. Introduction to Plotly Data Visualization - https://youtu.be/_b2KXL0wHQg
  3. The Dash Callback Input, Output, State, and more - https://youtu.be/mTsZL-VmRVE
  4. Dropdown Selector Python Dash Plotly - https://youtu.be/UYH_dNSX1DM
  5. Pie Chart (Dropdowns) Python Dash Plotly - https://youtu.be/iV51JqP6y_Q
  6. All about the Graph Component Python Dash Plotly - https://youtu.be/G8r2BB3GFVY
  7. Complete Guide to Bootstrap Dashboard Apps Dash - https://youtu.be/0mfIK8zxUds

Repo Link: https://github.com/Coding-with-Adam/Dash-by-Plotly (all credit goes to @Coding-with-Adam for content)

ERROR: Exceeds Quota

When storing a large org dash gives the following error: "Failed to execute 'setItem' on 'Storage': Setting the value of 'commits-data' exceeded the quota."

With that, the graph still updates with new data and performs as expected. Only thing I would be concerned about is if this is a subset of the data. More investigation to come

Investigation needs to be done on what are the data transfer limitations are and how we need to format queries to work through this.

New Visualization: Metric License Coverage

Please describe the background and context for this new visualization
Determine how many files are covered by licenses and number of files covered by each license

Describe the perspective you'd like the final visual to give
https://chaoss.community/metric-license-coverage/
https://chaoss.community/metric-license-declared/

Describe the acceptance criteria for the issue and visualization to be complete
Not to be done in a notebook. Either used to test a visualization tooling option or completed when the tool is established

Additional context
Add any other context or screenshots about the feature request here.

REMINDER:
Before a visualization issue can be closed,there must be clear documentation on the notebook of the decisions made at each step and the "why." Also,
any ml ideas generated from this process should be created into as issue with the ml request tag**

Bug fix: ~12 second wait time for app to load

Apparently not linked to getting or setting data, our app can take upward of 12 seconds to become usable upon initialization.

I'm going to profile the callbacks to determine the origin of this bottleneck.

EDIT:
How will a dynamic callback for the dropdown affect this problem?

  • Implement the dynamic dropdown
  • check speed compared to the current soln
  • verify if the dynamic dropdown is the alternative we should be using

Component Update: DropDown component on index page.

The Dropdown contributed to ~12 seconds of wait-time for the user because it's doing background work, likely loading data into memory. We would like to speed this up and one option is to make a dynamic callback.

#49

The above issue explores this option.

For this issue, our definition of done is:

  • Try dynamic callbacks for the Dropdown bar
  • Ensure case-insensitivity and look into very conservative fuzzy-matching.
  • Implement the dynamic callback for the dropdown bar, ensure that it's more timely.

UX Enhancements

Through different conversations with @harishpillay and @sgoggins, the following UX suggestions will be implemented:

  • Notes on the start page to help guide users, a placeholder until we do more design implementations
  • Add button for GH issue creation: bug report, new visualization request, new repo/org request
  • loading bar as graphs/search bar updates (see #37 )
  • Create issue templete to link to buttons

Question: Can a search bar be connected across pages?

Once the search bar is created on opening page, is there a way to

  • Show selected options on all pages
  • make it where it shows as the boxes with x's (figure out better way to verbalize this) for people can deselect options and call back triggers visualizations reload
  • connecting search bar across pages where its all connected (some form of "global variable esque thing)

New visualization: Response/Merge time analysis comparing contributors

There may be some value in comparing the speed and engagement in responding to and merging PRs between the top (10ish?) contributors and the median/mean contributors. This visualization is not fully fleshed out for the purpose of exploring some different ways of looking at this to determine if this is useful to look at and which fashion

Acceptance criteria:

  • Determine if the number of "top contributors" should be a set number or a percent of the contributor count
  • Response: time to first response should be tracked, but is there a value in number of response or other metrics in that area?
  • Determine if mean, median, (or something else) should be the comparison group
  • Would a histogram of some sort be better for this?
  • Determine if this should be added to an existing notebook or stand on its own

Query for gathering repo_ids from multiple github urls

Given the input from the search bar, generate the query and any additional code necessary to output the necessary repo_ids for the explorer pages

input could be:

-one or many repos
-one or many orgs
-combination of both

New Visualization: Response rate to Bugs

Please describe the background and context for this new visualization
Response/Close rate to issues with the bug/defect tag

Describe the perspective you'd like the final visual to give
We would like to show the response rate to an issue that can be assumed to be associated with a bug.

Describe the acceptance criteria for the issue and visualization to be complete
This should be completed in the finalized visualization tool or as a demo testing tools out

Additional context
Add any other context or screenshots about the feature request here.

Adding user persistence - settings and history

Various opportunities of users to save some instance state relating to their workflow have become evident. Therefore, we ought to see how we can integrate user persistence where possible and explore best practices for doing this with Dash.

We could integrate it into a Javascript / React-based webapp:
https://dash.plotly.com/integrating-dash

Or we could try to embed the Dash app inside of a Flask app:
https://hackersandslackers.com/plotly-dash-with-flask/

Or we could ultimately move to a flask / plotly stack rather than relying on Dash:
https://towardsdatascience.com/web-visualization-with-plotly-and-flask-3660abf9c946

Interestingly, the last option seems to be more extendible in this respect, but it would obviously take us out of the nice sandbox that Dash allows us to play in.

More to come.

Chaoss page: graph formatting

When working on the dash app locally, the two graphs are on the same row but on separate rows in the open shift deployment

UI: add descriptions to visualizations

For new users coming onto the page, context on each visualization would be helpful. What format this is TBD by the contributor that works on this, but the following should be done:

  • Create a consistent format for the descriptions to be added to each viz but only visible if someone hovers or clicks something. This should be reproducible for each future visualization made
  • type out a description for each one currently made with guidance on toggles

Add visualizations to pages -- Overview

Refer to the miro board design for reference

The visualizations will be generated via jupyter notebook in the sandiego repo. An issue is to be created for each integration once the corresponding notebook is created.

Visualizations Required for Completion(short hand, refer to miro board for more details):

Active contributors by Action

This visualization will show the number of contributors by time interval per action.

User inputs:

  • selects from drop down which action to look at
  • chooses # of months for time buckets

This will be implemented using a histogram.

New Visualization: Bus Factor

Please describe the background and context for this new visualization
The Bus Factor is a compelling metric because it visualizes the question "how many contributors can we lose before a project stalls?" by hypothetically having these people get run over by a bus (more pleasantly, how many would have to win in a lottery and decide to move on).

The Bus Factor is the smallest number of people that make 50% of contributions.
Describe the perspective you'd like the final visual to give
https://chaoss.community/metric-bus-factor/

Describe the acceptance criteria for the issue and visualization to be complete
when the issue is taken on, the people working on this should edit to describe the steps necessary to complete this as a visualization in the explorer dashboard

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.