Giter VIP home page Giter VIP logo

gocast's Introduction

volkswagen status Better Uptime Badge

TUMs lecture streaming service, currently serving up to 100 courses every semester with up to 2000 active students.

Features include:

  • Automatic lecture scheduling and access management coupled with CAMPUSOnline
  • Livestreaming from lecture halls
    • Support for Extron SMPs and automatic backup recordings on them.
    • Support for preset management on ip cameras
    • Automatic recordings and video on demand with granular access control.
  • Self-streaming
    • Stream ingest from Home using OBS or similar software.
  • Live chat
  • Statistics (live and VoD view count)
  • Self-service dashboard for lecturers
    • schedule streams, manage access...

Architecture

                                          ┌──────────────────────┐
                              ┌───────────►   Campus Management  │
                              │           │ System (CAMPUSOnline)│
               ┌──────────┐   │Enrollments└──────────────────────┘
               │Identity  │   │
               │Management│   │                 - Users,
               │  - SAML  ◄─┐ │                 - Courses,
               │  - LDAP  │ │ │                 - Streams, ...                               ┌────────────────────┐
               └──────────┘ │ │              ┌──────────┐                                    │Lecture Hall        │
                      Users │ │  ┌──────────►│ Database │                                    │ - Streaming Device │
                            │ │  │           └──────────┘                               ┌────┤ - Camera           │
                            │ │  │                                                      │    │ - Slides (HDMI)    │
                         ┌──┴─┴──┴────┐         Task Distribution (gRPC)            RTSP│    │ - Microphone       │
            ┌────────────►  TUM-Live  │◄─────────────────────────────────────┐      pull│    └────────────────────┘
            │Website     └────────────┘                                      │          │
            │(HTTP)                                                          ▼          │
            │                                                             ┌─────────────▼─────┬─┐
            │                               ┌────────────────┐            │TUM-Live-Worker #1 │ │ Streaming,
┌───────────┴──┐                            │ Shared Storage │            ├───────────────────┘ │ Converting,
│Student/Viewer│                            │ S3, Ceph, etc. │            │  TUM-Live-Worker #n │ Transcribing, ...
└───────────┬──┘                            └─▲────▲─────────┘            └──────┬──▲────▲──────┘
            │                        Serve Vod│    │HLS Files            Push VoD│  │    │RTMP
            │                          Content│    │         ┌───────────┐ (HTTP)│  │    │push
            │                                 │    └─────────┤VoD Service◄───────┘  │    │       ┌──────────────┐
            │Videos      ┌──────────────────┬─┴┐             └───────────┘          │    └───────┤Selfstreamer  │
            │(HLS, HTTP) │ TUM-Live Edge #1 │  │                                    │            │  - OBS,      │
            └────────────►──────────────────┘  ├────────────────────────────────────┘            │  - Zoom, ... │
                         │   TUM-Live Edge #n  │       Proxy, Cache (HTTP)                       └──────────────┘
                         └─────────────────────┘

Getting Started

The easiest way of running and testing TUM-Live is by using the provided docker-compose file:

docker compose build && docker compose up

Be advised that the compose file is not indented for production use as it runs everything on one machine.

If you want to get TUM-Live running natively follow these steps:

Setup Database

  • Follow the steps here to install mariadb via docker.
  • Then run the docker container using the following command.
docker run --detach \
  --name mariadb-tumlive \
  --env MARIADB_USER=root \
  --env MARIADB_ROOT_PASSWORD=example \
  --restart always \
  -p 3306:3306 \
  --volume "$(pwd)"/docs/static/tum-live-starter.sql:/init.sql \
  mariadb:latest --init-file /init.sql
  • Alternatively, install mariadb on its own.
    • Create the database tumlive using this script.
    • Or: Use JetBrains DataGrip to open the database and then run the script there to automatically set up a demo database.
  • The database contains the users admin, prof1, prof2, studi1, studi2 and studi3 with the password password.

