Giter Club home page Giter Club logo

simple-torrent's Introduction

screenshot

Build Status

SimpleTorrent is a a self-hosted remote torrent client, written in Go (golang). Started torrents remotely, download sets of files on the local disk of the server, which are then retrievable or streamable via HTTP.

This project is a re-branded fork of cloud-torrent by jpillora.

Features

  • Individual file download control (1.1.3+)
  • Run external program on tasks completion: DoneCmd
  • Stops task when seeding ratio reached: SeedRatio
  • Download/Upload speed limiter: UploadRate/DownloadRate
  • Detailed transfer stats in web UI.
  • Torrent Watcher
  • K8s/docker health-check endpoint /healthz
  • Extra trackers from external source
  • Protocol Handler to magnet:
  • Magnet RSS subscribing supported
  • Flexible config file accepts multiple formats (.json/.yaml/.toml) (by spf13/Viper) (1.2.0+)

Also:

  • Single binary
  • Cross platform
  • Embedded torrent search
  • Real-time updates
  • Mobile-friendly
  • Fast content server
  • IPv6 out of the box
  • Updated torrent engine from anacrolix/torrent

Install

Binary

See the latest release or use the oneline script to do a quick install on a modern Linux machines.

bash <(wget -qO- https://git.io/simpletorrentqs)

The script installs a systemd unit (under scripts/cloud-torrent.service) as service. Read further intructions: Auth And Security

If hope to specify a version, just append the version number to the command.

bash <(wget -qO- https://git.io/simpletorrentqs) 1.3.3

Docker Docker Pulls

$ docker run -d -p 3000:3000 -v /path/to/my/downloads:/downloads -v /path/to/my/torrents:/torrents boypt/cloud-torrent

When running as a container, keep in mind:

  • You need also to expose your torrent incoming port (50007 by default) if you want to seed (-p 50007:50007). Also, you'll have to forward the port on your router.
  • Automatic port forwarding on your router via UPnP IGD will not work unless run in host mode (--net=host).

It's more practical to run docker-compose, see Wiki Page: DockerCompose

Source

Requirement

$ git clone https://github.com/boypt/simple-torrent.git
$ cd simple-torrent
$ ./scripts/make_release.sh

Usage

Commandline Options

See Wiki Command line Options

Configuration file

See Wiki Config File

Use with WEB servers (nginx/caddy)

See Wiki Behind WebServer (reverse proxying)

Credits

simple-torrent's People

Contributors

anacrolix avatar boypt avatar cavebeat avatar cjim8889 avatar jonquach avatar jpillora avatar kurumiserori avatar pataquets avatar supriyo-biswas avatar ti avatar yoonsio 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

simple-torrent's Issues

[error looking up "router.silotis.us:6881"] and computer network congestion!

Error after adding BT:

2019/10/04 23:34:58 error looking up "router.silotis.us:6881": lookup router.silotis.us: no such host

I didn't add this Trackers.

At the same time, my computer network has become very stuck, but the network card does not have a lot of traffic!

The download speed is fluctuating, either 0-30KB/s or 5MB/s+.

  • When the file download speed is 0-30KB/s, the computer network is congested.
  • When the file download speed is 5MB/s or more, the computer network returns to normal.

PC: Windows 10 1903

error accepting connection

Every 50ms this error is logged :

...
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
2019-09-13 12:14:18 client.go:440: error accepting connection: read udp4 0.0.0.0:50007: wsarecvfrom: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself.
...

能加上连接节点信息吗?

比较简单易用的BT客户端(不提那种麻烦的客户端)比如FDM,他会显示哪些节点连上了你,显示速率,ip,客户端识别符,连接状态之类的,不显示节点的话,有时候都不知道是谁连接上了你,我都不知道我做种成功了没……
然后从网站搜索bt资源那个功能,发起https请求的话要用系统带的CA证书吗?还是直接用Go的?
另外就是本地化不做一下吗?

Free disk space is incorrect while running on docker in macOS

Issue description

I am running simple torrent on macOS with docker.
Simple torrent web UI shows I have 19.4 Terabytes of free disk space, in reality I have only few Gigabytes.

image

By running the df command inside the container, it also shows the correct free disk space.

Filesystem           1K-blocks      Used Available Use% Mounted on
overlay               65792556  10135000  52285780  16% /
tmpfs                    65536         0     65536   0% /dev
tmpfs                  2021240         0   2021240   0% /sys/fs/cgroup
shm                      65536         0     65536   0% /dev/shm
osxfs                487712924 413744756  70123524  86% /torrents
osxfs                487712924 413744756  70123524  86% /downloads
/dev/sda1             65792556  10135000  52285780  16% /etc/resolv.conf
/dev/sda1             65792556  10135000  52285780  16% /etc/hostname
/dev/sda1             65792556  10135000  52285780  16% /etc/hosts
tmpfs                  2021240         0   2021240   0% /proc/acpi
tmpfs                    65536         0     65536   0% /proc/kcore
tmpfs                    65536         0     65536   0% /proc/keys
tmpfs                    65536         0     65536   0% /proc/timer_list
tmpfs                    65536         0     65536   0% /proc/sched_debug
tmpfs                  2021240         0   2021240   0% /sys/firmware

Steps to reproduce the issue

simple-torrent version: latest on docker pull (version 1.0.17 - Go 1.13)
macOS version: 10.14.6
docker desktop version: 2.1.0.2

What's the expected result?

The correct Free disk space is shown.

What's the actual result?

A wrong (huge) amount of free disk space is display.

image

Can't install from Source

Hi. i want install from source using golang-go but i got error this.

main.go:7:2: cannot find package "github.com/jpillora/opts" in any of: /usr/lib/go-1.10/src/github.com/jpillora/opts (from $GOROOT) /root/go/src/github.com/jpillora/opts (from $GOPATH) gzip: cloud-torrent_linux_amd64: No such file or directory

Auto update from the UI

Update related settings/features would be good such as :

  • Automatic updates / OFF or ON
  • Update checks interval
  • Auto update "only if idle" or "instantly" by pausing the downloading/seeding torrents and resuming after finishing
  • Box with info about new features / fixes / changes

It would be a useful feature since it's hard to keep up with the constant updates.

Known Bugs

  • Files listed in Download may be duplicated during task initating.[ since 1.0.16 user can collapse the section and expand again to refresh display] [fixed v1.2.5]

  • changes to config in web UI may not success, if config.json can't be written.[ since 1.0.16 a write error will show up on web UI]

  • Windows: program may keep flushing errors about wsarecvfrom as mentioned at #16 , this is a upstream problem while program still works. Set MuteEngineLog option to hide such logs.

Put ads banner on html.

Hi. i want use my ads banner on simple-torrent source. after go build is work fine in directory but if i move file cloud-torrent to /usr/local/bin/ and command cloud-torrent my ads banner not showing

add a support for private tracker & ability to resume when downloading via IDM

may i know wether this simple torrent only support for public tracker?

i can download from private tracker but i cannot seed them .

turning on "enable seeding" and set ratio to 1 also didnt work.

====================
if i download multiple files via Internet Download Manager, i cannot resume the download session from where it left if something bad happened like my connection went down suddenly.

Fix for torrentz2.eu

For torrentz2 support, I see in your gist:

"torrentz2": {
    "name": "Z2",
    "url": "https://torrentz2.eu/search?f={{query}}&p={{page:1}}",
    "list": "div.results dl",
    "result": {
      "name": "dt a",
      "url": [
        "dt a",
        "@href"
      ],
      "path": [
        "dt a",
        "@href"
      ],
      "size": "dd span:nth-child(3)"
    }
  },

This is broken, probably due to the page number. The first page is page 0, not page 1. Below fix also adds support for seeds and peers.

Please also change the name from Z2 to Torrentz2 as Z2 is extremely unclear and that's perfectly unnecessary.

"torrentz2": {
    "name": "Torrentz2",
    "url": "https://torrentz2.eu/search?f={{query}}&p={{page:0}}",
    "list": "div.results dl",
    "result": {
      "name": "dt a",
      "url": [
        "dt a",
        "@href"
      ],
      "path": [
        "dt a",
        "@href"
      ],
      "size": "dd span:nth-child(3)",
      "seeds": "dd span:nth-child(4)",
      "peers": "dd span:nth-child(5)"
    }
  },

A pull request would be easier, but that's not possible for your gist (see #30), so a repo file would be preferable.

Thanks!

Slow speed performance

Slow performance speed,
Same file and trackerlist,

Multiple i try different torrent it seem slow

Example
Simple torrent around 4-7MB
Another bot average 8-20MB


Compare

Another leech bot

Slow download

I have tested many torrents especially Linux ISO, but the download can only peak at 1MB/s.
I have tried adding the same torrents on qBittorrent and Transmission and I got a lot faster speed. I got more than 20MB/s for Ubuntu ISO.

doneCmd not working

Hi boypt.

I was experimenting with the doneCmd option inside the json file but I think I cound't make it run.
Here is what I have done:
1.- I created a simple script to log the variables described in https://github.com/boypt/simple-torrent/wiki/DoneCmdUsage

#!/bin/bash

echo $CLD_DIR >> ./done_cmd.log
echo $CLD_PATH >> ./done_cmd.log
echo $CLD_SIZE >> ./done_cmd.log
echo $CLD_TYPE >> ./done_cmd.log

2.- I change the doneCmd value in my cloud-torrent.json file

"DoneCmd": "/home/myuser/my-logger.sh",

But when I add a torrent and then it finishes I don't see anything in my log, it's like the script is not being triggered by simple-torrent. Am I doing something wrong ?

So, would you put an example of how to use the doneCmd option ? I would really appreciate that.

Thanks a lot in advance

Rebrand?

Great project! I’d use a different software name based on the original software, if I were you. This is probably the best fork around, but I had to look down the (incredibly large) network tree of the original repository to find it. If you rebrand it, search engines and those ‘alternatives to’ websites will index it as separate software. Just like OpenOffice/LibreOffice and ownCloud/Nextcloud.

Thanks for maintaining it so very, very well. Keep up the good work!

Update docker latest tag to current version

Thank you very much for this client. It works great!
The one thing I noticed is that the docker run command doesn't load the newest version of the client.

That seems to be because the latest docker tag is set for a version that is a month old (1.0.7 as far as I can tell). Manually specifying the version worked, but just wanted to point the out of date latest tag out.

Not sure how you create new docker tag releases now, but you should be able to retag the latest to the newest version with the same command.

Remove torrent after DoneCmd

It would be great if could add something in DoneCmd that tells SimpleTorrent to remove the torrent. This way, it would be safe to move the torrent data away from the downloads folder instead of creating a copy. Also this would allow for an automated cleanup in the DoneCmd script.

I got multiple ideas on how to implement this:

  • Add a CLD_DELETE_MARKER variable pointing to a non-existing path that the DoneCmd can create (touch) to mark the torrent for deletion after executing DoneCmd
  • Add a CLD_TORRENT_ID variable containing the internal ID of the torrent file so one can do REST calls in the DoneCmd script. This is the easiest way to implement it but it will break once you add protection for XSRF or Authentication.
  • Add a control socket (unix socket) where control commands can be sent. This solution is far more powerful than the previous solutions but requires more work.

I would add a pull request, but it is your project and I don't want to make the decision. Also I am not a go developer, so I could only implement option 1 and 2 on my own.

magnet handler does not respect relative paths

First of all, thank you for maintaining this wonderful project :)

simple-torrent adds a magnet links handler which uses the URL /api/magnet. However, this breaks when you use a relative path, i.e. if I have it installed under /torrent/api/magnet, the handler that's installed breaks because it still sends you to /api/magnet.

Can you please look into this issue?

Thanks in advance.

crash on openwrt(arm)

2020/02/27 04:08:58 http: panic serving 192.168.2.196:60407: runtime error: invalid memory address or nil pointer dereference
goroutine 607 [running]:
net/http.(*conn).serve.func1(0x3142540)
        E:/Software/Go/src/net/http/server.go:1767 +0xf0
panic(0x6dbb00, 0xeb94e8)
        E:/Software/Go/src/runtime/panic.go:679 +0x194
runtime/internal/atomic.goLoad64(0x306cce4, 0x0, 0x0)
        E:/Software/Go/src/runtime/internal/atomic/atomic_arm.go:131 +0x1c
github.com/anacrolix/torrent.(*Count).Int64(...)
        C:/Users/xspee/go/pkg/mod/github.com/anacrolix/[email protected]/conn_stats.go:61
github.com/jpillora/cloud-torrent/engine.(*Torrent).updateLoaded(0x306cc60, 0x323e800)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/torrent.go:90 +0x334
github.com/jpillora/cloud-torrent/engine.(*Torrent).Update(0x306cc60, 0x323e800)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/torrent.go:54 +0x1a8
github.com/jpillora/cloud-torrent/engine.(*Engine).upsertTorrent(0x30989a0, 0x323e800, 0xc182)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/engine.go:296 +0x164
github.com/jpillora/cloud-torrent/engine.(*Engine).addTorrentTask(0x30989a0, 0x323e800, 0x323e800, 0x1)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/engine.go:184 +0x64
github.com/jpillora/cloud-torrent/engine.(*Engine).NewTorrentBySpec(0x30989a0, 0x3161280, 0x3143140, 0x0)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/engine.go:163 +0x7c
github.com/jpillora/cloud-torrent/server.(*Server).apiPOST(0x30758c0, 0x3079280, 0x0, 0x0)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/server/server_api.go:131 +0xae0
github.com/jpillora/cloud-torrent/server.(*Server).restAPIhandle(0x30758c0, 0x87ea30, 0x314aa40, 0x3079280)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/server/server_http.go:57 +0x198
github.com/jpillora/cloud-torrent/server.(*Server).webHandle(0x30758c0, 0x87ea30, 0x314aa40, 0x3079280)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/server/server_http.go:43 +0x1bc
net/http.HandlerFunc.ServeHTTP(0x30f66a0, 0x87ea30, 0x314aa40, 0x3079280)
        E:/Software/Go/src/net/http/server.go:2007 +0x34
cloud-torrent/server/httpmiddleware.RealIP.func1(0x87ea30, 0x314aa40, 0x3079280)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/server/httpmiddleware/realip.go:34 +0x80
net/http.HandlerFunc.ServeHTTP(0x323af10, 0x87ea30, 0x314aa40, 0x3079280)
        E:/Software/Go/src/net/http/server.go:2007 +0x34
cloud-torrent/server/httpmiddleware.Liveness.func1(0x87ea30, 0x314aa40, 0x3079280)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/server/httpmiddleware/liveness.go:15 +0x50
net/http.HandlerFunc.ServeHTTP(0x323af20, 0x87ea30, 0x314aa40, 0x3079280)
        E:/Software/Go/src/net/http/server.go:2007 +0x34
github.com/NYTimes/gziphandler.GzipHandlerWithOpts.func1.1(0x87e850, 0x32430e0, 0x3079280)
        C:/Users/xspee/go/pkg/mod/github.com/!n!y!times/[email protected]/gzip.go:336 +0x1c4
net/http.HandlerFunc.ServeHTTP(0x3346120, 0x87e850, 0x32430e0, 0x3079280)
        E:/Software/Go/src/net/http/server.go:2007 +0x34
net/http.serverHandler.ServeHTTP(0x3242090, 0x87e850, 0x32430e0, 0x3079280)
        E:/Software/Go/src/net/http/server.go:2802 +0x88
net/http.(*conn).serve(0x3142540, 0x87f5d0, 0x327d700)
        E:/Software/Go/src/net/http/server.go:1890 +0x7e0
created by net/http.(*Server).Serve
        E:/Software/Go/src/net/http/server.go:2928 +0x2e4
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x11ffc]

