Git Product home page Git Product logo

vdjviz's Introduction

VDJviz: a versatile immune repertoire browser

VDJviz is a web-based graphical user interface application that allows browsing and analyzing immune repertoire sequencing (RepSeq) data. It can be used to visualize results of MITCR, MIGEC, MIXCR and MIGMAP RepSeq processing software as well as popular IMGT/HighV-QUEST and ImmunoSEQ Analyzer services. VDJviz can be installed and used as a local server, alternatively you can use an online demo version available at https://vdjviz.cdr3.net/ which currently has an upload limit of 25 datasets each having size at most 10,000 clonotypes. The list of VDJviz features at a glance:

  • Clonotype table browsing with V/D/J markup.
  • CDR3 pattern matching for a single sample and across multiple samples with flexible filters.
  • Spectratype, V-Spectratype, V-J usage and clonality analysis. Those can be compared side-by-side using the Compare panel.
  • Summary statistics and rarefaction for multiple samples.
  • Clonotype sharing across samples (many-to-many intersection) with flexible clonotype matching criteria.
  • Uploaded data sharing.

VDJviz uses VDJtools API as a back-end. The software utilizes Play framework for running the server instance and state-of-art web graphics libraries such as D3js for visualization.

Installation

The most straightforward way to install VDJviz as a local server is to download the latest release package.

After downloading unzip the package wherever you want, but please avoid long paths and spaces (Windows version is especially sensitive to it).

You can find the server executable in bin/ directory. To set up the server:

  • Run vdjviz.bat file (Windows)
  • Run bash vdjviz -Dconfig.file=application.conf in your console (Linux/Mac OS)

Wait until the server is started, and go to localhost:9000 URL in your browser to open VDJviz. The user generator is enabled in the config by default, so you can login with [email protected] as an email and vdjviz1 as password,

To stop application just press Ctrl-C at any time in console.

Troubleshooting. Note that an exception will be thrown in case the 9000 port is busy: org.jboss.netty.channel.ChannelException: Failed to bind to: /0.0.0.0:9000. In order to fix it, either close the application that is using this port (in UNIX the lsof -i:9000 will give the processes that are using the port) or pass the -Dhttp.port=XXXX (where XXXX is new port id) argument to vdjviz shell script (UNIX) / vdjviz.bat (Windows)

Server configuration

VDJviz server configuration can be performed by manually editing application.conf file in the bin/ directory. The configuration file has the following fields:

  • application.secret The secret key used in cryptographic hash functions.

  • uploadPath Specifies the path that will be used by VDJviz to store user's uploaded files. You can use '~' symbol as a shortcut for user home directory. Default: ~/vdjviz/

  • maxFileSize File size limit in kB Default: 0 (no limit)

  • maxFilesCount Limit on the number of uploaded files per user. Default: 0 (no limit)

  • maxClonotypesCount Limit on the number of clonotypes for each uploaded file. Default: 0 (no limit)

  • allowSharing Disable or enable sharing feature Default: true (enabled)

  • maxSharedGroups Maximum number of shared analyses per user. Default: 0 (no limit)

  • deleteAfter Time period after which uploaded files are deleted from the server, in hours. Default: 0 (never)

  • applyNewLimitsToOldUsers If set to true the server will automatically update limtis of all existing user accounts according to the ones specified in config. If set to false, the limits will only be applied to newly created users. Default: true

  • createDefaultUsers Specifies whether the server will generate some default user accounts with predefined emails and passwords, setting their emails to <nameDefaultUser><id>@vdjviz.com (e.g. [email protected]) and passwords to <nameDefaultUser><id> (e.g. vdjviz1). Set this option to false if you don't need this feature and prefer to use registration via SMTP. Default: true

  • nDefaultUsers Number of default users to be created. Default: 1

  • nameDefaultUser Default user name prefix. Default: vdjviz

  • userManagementSystem Enable user management (admin) panel for users with admin rights Default: true

  • userManagementSystemAccounts Specifies the list of user accounts with predefined emails and passwords that will be granted admin rights. The email and password properties in application.conf should be used to specify their credentials.

  • db.default.url Points to the path that will be used to store H2 database file. Default value: ~/vdjviz/h2.db Standalone version uses H2 Database for handling metadata by default, if you want to change H2 to another DBMS please see the corresponding Play documentation section You can also use this database to manually modify user limits.

  • allowRegistration Show the Register button in login screen. Default: false

  • allowChangePasswords Show the Change Password button in login screen. Default: false

  • smtp.* SMTP server configuration. If you don't want to use registration features, you can leave smtp.* fields empty and generate default users.

