schlagmichdoch / pairdrop Goto Github PK
View Code? Open in Web Editor NEWPairDrop: Local file sharing in your browser. Inspired by Apple's AirDrop. Fork of Snapdrop.
Home Page: https://pairdrop.net
License: GNU General Public License v3.0
PairDrop: Local file sharing in your browser. Inspired by Apple's AirDrop. Fork of Snapdrop.
Home Page: https://pairdrop.net
License: GNU General Public License v3.0
Hey, first of all: GREAT PROJECT! I really wanted to see a pairing functionality on Snapdrop and it's really cool to see it implemented finally! I'm currently trying to figure out how it works and thought maybe it'd be nice for new people to see kind of how this all works. Could you create some kind of flow chart on how PairDrop works on a high level or explain it in text? I'd be really interested in learning it :)
share menu with Android not working
Steps to reproduce the behavior:
Expected behavior
both ways should work :-)
Smartphone (please complete the following information):
Self-Hosted
No
Self-Hosted Setup
Proxy: Nginx | Apache2
Deployment: docker run | docker-compose | npm run start:prod
Additional context
Add any other context about the problem here.
Hi there! My issue seems to be similar to #24 .. I successfully set PairDrop up on my server (via Nginx reverse proxy) according to the self-host docs and sharing files works fine. But as soon as I try to pair it says
No server connection. Retry in 5s...
The server is actually unreachable then for a few seconds before returning, when reloading the page immediately I get
An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.
If you are the system administrator of this resource then you should check the error log for details.
Faithfully yours, nginx.
In the browser console all I see is
WS: server disconnected [network.js:152:17](https://domain-redacted/scripts/network.js)
The docker logs show the following
pairdrop-node-1 | ----- Uncaught exception -----
pairdrop-node-1 | TypeError: Cannot read property 'getRandomValues' of undefined
pairdrop-node-1 | at PairDropServer.getRandomString (/home/node/app/index.js:222:30)
pairdrop-node-1 | at PairDropServer._onPairDeviceInitiate (/home/node/app/index.js:237:31)
pairdrop-node-1 | at PairDropServer._onMessage (/home/node/app/index.js:146:22)
pairdrop-node-1 | at WebSocket.<anonymous> (/home/node/app/index.js:106:51)
pairdrop-node-1 | at WebSocket.emit (events.js:375:28)
pairdrop-node-1 | at Receiver.receiverOnMessage (/home/node/app/node_modules/ws/lib/websocket.js:1180:20)
pairdrop-node-1 | at Receiver.emit (events.js:375:28)
pairdrop-node-1 | at Receiver.dataMessage (/home/node/app/node_modules/ws/lib/receiver.js:541:14)
pairdrop-node-1 | at Receiver.getData (/home/node/app/node_modules/ws/lib/receiver.js:459:17)
pairdrop-node-1 | at Receiver.startLoop (/home/node/app/node_modules/ws/lib/receiver.js:158:23)
Self-Hosted
Yes
Self-Hosted Setup
Proxy: Nginx
Deployment: docker-compose
Thanks for your work on PairDrop! Besides the pairing issue it is super reliable and makes our life sharing files between different devices/platforms easy!
edit:
For reference, here is my nginx configuration
upstream snapdrop {
server pairdrop-node-1:3000;
}
server {
listen 80;
server_name domain-redacted;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name domain-redacted;
ssl_certificate /etc/nginx/ssl/domain-redacted/cert.pem;
ssl_certificate_key /etc/nginx/ssl/domain-redacted/key.pem;
include /etc/nginx/includes/ssl.conf;
include /etc/nginx/includes/gzip.conf;
expires epoch;
location / {
proxy_connect_timeout 300;
proxy_pass http://snapdrop;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Forwarded-for $remote_addr;
}
location ~ /.well-known {
allow all;
root /var/www/html;
}
}
I use Mac Chrome to send a large file to iPhone Safari, and it shows that it has been successfully sent, but iPhone Safari does not give any prompts. Normally, the sharing menu will appear, but it does not appear.
Tried many times, all failed.
Sending small files works fine.
Hi,
I am running PairDrop on a subfolder instead of a subdomain using Traefik and redirect rules.
https://my.domain/pairdrop/
I got this working, by only removing the absolute path to the sound files in public/index.html
/sounds/blob.mp3 --> sounds/blob.mp3
Possible to change this in the code?
Thanks!
Describe the bug
Using Firefox on Android doesn't find other devices in the same network
Smartphone (please complete the following information):
Additional context
With Chrome on the same device it works
Describe the bug
A clear and concise description of what the bug is.
The npm-version seems too old.
When i look into docker logs, i get this notice on startup:
node_1 | npm notice
node_1 | npm notice New minor version of npm available! 9.3.1 -> 9.4.2
node_1 | npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.4.2>
node_1 | npm notice Run `npm install -g [email protected]` to update!
node_1 | npm notice
In docker-complose.yml ist this image: "node:lts-alpine"
Similar to the current pairing mode where it is able to identify devices across different networks.
An option to just temporary create a room, and for other devices to enter these rooms for file sharing would be great.
This is useful when sharing files between family members across networks, but since they are not my own devices, I would not want them to be paired.
P.S: Thank you for this amazing stable fork โ.
Describe the bug
When you receive a file on android, you get a pop up asking "close" or "share". Tapping "share" doesn't do anything.
Seems like it only happens with bigger files.
I tried sending an 80kb file and it worked fine. It didn't work with a 70mb video (video was mp4 h264 so the phone should be able to handle it no problem)
To Reproduce
Steps to reproduce the behavior:
Expected behavior
You should be able to open the share menu, or at least download the file.
To be fair, I'd rather have PairDrop download files by default, instead of opening the share menu.
Maybe we could have a pop up with 3 buttons: "Close / Share / Download"
Screenshots
If applicable, add screenshots to help explain your problem.
https://user-images.githubusercontent.com/23201434/221225226-f54035f3-b729-433a-9221-0223aa8e9bbb.mp4
In this recording, i got the "reconnecting" pop up and whatnot, but it doesn't seem related. I tried again and got the same issue.
Desktop (please complete the following information):
Smartphone (please complete the following information):
Self-Hosted
No
Additional context
I can upload the video file if needed, but seems reproducible with any bigger file
I saw that this feature is still being developed. But when Pairdop gets installed and it accessible from the android share menu it fails to load. "This site can't be reached" is but if you hit the hamburger menu and request it open in Chrome it opens up fine. The problem is when you do that you have to find and reselect the file you wanted to share in the first place.
Describe the bug
No server connection. Retry in 5s...
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Expect it to work even if "X-Forwarded-For" is not set. Or at least have the guide reflect that it wouldn't work at all without it.
Screenshots
https://ibb.co/VSFJYpZ
Desktop (please complete the following information):
Smartphone (please complete the following information):
Additional context
It also doesn't seem to work even with X-Forwarded-For set. Unless I got the synthax wrong for Caddy proxy, because there is only a description for Nginx and Apache unfortunately.
When opening PairDrop on multiple tabs on Firefox, it tries to restart the connection contiuously as the following error is thrown: Cannot set remote answer in state stable
.
This happens on Firefox but it is not an issue on Firefox Private Mode. Maybe because the tabs themselves are better sandboxed.
Interestingly this error is also thrown on the original Snapdrop.
With PairDrop the error is not thrown on Edge (chromium) but for Snapdrop it is, as every tab has the same peerId.
Can anyone test this on other browsers?
Describe the bug
When using the RTC_CONFIG env variable, I can't connect to anyone to send files.
It looks like it stems from where the file is read in index.js. It doesn't parse the JSON, so it has a bunch of escaped characters it doesn't know what to do with.
This is not how it looks when no RTC_CONFIG var is set.
I was able to fix the issue by wrapping the line:
Line 55 in b2f6a75
with:
? JSON.parse(fs.readFileSync(process.env.RTC_CONFIG, 'utf8'))
Using that new index.js with the RTC_CONFIG var, I get the expected results.
I was able to connect to my own STUN server and see other people on my network to send files to.
Extra Troubleshooting Steps:
I tried using the already made example rtc_config by setting RTC_CONFIG=/app/pairdrop/rtc_config_example.json
. It still had all the escaped newlines and quotes like in the top screenshot. So I don't think the issue was my rtc_config.json formatting.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Parse the JSON data.
Screenshots
See above
Desktop (please complete the following information):
Self-Hosted
Yes
Self-Hosted Setup
Proxy: Nginx
Deployment: docker-compose
๐ Just came across this project from a Reddit post. To make it clear, I am not a lawyer, just someone that often looks at license in open source.
Noticed that this is a fork of https://github.com/RobinLinus/snapdrop, but this project is licensed via an MIT license whereas RobinLinus/snapdrop is licensed via a GPL3 license.
You can't just change the license in this way, not without getting permission to do so from past contributors (or the copyright holders if ownership has been reassigned).
If you do not have such permission, your forked work would need to provide the same freedoms and requirements as provided in the GPLv3 license, For simplicity most people would keep the license the same.
Hey I just found out there's a domain available that would perfectly fit to this project. It's not expensive (about 20โฌ per year) and it has something to do with PairDrop / AirDrop. I don't want to write the domain here publicly because there will probably be bots or people around here waiting to claim such names. I don't think I can write direct messages here on GitHub, can't I? You could write me an email (my email is in my bio) or type your email here. Or you can reach out to me via Mastodon or Twitter, or of course any other communication channel you prefer :D
Describe the bug
The web app relies on the Clipboard API's readText
method. Unfortunately, this method is not available in Firefox except inside browser extensions.
Maybe instead of just failing it could display an autoselected textarea element to paste the text into?
To Reproduce
Steps to reproduce the behavior:
?base64zip=paste
appended in FirefoxExpected behavior
The base64-encoded file is loaded into Pairdrop
Desktop (please complete the following information):
Self-Hosted
Yes, but issue occurs on pairdrop.net as well.
Self-Hosted Setup
Proxy: Traefik 2.9
Deployment: docker compose/swarm
Additional context
None
It says in the readme: Change your display name permanently to easily differentiate your devices
I have tried multiple things like right-clicking, searching through the code, clicking on several button but I just don't know how to change the display name of the current device (or any paired device).
How do I change my display name and maybe also add this to the FAQ / readme, thank you!
This issue was created to fix the logo-alignment bug.
Hello,
Thank you for making PairDrop a better alternative to Snapdrop. I used to use Snapdrop to transfer files/photos between my Windows laptop and my Android phone (sometimes with my friends iphones, or with school's iMacs).
When using Snapdrop at my student apartment, devices are detected but the transfer doesn't want to start. PairDrop fixes this problem and seems to have the capability to transfer multiple files at a time (with zip I guess idk).
When the transfer taking too much time (for example with 40 photos/280mb total), Idk why but the connection is interrupted during the transfer (device quickly disappear and it shows a message "You are back online" or something).
Thank you in advance
Describe the bug
I installed the app "Snapdrop for Android" from fm-sys from F-Droid store in Version 1.11.3 and tried to set my PairDrop-Instance as Server. And i get the error "Seems not to be a snapdrop-instance"
Expected behavior
I want to set my Pairdrop-instance as backend for Snapdrop for Android
Screenshots
If applicable, add screenshots to help explain your problem.
Desktop (please complete the following information):
Smartphone (please complete the following information):
Additional context
On my other phone i set the same server, when i run the original snapdrop-container. Switching to PairDrop was no problem. I can use the app without problem with my own pairdrop-server (on the same domain as snapdrop before)
"For example: A and B send requests to C simultaneously (both file and message requests). On C side, only one dialog box is displayed because the dialog box is too big and covers the middle of the screen, causing one request from the requesting device to be missed."
Describe the bug
Sending 1 file from device A to device B I get two prompts on B to download
To Reproduce
Steps to reproduce the behaviour:
After clicking accept, the file gets downloaded and the second prompt pops up:
If I click download, it downloads the file a second time.
And the pop-up doesn't close, I can keep clicking on โdownloadโ
Expected behaviour
I expected to get one pop-up, accept the download and the pop-up goes away.
Screenshots
If applicable, add screenshots to help explain your problem.
Desktop (please complete the following information):
Smartphone (please complete the following information):
Self-Hosted
Yes
Self-Hosted Setup
Proxy: traefik
Deployment: docker-compose
Additional context
The same behaviour happens with laptop 2 laptop, it's not related to me using the phone for the firsts tests. Also, the exact same behaviour happens if I use pairdrop.net
When clicking the pair button, a QR Code image is shown in addition to a Pairing Code.
Can this QR Code image be larger so it is easier for a guest to scan with their phone? It is pretty small currently. This is true in Both the desktop web view or mobile view.
This improvement would make it much easier to quickly pair devices...and that's kinda the point of a tool like this. Quick/Easy/Secure access
Are there any plans to publish an image on Docker Hub?
Hi,
I "installed" Pairdrop in my Windows computer, but now every time I open a file, Pairdrop wants to be the default app to open that file type, and that is quite annoying.
Can you review that?
I managed to reproduce in a clean Windows Sandbox. See attached gif
I opened the file associations setting in Windows. Pairdrop has associated with .*
.
I removed it from the registry, but I did a search for its key (Chrome.2803962851) and it appears hundreds of times for different, odd, extensions, I can't remove them by hand
I uninstalled the app, and the issue disappears, but the registry entries remain.
Describe the bug
cancelling "clear all paired devices" still clears them
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Selecting cancel does cancel the clearing of paired devices.
Self-Hosted
Yes
I've followed the steps described in https://github.com/schlagmichdoch/PairDrop/blob/master/docs/how-to.md#send-files-directly-from-context-menu-on-windows
However I haven't managed to find a way to actually send a file. How can I trigger the send?
How can i set my own tun/stun/turn/sturn-Server for devices behind NAT?
I can not find any howtow for it...
Describe the bug
I get the error "Paired devices are not persistent." when attempting to link two instances that have been installed as a Chrome PWA.
In the Console it says: "This browser does not support IndexedDB. Paired devices will be gone after the browser is closed."
To Reproduce
Expected behavior
Desktop (please complete the following information):
Self-Hosted
Yes
Self-Hosted Setup
Proxy: Nginx Proxy Manager
Deployment: docker-compose
Hope I'm not missing something silly. Could it be possible to change the name of a device? I'd like to name devices on my own instance things like "my phone" or "my laptop" instead of "Magenta Beetle". Does this already exist and I've missed it somewhere?
I would like to translate this docker container into spanish. Actually i'm translator of another open projects here in github like stashapp.
If you implement template variables for text strings I will translate them into spanish.
Thanks for your hard work with this tool.
Faileador.
It doesn't show even if I want to share a link or a text. I use Microsoft Edge for Windows and Android.
Describe the bug
I just came across this software and really like it. It is pretty neat and seems to work flawlessly. However, when I tried to use it with my Vanadium browser on my GrapheneOS Android phone, I can't make any connections. When I try to connect by entering the 6-digit number, it says "Paird devices are not persistent".
When I tried with Firefox, the connection was made immediately.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
The other device should show up.
Desktop (please complete the following information):
Smartphone (please complete the following information):
Hi there,
i just set up PairDrop on my netcup.de Webhosting via node.js.
So far so good, but as soon as I try to use it, it either says "No server connection. Retry in 5s..." or "You need to be online to pair devices."
Any chance of creating an all-in-one docker container for this for ease of Self-Hosted deployment? I know Unraid users would appreciate it
if i open PairDrop on the PC (Windows) and Smartphone (iOS) i cant see each other, even if i pair the devices successfully.
I can send files to other Smartphones (iOS) and i can see my computer itself as seperate device if i open it in two browsers.
Sometimes if i wait 1-2 minutes i see the device but most times not at all. from time to time i get "You are back online." message at the smartphone.
if i opened snapdrop, both devices saw each other instantly. any idea what is causing this?
Describe the bug
When I pair 2 devices on different network the pairing seams to be working, but the device doesn't show on either browser
To Reproduce
Steps to reproduce the behavior:
Expected behavior
After pairing I expect to see device 1 on browser 2 and device 2 on browser 1
Desktop (please complete the following information):
Smartphone (please complete the following information):
Is there anyway you could add an authentication page that people would have to login to in order to share files? Below are a few things you could implement.
Love the project by the way!
Hi,
I wanted to try out PairDrop because I was having an issue with SnapDrop (and then I saw that PairDrop will also work across networks - which I think is a great improvement!): After a couple of seconds the "waves" (or whatever they are) stop moving and a file will not transfer (no error message).
Unfortunately, I am having the same issue with PairDrop.
Might this have to do with my running docker rootless?
Or do you maybe have another idea what the issue might be?
Thanks!
I use Chrome on an Android phone, and I have been unable to enter PairDrop normally (the name and other devices are not displayed), the problem persists after reinstalling Chrome, and the screenshot shows the error provided by the debugging tool.
The same browser can normally access and use the services built by Snapdrop. So the browser should be fine.
Oddly, another Android phone works fine.
Self-Hosted
No
Test whether PairDrop is compatible with the snapdrop android app: https://play.google.com/store/apps/details?id=com.fmsys.snapdrop
If yes, add it to the FAQ
I've two devices that are on a 10.0.0.0/24 subnet created by wireguard on pfsense. My main LAN net is not this. I can connect to the web-service and pair them, but unlike snapdrop (where I couldn't send anything), I can't even see the other device. Does this have to do with a firewall setting on nginx?
The behavior is exactly the same when I connect via. my reverse proxy, or directly via HTTPS and HTTP. I've tried combinations of Firefox and Edge on Windows 10 with Firefox and Safari on iOS 16.0.2
The only thing, what happens... every time using pairdrop from commandline, opens a new tab in firefox.
I run pairdrop from debian bullseye with firefox 102.8.0esr (64-Bit)
I don't know, if there is a possibility to reuse existing tab/window with this url, and only create a new one, if no pairdrop-tab/window exists.
Originally posted by @xundeenergie in #39 (comment)
This is a more general problem so I moved it to this issue to be discussed.
I like the idea of being able to reuse open tabs instead of opening another one, it should however still be possible to open PairDrop in multiple tabs.
There is a draft for focusing existing instances for PWAs using manifest.json:
"launch_handler": {
"client_mode": "focus-existing"
}
This is not implemented in many browsers and only works if the PWA is installed on the device with the default browser:
https://developer.mozilla.org/en-US/docs/Web/Manifest/launch_handler#browser_compatibility
Opening urls in existing tabs is not per se possible
So I think about letting the tabs communicate to each other to find out whether another tab is already open and if yes, load the url there and close the new tab.
Tabs are indeed able to communicate with each other using a modern API: https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API
Possible Workflow:
--use-existing-tab
/ -u
)?focus_existing=true
window.close()
@xundenergie Do you think this would be sensible?
Describe the bug
Simply opening https://pairdrop.net causes about 50% CPU load in Firefox. Or, in other terms: +30W CPU power consumption and +7W iGPU power consumption.
In MS Edge it's less severe with "only" ~10% additional CPU load (resulting in +10W CPU and + 1.5W GPU power consumption), but still more than enough to make the fans ramp up - and much more than I'd expect.
Expected behavior
No excessive CPU load.
Screenshots
Note: Both the jumps in CPU and GPU load come from opening PairDrop. The high network load is unrelated.
Same test with Microsoft Edge. Less severe but still noticeable CPU load. GPU load looks similar, but according to CoreTemp it's much less significant, too.
Desktop (please complete the following information):
Self-Hosted
No
Additional context
I'm pretty sure this wasn't an issue a few days ago - or at least not as much of an issue. I remember using it to transfer some pictures to my computer and I'm pretty sure the fans did not ramp up that day. Unfortunately I can't remember when exactly that was.
Opening the page in a private window does not solve the issue.
N.B. In the details below
mydomain.com
is a placeholder for the actual domain I'm using, which I prefer to keep private
Sorry to raise this as a bug, since it's more likely my ignorance on some part of the setup. I'm trying to set up a selfhosted PairDrop instance. I have read host-your-own.md and combed through the Issues but I can't figure this out.
v1.4.4-ls13
)localhost:8081
)coturn
for my own STUN serverstunclient stun.mydomain.com 3478
All of that seems to work fine!
I then prepared the PairDrop docker image with the following:
docker create \
--name=pairdrop \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=America/New_York \
-e RATE_LIMIT=true \
-e RTC_CONFIG="rtc_config.json" \
-e WS_FALLBACK=true \
-p 127.0.0.1:8081:3000 \
-v pairdrop:/app \
--restart unless-stopped \
lscr.io/linuxserver/pairdrop:latest
I created my custom rtc_config.json
via:
cd /var/snap/docker/common/var-lib-docker/volumes/pairdrop/_data/pairdrop
cat <<EOF >rtc_config.json
{
"sdpSemantics": "unified-plan",
"iceServers": [
{
"urls": "stun:stun.mydomain.com:3478"
}
]
}
EOF
And finally, start the PairDrop container and tail the logs:
docker start pairdrop && docker logs -f pairdrop
It all opens and runs fine (with the exception of a node error about not being able to write to /root/.npm/_logs
, which I believe is totally unrelated, but the output is below anyway)
BUT, upon visiting the page (drop.mydomain.com) no devices are seeing each other. It doesn't matter whether I'm accessing from desktop browser (Chrome, Safari) or mobile device, 4G LTE network or over WiFi/Ethernet.
I've tried it also with WS_FALLBACK=false
, as well as with and without the custom RTC_CONFIG
. No differences noted.
I opened the Chrome devtools console and don't see any errors there.
If I manually pair the devices with a pairing code, everything works fine. It's just the autodiscovery that's broken for me. Any help would be wonderfully appreciated ๐
docker logs -f pairdrop
belowpairdrop
[migrations] started
[migrations] no migrations found
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโ โโโโโโโโโโโ โโโโโโโ
โโโ โโโโโโโโโโโโโโโโโโโโ
โโโ โโโโโโโโโโโโโโ โโโ
โโโ โโโโโโโโโโโโโโ โโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโ โโโโโโโ
Brought to you by linuxserver.io
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
To support the app dev(s) visit:
PairDrop: https://www.buymeacoffee.com/pairdrop
To support LSIO projects visit:
https://www.linuxserver.io/donate/
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
GID/UID
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
User UID: 1000
User GID: 1000
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[custom-init] No custom files found, skipping...
npm WARN logfile Error: EACCES: permission denied, scandir '/root/.npm/_logs'
npm WARN logfile error cleaning log files [Error: EACCES: permission denied, scandir '/root/.npm/_logs'] {
npm WARN logfile errno: -13,
npm WARN logfile code: 'EACCES',
npm WARN logfile syscall: 'scandir',
npm WARN logfile path: '/root/.npm/_logs'
npm WARN logfile }
> [email protected] start
> node index.js
PairDrop is running on port 3000
[ls.io-init] done.
My own device name is not visible on Firefox for Android. See screenshot. It is possible to work-around the issue by turning on "Desktop site", but that makes the site hard to read or use.
Smartphone (please complete the following information):
Self-Hosted
No
Since this is less secure and traffic passes through the server (if I understood your warning correctly) it would be nice to see a warning when this feature is set OR, even more awesome, only if it is being used.
Attempting to transfer a file between clients is unimaginably slow
Steps to reproduce the behavior:
Expected behavior
I expect the speed of the connection between the two devices
Desktop (please complete the following information):
Self-Hosted
Both self-hosted and Pairdrop official site
Self-Hosted Setup
Proxy: Nginx
Deployment: Unraid
Additional context
Add any other context about the problem here.
Is it possible to send a file/text to pairdrop from commandline?
something like
cat image.txt | pairdrop
or
pairdrop image.png [picture.jpg...]
and a browser opens with the connected devices an i can select a device to send to...
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.