goroutine 38 [running]:
runtime/internal/atomic.goLoad64(0x306cce4, 0x0, 0x0)
        E:/Software/Go/src/runtime/internal/atomic/atomic_arm.go:131 +0x1c
github.com/anacrolix/torrent.(*Count).Int64(...)
        C:/Users/xspee/go/pkg/mod/github.com/anacrolix/[email protected]/conn_stats.go:61
github.com/jpillora/cloud-torrent/engine.(*Torrent).updateLoaded(0x306cc60, 0x323e800)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/torrent.go:90 +0x334
github.com/jpillora/cloud-torrent/engine.(*Torrent).Update(0x306cc60, 0x323e800)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/torrent.go:54 +0x1a8
github.com/jpillora/cloud-torrent/engine.(*Engine).upsertTorrent(0x30989a0, 0x323e800, 0x1)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/engine.go:296 +0x164
github.com/jpillora/cloud-torrent/engine.(*Engine).TaskRoutine(0x30989a0)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/engine/engine.go:221 +0x1bc
github.com/jpillora/cloud-torrent/server.(*Server).backgroundRoutines.func1(0x30758c0)
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/server/server_bg.go:36 +0x9c
created by github.com/jpillora/cloud-torrent/server.(*Server).backgroundRoutines
        C:/Users/xspee/go/src/github.com/boypt/simple-torrent/server/server_bg.go:20 +0x58