vdjviz's People

Contributors

bvdmitri avatar matsen avatar mikessh 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

vdjviz's Issues

Fix tags

  • Add "edit tag" option
  • Smart tag placement
  • Fix typos

Cannot access VDJviz

I am having issues running the vdjviz.bat script in Windows.

Error message is

The input line is too long.
The syntax of the command is incorrect.

even though I am running it from C:\vdjviz-1.0.4\bin>vdjviz.bat.

What's more- I have tried the broswer version and it does not let me sign up! I give my email and I do not get an email for further instructions. I have tried two email addresses and checked junk folders too- nothing. Is there an error with the browser version?

How to start vdjviz: worked solution

I spent ~3wks googling almost 24/7...

Thanks to the following people/ideas/posts/suggestions/comments/solutions/questions/answers:
#44 (comment)
#43 (comment)
#43 (comment)
#41 (comment)
https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04
https://askubuntu.com/questions/175514/how-to-set-java-home-for-java
https://askubuntu.com/a/175519/754619
https://www.cyberciti.biz/faq/how-to-open-firewall-port-on-ubuntu-linux-12-04-14-04-lts/
https://stackoverflow.com/questions/25027891/play-framework-application-not-available-outside-host
https://stackoverflow.com/a/25028804/1009306
https://www.cyberciti.biz/faq/howto-configure-setup-firewall-with-ufw-on-ubuntu-linux/
https://ubuntu.com/server/docs/security-firewall
@Kaj-cyber, @nukaemon, @snajder-r, @xww52526, @mikessh, @bvdmitri

Host:
Edition: Windows 10 Home
Version: 21H2
OS build: 19044.1645

To do:
Install VirtualBox + VirtualBox Extension Pack (for external USB)
Pack: https://www.thewindowsclub.com/virtualbox-failed-to-attach-the-usb-device-to-the-virtual-machine
Install on VirtualBox: ubuntu-16.04.7-desktop-amd64.iso
https://releases.ubuntu.com/16.04.7/ubuntu-16.04.7-desktop-amd64.iso
Restart the Host

Start VirtualBox with Ubuntu-16.04. In Terminal:

sudo apt-get update
sudo apt-get install default-jdk
java -version # should see "1.8.0_292"

Done but didn't check whether it is necessary: Open nano editor:

sudo nano /etc/environment

Copy/paste the following lines at the end:

JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME

Exit nano by pressing Ctrl+X, then: Y, Enter. In Terminal:

. /etc/environment
echo $JAVA_HOME # should see: "/usr/lib/jvm/java-8-oracle"

Maybe it is not necessary:
Open ./application.conf file.
Change: "createDefaultUsers=false" (default) to "createDefaultUsers=true"

In Terminal:

./vdjviz-1.0.4/
bash ./bin/vdjviz -Dconfig.file=./conf/application.conf

Ignore: "OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0"
When one can see: "[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000" it means the server is started

In browser:

localhost:9000
email: [email protected]
pw: vdjviz1

Enjoy!

Update question

Hello,

Seems latest commit for vdjviz was Oct,2016. Is there any plan of releasing a new version?