Install go

  • Install go >=1.21 by following the steps here
  • Preferably use JetBrains GoLand and open this project as it simplifies this entire process
  • Go to File -> Settings -> Go -> Go Modules and enable go modules integration.
  • Run npm i in the ./web directory to install the required node modules
  • Run go get ./... to install the required go modules
  • If you want to customize the configuration (for example mariadb username and password), copy the config.yaml file over to $HOME/.TUM-Live/config.yaml and make your changes there to prevent accidentally committing them.
  • Start the app by building and running ./cmd/tumlive/tumlive.go
  • Head over to http://localhost:8081 in your browser of choice and confirm that the page has loaded without any problems.
  • To keep automatically rebuilding the frontend code during development, run the command npm run build-dev in ./web (and keep it running).
  • Voilà! Happy coding! ✨

Enable pre-commit hooks

  • Make sure you have staticcheck and pre-commit installed. If you have pip installed on your machine, you can install them with the following command
go install honnef.co/go/tools/cmd/staticcheck@latest && pip install pre-commit
  • Runpre-commit install. It will install the pre-commit hook scripts for this repository.

Now the hook scripts will be triggered for every new commit, which should improve overall code quality. You can also run the pre-commit hooks manually for all files by executing pre-commit run --all-files. If you get the error message The unauthenticated git protocol on port 9418 is no longer supported., try running the following command

git config --global url."https://github.com/".insteadOf git://github.com/

See this blogpost for more information on this error message.

Linting and formatting typescript files

The following scripts are provided:

  • npm run lint: Runs eslint and prettier on the code to find stylistic issues.
  • npm run lint-fix: Same as above but also fixes the found issues.

If you use GoLand, you can use follow this guide to integrate prettier. There is also a guide for integrating eslint. For both configs are provided that should be automatically detected. If you set everything up correctly, prettier and eslint should run everytime you save. Additionally, GoLands formatter will now respect the prettier style rules.

Add Database Models:

To create database models and their corresponding daos there is a helper script that can be used to automate this task:

go run cmd/modelGen/modelGen.go <NameOfYourModel(UpperCamelCase)>

Customization

An exemplary configuration can be found in /branding.

logo, favicon, manifest.json

For customization mount a directory containing the files in the docker container. Make sure to specify the location of the directory in the container in the configuration file as paths > branding. See /config.yaml for an exemplary configuration.

title, description

If intended, put a branding.yaml file at the same location as config.yaml.

Credit & Licenses

gocast's People

Contributors

0ql avatar alexanderstephan avatar andreaspaul avatar ata-keskin avatar barisconur avatar barisgul15 avatar commanderstorm avatar dawinyurtseven avatar dependabot[bot] avatar gereonelvers avatar joschahenningsen avatar josefschoenberger avatar just-max avatar karjo24 avatar kordianbruck avatar matthiasreumann avatar max-ae avatar mjaethers avatar mono424 avatar mw360 avatar renovate[bot] avatar ro-i avatar sebiwrn avatar simon300000 avatar valentin-metz avatar wimmerth avatar xarantolus avatar yiranduan721 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gocast's Issues

Require only one streaming key for each course

Is your feature request related to a problem? Please describe.
Currently a stream can be ingested with a streaming key (secret) which is unique for each lecture.

Describe the solution you'd like
It would be more convenient if a lecturer wouldn‘t need to reconfigure their software for every stream. A single key for the course would be sufficient.

Additional context
Users need to be able to regenerate the key if it gets leaked.

Notifications

It would be helpful to be able to notify users about certain events with a tiny bell in the upper right hand corner like on github. Such notifications could include feature changes or feedback requests.