Plugins Development

There are a lot of features which can be developed based on this simple-cloud torrent server, some of them which have already been pointed out are :

  • execute command on finish - already developed as doneCMD.sh
  • telegram bot - currently only notification of complete, in future - add magnet from chat, get current download percentage, or already downloaded files, configure server etc.
  • dropbox, aws, google drive upload, SFTP etc...

All these features are not necessary for every one but only for a selected people, hence these can be developed as a list of plugins which can be added to the server selectively, so that it will be easier for people to contribute without reading the whole code of the server.

It will be helpful if you could create a example/sample plugin, based on which further plugins can be developed without modifying the core code of simple-torrent server.

For example this project syslog-ng has multiple modules which have been developed without modifying the code of main project.

[Feature] Watch a directory for torrents

Before all, thanks for giving a new start to this project,

A feature that i miss from rtorrent is the ability to watch a directory for new .torrent files and download them.

Does it sound feasible ?

Remove CORS restriction

Please allow cross site access. Especially to /api/ calls, or else browser based applications like browser-extensions can't work.

This can be achieved by editing server_http.go as demonstrated below.

40.	//api call
41.	if strings.HasPrefix(r.URL.Path, "/api/") {
		w.Header().Set("Access-Control-Allow-Origin", "*")   // add this
		w.Header().Set("Access-Control-Allow-Headers", "authorization") //add this

This will also solve the issue that I am having of not being able to read response using a browser-extension from remote simple-torrent server. ketankr9/cloud-torrent-extension#1 (comment)

Proposal: Adding a docker-compose.yml

version: '3.3'
services:
    cloud-torrent:
        ports:
            - '3000:3000'
        volumes:
            - '/path/to/my/downloads:/downloads'
            - '/path/to/my/torrents:/torrents'
            - '/path/to/my/config:/etc/cloud-torrent'
        image: boypt/cloud-torrent
        command: --auth username:password

[Enhancement] Add an /healtz endpoint

A good thing for containerized apps is to have an endpoint for checking if the app is alive.
The convention wants an endpoint /healtz witch returns a successful http code and an empty body.

More info here.

Note that this endpoint must be authentication free, even with --auth specified.

Multiple user with specific folder to download

Hi, first at all, thanks for this great script. Fyi, this is not a bugs. Just a general question.
is this simple torrent support multiple user ?
If yes, how to add user A on port 3001 with home directory based on their username ?
What command should I run ? Thanks.

NginX reverse proxy

I'm just gonna paste this working reverse proxy configuration for nginx just in case someone needs it.

location /ctorrent/ {
    proxy_pass http://127.0.0.1:3000/;
}

location /sync {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Connection '';
    proxy_http_version 1.1;
    chunked_transfer_encoding off;
    proxy_buffering off;
    proxy_cache off;
}

Replace ctorrent with any path you want. Credit to caddyserver/caddy#677 (comment)

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.