I tried to install the stand-alone vdjviz on Mac & windows, but there were some java issues:
[info] play - database [default] connected at jdbc:h2:file:~/vdjviz/h2.db Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlRootElement at com.avaje.ebeaninternal.server.core.BootupClasses.isXmlBean(BootupClasses.java:425) at com.avaje.ebeaninternal.server.core.BootupClasses.isMatch(BootupClasses.java:329) at com.avaje.ebeaninternal.server.core.BootupClasses.process(BootupClasses.java:96) at com.avaje.ebeaninternal.server.core.BootupClasses.<init>(BootupClasses.java:73) at com.avaje.ebeaninternal.server.core.DefaultServerFactory.getBootupClasses1(DefaultServerFactory.java:322) at com.avaje.ebeaninternal.server.core.DefaultServerFactory.getBootupClasses(DefaultServerFactory.java:302) at com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:161) at com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:65) at com.avaje.ebean.EbeanServerFactory.create(EbeanServerFactory.java:58) at play.db.ebean.EbeanPlugin.onStart(EbeanPlugin.java:79) at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:88) at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:88) at scala.collection.immutable.List.foreach(List.scala:318) at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:88) at play.api.Play$$anonfun$start$1.apply(Play.scala:88) at play.api.Play$$anonfun$start$1.apply(Play.scala:88) at play.utils.Threads$.withContextClassLoader(Threads.scala:18) at play.api.Play$.start(Play.scala:87) at play.core.StaticApplication.<init>(ApplicationProvider.scala:52) at play.core.server.NettyServer$.createServer(NettyServer.scala:280) at play.core.server.NettyServer$$anonfun$main$3.apply(NettyServer.scala:316) at play.core.server.NettyServer$$anonfun$main$3.apply(NettyServer.scala:311) at scala.Option.map(Option.scala:145) at play.core.server.NettyServer$.main(NettyServer.scala:311) at play.core.server.NettyServer.main(NettyServer.scala) Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlRootElement at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496) ... 25 more
Any idea how to fix this error? Thanks!

Error creating account

[IllegalStateException: JSR-303 validated property 'email' does not have a corresponding accessor for data binding - check your DataBinder's configuration (bean property versus direct field access)]

case controllers_Users_saveNewUser10_route(params) => {
call { 
      controllers_Users_saveNewUser10_invoker.call(controllers.Users.saveNewUser())
  }
}

Stacktrace:

play.api.Application$$anon$1: Execution exception[[IllegalStateException: JSR-303 validated property 'password' does not have a corresponding accessor for data binding - check your DataBinder's configuration (bean property versus direct field access)]]
at play.api.Application$class.handleError(Application.scala:296) ~[play_2.10-2.3.4.jar:2.3.4]
at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.10-2.3.4.jar:2.3.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.10-2.3.4.jar:2.3.4]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.10-2.3.4.jar:2.3.4]
at scala.Option.map(Option.scala:145) [scala-library.jar:na]
Caused by: java.lang.IllegalStateException: JSR-303 validated property 'password' does not have a corresponding accessor for data binding - check your DataBinder's configuration (bean property versus direct field access)
at play.data.Form.bind(Form.java:349) ~[play-java_2.10-2.3.4.jar:2.3.4]
at play.data.Form.bindFromRequest(Form.java:221) ~[play-java_2.10-2.3.4.jar:2.3.4]
at controllers.Users.saveNewUser(Users.java:29) ~[classes/:2.3.4]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$11$$anonfun$apply$11.apply(routes_routing.scala:223) ~[classes/:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$11$$anonfun$apply$11.apply(routes_routing.scala:223) ~[classes/:na]
Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'password' of bean class [models.User]: Bean property 'password' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:725) ~[spring-beans-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:716) ~[spring-beans-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99) ~[spring-context-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at org.springframework.validation.AbstractBindingResult.rejectValue(AbstractBindingResult.java:108) ~[spring-context-4.0.3.RELEASE.jar:4.0.3.RELEASE]
at play.data.Form.bind(Form.java:343) ~[play-java_2.10-2.3.4.jar:2.3.4]

SQL Errors when uploading files

Hi,

I installed VDJVIZ on Ubuntu. I'm logging in with the default user, and then I'm trying to upload new samples.
When I do so, I get an error "Error while uploading new file" and on the console I see:

javax.persistence.PersistenceException: ERROR executing DML bindLog[] error[Check constraint violation: "CK_USER_FILE_SOFTWARE_TYPE: (SOFTWARE_TYPE IN(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))"; SQL statement:\n insert into user_file (id, file_name, unique_name, clonotypes_count, sample_count, software_type, software_type_name, file_path, file_dir_path, file_extension, render_state, created_at, account_id) values (?,?,?,?,?,?,?,?,?,?,?,?,?) [23513-172]]
	at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:97)
	at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:57)
	at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeInsertBean(DefaultPersistExecute.java:66)
	at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:448)
	at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:478)
	at com.avaje.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:335)
	at com.avaje.ebeaninternal.server.persist.DefaultPersister.saveEnhanced(DefaultPersister.java:310)
	at com.avaje.ebeaninternal.server.persist.DefaultPersister.saveRecurse(DefaultPersister.java:280)
	at com.avaje.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:248)
	at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1568)
	at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1558)
	at com.avaje.ebean.Ebean.save(Ebean.java:453)
	at controllers.AccountAPI$1.apply(AccountAPI.java:156)
	at controllers.AccountAPI$1.apply(AccountAPI.java:63)
	at play.core.j.FPromiseHelper$$anonfun$promise$2.apply(FPromiseHelper.scala:34)
	at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
	at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
	at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:37)
	at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42)
	at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
	at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
	at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
	at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
	at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: org.h2.jdbc.JdbcSQLException: Check constraint violation: "CK_USER_FILE_SOFTWARE_TYPE: (SOFTWARE_TYPE IN(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))"; SQL statement:
insert into user_file (id, file_name, unique_name, clonotypes_count, sample_count, software_type, software_type_name, file_path, file_dir_path, file_extension, render_state, created_at, account_id) values (?,?,?,?,?,?,?,?,?,?,?,?,?) [23513-172]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
	at org.h2.message.DbException.get(DbException.java:169)
	at org.h2.message.DbException.get(DbException.java:146)
	at org.h2.constraint.ConstraintCheck.checkRow(ConstraintCheck.java:98)
	at org.h2.table.Table.fireConstraints(Table.java:880)
	at org.h2.table.Table.fireBeforeRow(Table.java:870)
	at org.h2.command.dml.Insert.insertRows(Insert.java:123)
	at org.h2.command.dml.Insert.update(Insert.java:86)
	at org.h2.command.CommandContainer.update(CommandContainer.java:79)
	at org.h2.command.Command.executeUpdate(Command.java:235)
	at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:154)
	at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:140)
	at com.jolbox.bonecp.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:205)
	at com.avaje.ebeaninternal.server.type.DataBind.executeUpdate(DataBind.java:55)
	at com.avaje.ebeaninternal.server.persist.dml.InsertHandler.execute(InsertHandler.java:134)
	at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:86)
	... 23 more
[info] c.v.com - User [email protected]: Error while rendering sample Sample_C

The config file is unchanged. I'm starting the server with:

./vdjviz -Dconfig.file=../conf/application.conf -Dhttp.port=9000 -Djava.net.preferIPv4Stack=true

readme.md needs to be updated?

Hi,
I download via git clone but I can see no sign of the bin directory that is referenced in the README as a result, I can't install!
best wishes
Jake

error when uploading clonotype file from mixcr4.2.0

Hi,

mixcr3.0.13 generates clonotype txt files with the following columns (cloneCount, cloneFraction, etc.):