Also users should be able to enable live and VoD notifications to their phones/desktop via the notification api (https://developer.mozilla.org/de/docs/Web/API/notification)

Smaller clickable area of the course link

Sometimes I accidentally get thrown back into the course menu, because I click under the video to defocus a context menu when configuring video playback. As this also erases the timestamp, this is rather annoying.
As seen in the screenshot below, the clickable area of the href is way too big.
Purely visually, the area on the right shouldn't be clickable.

I would suggest to make the clickable area just as long as the text itself.

grafik

Switch to a faster http framework

Possibly fiber or fasthttp?
Not sure if serving 1000 requests per second more really makes a difference. We won't expect more than two thousand per minute or so.

Player UI partially unavailable in fullscreen on iPad Pro

Describe the bug
Going into fullscreen mode with the web player on an iPad Pro (with rounded corners) will render the buttons in the lower left and right corners (skip 10s back, leave fullscreen) unusable.
Also, using the progress slider in the center to skip in a VOD isn't always possible on the iPad Pro since it's partially obscured by iPadOS's "homebar".

To Reproduce
Steps to reproduce the behavior:

  1. Open website with Safari on an iPad Pro (2018+)
  2. Open VOD
  3. Go into fullscreen mode
  4. Try using the skip back button, leave fullscreen button or the progress slider.

Screenshots
screenshot

Smartphone (please complete the following information):

  • Device: iPad Pro 11" (2018)
  • OS: iPadOS 14.4.1
  • Browser: Safari

Combined presentation and camera view

In addition to the “comb-view” video there should be an option to view both camera and presentation videos side by side and modify their sizes.
Important gotchas: We need to make sure the videos are synchronized and only one of them should be un-muteable at the same time.

Search through lectures

This could include:

  • automatically created transcriptions (I had a look at Mozilla’s DeepSpeech and Common Voice) but we‘d likely need our own trained datasets. Possibly crowd-sourced from viewers on a per-prof-base.
  • OCR on the presentation stream
  • Self uploaded PDF presentations from the lecturer.
  • Crowd sourced timestamps regarding topic changes

and whatever else one can think of 😄

Cannot play VoD on Firefox

Describe the bug
I cannot start playing some videos on demand using Mozilla Firefox 93.0 on Ubuntu 21.04. After clicking "play", the following output appears in the console:
tum_live_bug

To Reproduce
Steps to reproduce the behavior:

  1. Go to live.rgb.tum.de using Firefox
  2. select a VoD (in my Case the ERA Zentralübung (ID 6278 or 6308), some other VoD work just fine
  3. error will show in console, stream will not load (loading circle will spin for ever)

Expected behavior
The VoD should start playing, just like it does when using chromium.

Desktop (please complete the following information):

  • OS: GNU/Linux Ubuntu 21.04
  • Browser firefox
  • Version Mozilla Firefox 93.0

Thanks for looking into it! 😃

Initial admin user can't be created

The code to create a user when TUM-Live spins up the first time was not maintained for a while because there was no usecase for it since April :D

Creating a user during the onboarding currently fails with a http 403 code.

Live reactions for lectures

Is your feature request related to a problem? Please describe.
When watching a lecture that uses Tweedback there are things like the panic button, that clearly indicate that the lecture is hard to follow. This can be really useful, since the chat can become hard to track for large amount of students.
That also makes it difficult to actually estimate what percentage of the student shares a certain opinion about the lecture. Therefore there should be an option for easy, instant, grouped feedback, that can also be visualized while being completely anonymous.

Describe the solution you'd like
There should be buttons that represent the mood of the student. For example there could be buttons that indicate the lecture moved too fast eg. 🏎️ , too slow e.g 🐌, or even mood indications. There could also be a certain threshold of votes e.g 20% of the current viewers within 5 minutes, that trigger an alert, that will be also directly sent to the lecturer.
The buttons should be combined with a heatmap or gauge, that will fade again after some time, as we expect the relevancy of the feedback to decrease over time.

Describe alternatives you've considered
Of course you could always use Tweedback additionally, but it would be awesome if TUM-live became independent of other platforms and offers an integrated solution for lectures. Quizes can also be used for getting opinions about the lecture, but it is not ideal, as those have to be created manually.

Fix time for chat messages

Describe the bug
Chat messages are inserted in UTC time and parsed as CET times. This leads to chat messages being displayed two hours off when reloading the site.

To Reproduce
Steps to reproduce the behavior:

  1. open stream/VoD
  2. send a message (note: time is correct)
  3. reload page
  4. time is off by two hours now. 😞

Additional context
Oddly enough, in SQL SELECT NOW() yields the correct time.

Show current stream latency

Streams could indicate how high the current latency is. Didn't think of a technical solution for this yet.

Improve semester selection user experience

It is possible to access semesters that do not have any courses [1] and the semester selection does display those. While this doesn't cause any issues, displaying semesters without any content (not even restricted content) might confuse users. Maybe those could be filtered out?

Also, imho the current semester selection [2] does not make it clear there are other semesters than the ones currently displayed in the semester selection. Maybe some kind of visual indicator can be used to reflect this more clearly?

Apart from that I really love the new site, thanks for working on this ^^

[1] as an extreme example, one can access /semester/-4201337/W
[2] grafik

Toggle Light/Dark Mode Based on System Theme

Many websites and apps [1] have added the ability to not only switch manually between a dark and light theme, but also to adapt automatically to the system theme. TUM-Live should add this as an option.

Solution
The existing theme-switcher button should be extended to cycle between light mode, dark mode and auto mode (follow system theme). In light or dark mode, the behaviour should be as before. In auto mode, TUM-Live should check the preferred theme upon loading and then listen for updates, updating the displayed theme as needed.

The following issue describes adding the same feature to VSCode, the link points specifically to a comment suggesting a clean way of implementing theme preference: microsoft/vscode#61519 (comment). The solution bases off of using window.matchMedia('(prefers-color-scheme: dark)')

More info

Implementation
I've gone ahead and implemented this, PR incoming.


[1] examples: github, VSCode

Adaptive Bitrate

I think it's obvious that TUM-Live should be as accessible as possible, so offering lower-bitrate streams for people with bad internet connections is something worth discussing. There are of course some potential drawbacks to this which may outweigh the benefits:

  • high processing requirements on the server for re-encoding the video stream
  • Added complexity
  • @joschahenningsen mentioned something about licensing costs
  • time might be better spent on other features

Loadtest issues

This is where you can leave comments on problems that occured during the load testing of TUM-Live on 31. March 2021. If it feels relevant please open a new issue.
You can also use reactions below to vote on problems.

reaction 👎 😆 😕 🚀 👀
issue Page load slow issue displaying site much buffering problems logging in chat doesn't work

If possible provide details from the developer console (such as http status codes or console messages)

Feature request: More interoperability with non-web players, like mpv

Is your feature request related to a problem? Please describe.
Non web-based media players, like mpv, work very well with the streams displayed at tum live.
They tend to use less memory, can buffer streams, allow fine control of playback speed and even allow to rewind.
Hence, their use would be very popular if they were easy to use.

Describe the solution you'd like

  • Add a link to the *.m3u8 file of the stream, so that if you click on it, Firefox can show it's dialogue to download or open with, eg. mpv.
  • Add an option to only show the chat of the stream, without the video player.

Describe alternatives you've considered
The *.m3u8 file can probably be gotten from source text, like at live.rbg.tum.de, but that's less convenient.

Additional context
No.

Improve link behaviour in description

Not sure if this is an issue or feature request as links currently (at least for the grnvs lecture) open in the current tab and therefore close the stream.

Preferably, at least to me, links should open in a new tab and be underlined when hovering them

Known issues

These are some issues we are aware of, you don't need to open a new one, they'll be fixed as soon as possible

  • starting a stream via obs, and stopping it triggers a vod creation. If the stream is restarted before the vod is done transcoding, the live stream will be overwritten by the vod.
  • Chat looks awful in light mode

VODs not scaled correctly

Describe the bug
When viewing a VOD with 16:9 aspect ratio, the video is scaled to fit the page. With a 4:3 aspect ratio, however, the bottom part of the video may not be visible.

To Reproduce

  1. Visit a VOD with 16:9 aspect ratio
  2. Visit a VOD with 4:3 aspect ratio

Expected behavior
VODs should be scaled to fit the page correctly.

Screenshots
16:9 aspect ratio VOD:
grafik

4:3 aspect ratio VOD:
Screenshot_2021-03-31 Lasttest Project Code Rush - The Beginnings of Netscape Mozilla TUM Live

Desktop

  • Device: 1900x1080 Monitor
  • OS: Windows 10
  • Browser: Firefox 87.0

Additional context
Interestingly, the load test stream did fit the page.

Decouple IDs from URLs

Instead of URLs like /watch/123 or /api/chat/456 I'd like something along the lines of /watch/2020/04/06/grnvs everywhere

Chat input form not visible/ availible under iPadOS

Describe the bug
When Using the IOS-Webbrowser the form chatForm is not visible/availible

To Reproduce

  1. Open A stream using the chat-feature under iPadOS
  2. Don't see chat

Expected behavior
The chat should be visible.

Screenshots
IOS:
IMG_0457

Chrome-Desktop:
Screenshot_20210713_130848

Desktop:

  • OS: Linux
  • Browser Chrome
  • Version 91.0.4472.114

Smartphone:

  • Device: iPad Pro
  • OS: iPadOS 14.6
  • Browser safari
  • Version 14

Additional context
It does not seem to be the case of bad scaling, as scaling the desktop does not result in the chatFrom not showning..

Cinema mode

I use Tum Live on a widescreen Monitor and therefore use it next to other windows (e.g. Slides etc.). When resizing the window above a certain size, the video player ist set to 66% of the window width. This leads to unused screen real estate, that has to be covered by overlaping windows and would cover other windows, if the video has to be stopped or adjusted.

A good solution imo would be a "cinema mode" button that leads to the video beeing displayed over the full width/heigth of the window.

Control Playback Speed of Recordings

A button for adjusting the playback speed of recordings is a very convenient feature I regularly use on other platforms.
Especially for lectures it is often helpful to be able to watch the recording faster.

Describe the solution you'd like
A button opening a small menu to choose from given playback speeds. Ideally located somewhere close to the progress bar, e.g. next to the quality settings button. Ideally in small steps from 1x to maybe even 3x.

Describe alternatives you've considered
An alternative would be using a browser extension (like https://github.com/igrigorik/videospeed). [See this github page for more details as to why watching recordings at a higher speed is nice as well.]

Additional context
An example from a BigBlueButton recording:
BBB-recording

Videos use native browser controls

About two days ago, all of my browsers started using the browser's native video controls, so big picture mode, playback speed, etc. are missing. I tried Edge, Chrome and Firefox on Windows and Edge (yes, Edge) on Linux. Is this intentional? I really miss the big picture mode.

Replay chat in VODs

Is your feature request related to a problem? Please describe.
When watching a VOD, it's useful to be able to see which chat messages were sent during that time in the live stream. For example, the user may want to quickly see answers in chat to questions asked in the stream, or questions asked in chat answered in the stream. Currently, the VOD chat contains a log of all messages sent during the stream.

Describe the solution you'd like
I propose the chat to be replayed during the VOD. This could be realized by automatically scrolling the chat log in the client (so the most recent message during the stream is at the bottom, just like a real time chat).

Describe alternatives you've considered
Leaving everything as is requires manually scrolling and searching in the chat.

Allow .csv (or any other machine readable format) download of viewer statistics for admins

Is your feature request related to a problem? Please describe.
The live statistics offered after the finished stream are a great source of information for lecturers and instructors. To fully analyze and reuse this data it would be great to be able to download it to (preferably) a .csv file.

Describe the solution you'd like
A button below the graph to download the data

Describe alternatives you've considered
Trying to reverse engineer the API and write a small script. I currently lack the skill, time, and motivation to do this.

[UX] Clicking on the Logo should lead to the Root of the domain

Is your feature request related to a problem? Please describe.
The "Start"-Button is pretty tiny.
Clicking the TUM-Logo does nothing

Describe the solution you'd like
Clicking on the Logo should lead to the Root of the domain

Describe alternatives you've considered
Do nothing, I guess 🤷🏻‍♂️

Download Buttons for Recordings

Is your feature request related to a problem? Please describe.
When watching recordings you still need a steady internet connection. Being able to easily download e.g. lecture recordings to watch them on the go without having to rely on mobile connectivity would make the lecture more accessible to people with limited mobile data.

Describe the solution you'd like
A simple download feature to easily download recordings. Making the recordings downloadable could be an optional feature so each lecturer can decide if he or she wants the users to be able to download recordings.

Describe alternatives you've considered
Students can (and will) get the .m3u8 link from the site's sourcecode to record and/or download the videos. A feature like this will make this process more convenient.

Additional context
For example the Panopto service used for recordings of some lectures at TUM already offers this feature.

Implement Chat

Hard requirements

  • not anonymous (requires login, users not shown publicly?)
  • can be disabled on a "per-course" basis

Integrate source selection into player interface

This has been bugging me for a while so I'm opening an issue as a reminder to myself :D

Requested feature:

Simmilar to the playback speed selection all available sources should be selectable in the video player.

Benifits:

  • Page is less cluttered with ugly icons
  • Embedded player can be used to view all sources

Drawbacks:

  • This would make a change away from VideoJS harder :/

Additionally the preferred (last used) source should be persisted in the webstorage so users don't have to constantly switch to their desired source.

15 sec skip backwards

Is your feature request related to a problem? Please describe.
I'm always frustrated when I want to skip back like 10 - 20 seconds.

Describe the solution you'd like
I would like a skip button.

Describe alternatives you've considered
One time, there was a link to only use the native browser player which has such a button. But this link disappeared in my recent recordings.

Additional context
I'm watching the VoD recordings. In my safari browser, there is the option to show native browser controls which have a skip button included but those controls overlap with the site javascript video controls. In fact, they are behind them so I can't use the native skip buttons easily.

Bildschirmfoto 2021-04-20 um 18 15 35

Tweedback like chat features

Chat will most probably not be adopted by lecturers in it's current state. Some things it needs:

  • Moderation: Lecturers see messages first and can decide to approve or dismiss them.
  • Voting: Students can vote for messages/questions that are useful. These can be shown prominently.
  • Quiz messages: Lecturers send simple multiple choice quizzes to the chat.

Un-hide Courses

Describe the bug
By mistake, I did hide a course on the Start page (on iPad). At the bottom of the list, it says "1 hidden course". There is no way to un-hide the course and regain access.

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'live.mm.rbg.tum.de' (on iPad)
  2. Tap on a course in the list
  3. Click on the 👁️ icon in front of the course name.
  4. Find "1 hidden course" message
  5. Try to regain access
  6. Cry

Expected behavior
I expect to expand the list of hidden courses and in-hide individual courses as needed.

Tablet:

  • Device: iPad Pro (11-inch)
  • OS: iPadOS 14.6
  • Browser: Safari

VOD options not shown

Describe the bug
The options to edit or set a VOD recording private are not shown as documented in the wiki here https://github.com/joschahenningsen/TUM-Live/wiki/Using-TUM-Live-as-a-lecturer#after-the-stream

To Reproduce
Steps to reproduce the behavior:

  1. Go to the Admin tab of a past lecture and expand one of the recorded past lectures
  2. You'll only see two buttons to download the vod recording and to access the statistics

Expected behavior
See additional buttons to edit start and end or to set recording private

Screenshots
image

Desktop (please complete the following information):

  • OS: Windows 10 Pro 64Bit
  • Browser: Chrome 95.0.4638.69 and Edge 95.0.1020.44

Switch to Shibboleth if possible

Currently blocked on some courses depending on ldap for group management and not having an API Token for the physics department.

OAuth2 was taken into consideration but cannot be used because students would not be able to log in whenever TUMOnline is in maintenance (which happens very frequently)

Multiline message with Shift+Enter

Is your feature request related to a problem? Please describe.
It is not possible to write multiline messages in the chat without sending the line.

Describe the solution you'd like
Other chat clients use for example Shift+Enter to get a new line without sending the message.

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.