cloneId	cloneCount	cloneFraction	targetSequences	targetQualities	allVHitsWithScore	allDHitsWithScore	allJHitsWithScore	allCHitsWithScore	allVAlignments	allDAlignments	allJAlignments	allCAlignments	nSeqFR1	minQualFR1	nSeqCDR1	minQualCDR1	nSeqFR2	minQualFR2	nSeqCDR2	minQualCDR2	nSeqFR3	minQualFR3	nSeqCDR3	minQualCDR3	nSeqFR4	minQualFR4	aaSeqFR1	aaSeqCDR1	aaSeqFR2	aaSeqCDR2	aaSeqFR3	aaSeqCDR3	aaSeqFR4	refPoints
0	1091	0.0050558882	TGTGCTTGTCAAGCTCATTTACTCACGGGAGGAGGAAACAAACTCACCTTT	[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[	TRAV38-2DV8*00(811.6)		TRAJ10*00(314.4)	TRAC*00(89.6)	433|440|469|0|7||35.0		21|53|84|19|51||160.0												TGTGCTTGTCAAGCTCATTTACTCACGGGAGGAGGAAACAAACTCACCTTT	58								CACQAHLLTGGGNKLTF		:::::::::0:-9:7:::::19:-1:51:::

mixcr4.2.0 generates clonotype tsv files with the following columns (readCount, readFraction, etc.):

cloneId	readCount	readFraction	uniqueMoleculeCount	uniqueMoleculeFraction	targetSequences	targetQualities	allVHitsWithScore	allDHitsWithScore	allJHitsWithScore	allCHitsWithScore	allVAlignments	allDAlignments	allJAlignments	allCAlignments	nSeqCDR3	minQualCDR3	aaSeqCDR3	refPoints
0	14506	0.0025839094	283	0.0025100446	TGTGCTCTGAGTGAGGTAAACGACTACAAGCTCAGCTTT	NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN	TRAV19*00(825.4)		TRAJ20*00(259.3)	TRAC*00(89.7)	432|448|469|0|16||80.0		25|46|77|18|39||105.0		TGTGCTCTGAGTGAGGTAAACGACTACAAGCTCAGCTTT	45	CALSEVNDYKLSF	:::::::::0:-1:16:::::18:-5:39:::

it seems it does not allow to upload mixcr4 clonotype files in VDJViz

Clonetype and file size limit setting ignored in application

After a bit of playing I've got your server up and running, but couldn't get any files to load. The reason was that they were being rejected by the clonetype limit as they had >100000 clonetypes in them or were too large.

There is an option to change this in the conf file, but that doesn't actually stop the file from being rejected, but it does change the error message so I get an error saying I need to load a file with less than 1,000,000 clonetypes (for example), but the log file says Loaded sample 2.A2-i129 with 540240 clonotypes. Even if you set the limit to 0 for unlimited I get an error saying you need less than 0 clonetypes. The same thing seems to be true of the file sizes - you don't get a specific report, but everything over the default size is rejected even if the conf file has been modified.

Common pages

50/50 About page
Contacts page
50/50 Bad browser page

Rarefaction bug

Plot is not re-calculated correctly when uploading two chunks of samples with different max size

input parsing error

Hi,

I converted mixcr input to vdjtools and tried uploading to browser but there is some parsing error.

Basically I did:
java -jar vdjtools-1.1.4/vdjtools-1.1.4.jar Convert -S MiXCR ${sample} convert
then took top 1000 lines and saved them as .txt file and tried uploading to browser.

Is there particular conversion I should perform to get my data into browser?

Thanks,
Rajesh

V/D/J annotation in tabular view fix

  • Disable annotation for V segment if vEnd is less 0, for J if jStart less 0 and for D if either dStart or dEnd less than 0.
  • Needed for correct visualization for new software types

Hide results bug

Hide button will not hide a "clonotype search" result panel when search returned no results.
Suggestion: hide button collapses all panels to small ones with number of found clonotypes (1,2,..) in header, for "nothing found" there should be 0

upload error

When I set up ready on Linux, I transfered to webpage to uoload my data exported from vdjtools, and the error occured. Could you help me to see what the problem is?
image

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.