GithubHelp home page GithubHelp logo

gujjwal00 / avnc Goto Github PK

View Code? Open in Web Editor NEW
517.0 13.0 50.0 2.5 MB

VNC Client for Android

License: GNU General Public License v3.0

CMake 0.53% Kotlin 95.60% C++ 2.62% C 1.26%
android vnc vnc-client remote-desktop android-application kotlin

avnc's Introduction

AVNC Banner

AVNC is a VNC client for Android.


Features

  • Material Design (with Dark theme)
  • Configurable gestures
  • Tight encoding
  • Virtual Keys
  • Picture-in-Picture mode
  • View-only mode
  • Zeroconf Server Discovery
  • TLS support (AnonTLS, VeNCrypt)
  • SSH tunnel (VNC over SSH)
  • Import/Export servers
  • VNC Repeater support
  • Clipboard Sync with server

Get it on F-Droid Get it on Play Store

Screenshots

Development

Tools required:

  • Git
  • Android Studio
  • Android SDK
  • NDK (with CMake)

To get started, simply clone the repo and initialize submodules:

git clone https://github.com/gujjwal00/avnc.git
cd avnc
git submodule update --init --depth 1

Now you can import the project in Android Studio, or build it directly from terminal.

Read Architecture.kt (preferably in Android Studio) to know more about the code.

You can translate AVNC on Weblate.

Translation status

avnc's People

Contributors

atalanttore avatar babaric-dev avatar biswa96 avatar comradekingu avatar eshagh79 avatar fabriei avatar felixonmars avatar gujjwal00 avatar motiwalam avatar personalizedrefrigerator avatar poussinou avatar rajasekaran86 avatar tuanpham-dev avatar weblate avatar wwj402 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

avnc's Issues

Intermittent remote cursor

Hello,

I have noticed that the remote cursor disappears and reappears randomly when using the client. If the mouse is moved on the remote machine, the cursor appears all the time as normal.

However, even though the remote cursor disappears, the touch points are still correct and I can see on the remote machine monitor that it is actually moving correctly.

I have tried enabling mouse keys and I'm on the local LAN so bandwidth wouldn't be an issue which didn't make a difference.

TightVNC server 2.8.63 for Windows
Windows 10

Thank you

Is this a bug?

Hello again my friend @gujjwal00 . I was testing the function of controlling the cursor via touch, however, I could not scroll the content using two fingers. Regardless of the relationship setting, the two fingers zoom in or out of the remote server area. Follow the video demonstrating. Hugs

Screen_Recording_20220205-215830_AVNC.mp4

How do I translate AVNC?

Hello,
I use your program and thank you for making this great software.
I would like to contribute to the translation of this program into my own language, how can I do this?
Do you use a translation service like weblate or transifex? Or I have to send the translations to this repository.
Good luck

Request: differentiate/increase tolerance between "Long Press" and "Drag (Long Press then Swipe)"

Hello again,

Under the input settings, I'm trying to use:

  1. "Long Press" to right click and
  2. "Drag (Long Press then Swipe)" to drag remote content.

Unfortunately, changing the Drag setting causes
me to be unable to perform a long press. I'm guessing that when I attempt a long press, my fingers can't stay still long enough so Drag gets triggered instead of just Long Press.

Can there please be an increased tolerance (whether a setting or just baked into the app) to allow both long press and drag to be used? For example, maybe if X and Y of the cursor hasn't changed by more than ~5 pixels in 500 ms then Long Press, Drag if otherwise?

Button to show keyboard

I don't see a way to show the keyboard, but I see one in your screenshots. How do I get the keyboard show?

Samsung, Android 11

Translation error to Portuguese Brazil

Hello my friend @gujjwal00 . I've already made some suggestions on the translation site, but I don't know how it works. Here are some suggestions for errors and incomplete translations! I'm glad to be able to help with your magnificent app.

Screenshot_20220102-193448_AVNC

Follow System Theme = Seguir Tema do Sistema
Dark = Modo Escuro
Light = Modo Claro

Screenshot_20220102-193501_AVNC

Start = Início
End = Final

Screenshot_20220102-193521_AVNC

In Brazilian Portuguese we do not have an equivalent term for "Picture-in-Picture" so they are used the same in English and we do not translate the expression. So the correct one is "Picture-in-Picture" and not "Picture-in-Picture".

Screenshot_20220102-193547_AVNC

Hide Local (Android) Cursor = Ocultar Cursor do Android

Screenshot_20220102-193606_AVNC

Clear = Limpar

Screenshot_20220102-215547_AVNC.jpg

Full Immersive mode = Modo totalmente imersivo
Hides all system Bars... = Oculta todas as barras do sistema no modo tela cheia

Crash when clicking copy file

As the title, I was kicked out to home screen when I was trying to copy a file. I think this bug related to clipboard sync feature. I think it should only sync when clipboard is text format.

Fingerprint unlock

Hi @gujjwal00 ,

Question: Since fingerprint auth is already a part of the app for server export, is it on the roadmap to use fingerprint auth for opening the app?

Donation link

Hello,

Thank you for the great VNC client app... I love the VNC/SSH integration. I'm using it with TightVNC & OpenSSH.

I looked for a donation link on F-Droid, the app itself, and here on GitHub and couldn't find a donation link. I always try to "buy a coffee" as a thank you and to help development.

Key up events for modifier keys are not sent on exit

The virtual keyboard sends the keydown and keyup events for Shift, Ctrl, and Alt separately.

This makes it possible for a user to send the keydown event for a modifier and then exit before sending the keyup.

On my computer (KDE neon 5.22, X server 1.20.9, kernel 5.4.0-77-generic), this results in all input events being handled as if those modifier keys were pressed. I can only fix it by manually sending the keyup event for the correct modifier key.

I have created a pull request that solves this by dispatching the keyup events for Shift_R, Control_R, and Alt_R in VncActivity.onStop.

Copy/Paste clipboard only works 1 way Linux to Android

On bVNC, I can copy and paste bidirectionally from client (Android 12) and host (Debian 10).

Om AVNC, I can copy only from host (Debian 10) to client (Android 12). Sometimes, rarely, it will work both ways for just an instant.

Setup:
Debian 10 running on proot on top of termux on Android 12 with tigervnc 1.9.0

Steps to reproduce
(I haven't tested outside of proot)

  1. Install Termux from F-Droid
  2. Install Debian 10 (or Ubuntu 20) using Andronix (or proot-distro, but I used Andronix)
  3. Make sure you are using tigerVNC - Andronix will set this all up for you
  4. Launch your VNC server
  5. Connect with bVNC and try copying and pasting between client and host - all works
  6. Connect with AVNC and trying copying and pasting between client and host - only works from Linux to Android

This is my xstartup

#!/bin/bash
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
export PULSE_SERVER=127.0.0.1
touch $HOME/.Xauthority
export XAUTHORITY=$HOME/.Xauthority
vncconfig SendPrimary=0
echo $$ > /tmp/xsession.pid
. $HOME/.xsession

vnconfig & was ran and the proper settings are set.

What is super weird is that if I check a box in the VNC config window, the clipboard from Android will update the clipboard in Linux, but only once. Trying copy/paste again from Android to Linux and it wont work. If I check a box again in the VNC config window, the clipboard will update again from Android to Linux.

It is possible I am just stupid, and an extra step is needed for AVNC, and bVNC just does things differently.

Translations in Portuguese Brazil

Hello my friend @gujjwal00 . Sorry to message you here. I still don't quite understand how translations work. Below are some translations of the new content added. Hugs.

Screenshot_20220205-212125_AVNC

Default Security = Segurança Padrão
None = Nenhuma

Screenshot_20220205-212138_AVNC

Direct Touch = Toque direto
Do actions at touch-point = Faça ações diretas com o toque na tela
Do actions at point = O toque na tela controla o cursor

Screenshot_20220205-213946_Opera

Autorun = Executar automaticamente
Discover servers while on homepage = Descubra automaticamente servidores enquanto estiver na página inicial
Hightlisht rediscovered servers = Destaque servidores redescobertos

Screenshot_20220205-214522_AVNC

The correct one for fullscreen translation is: "Usar tela cheia" and not: "Usar tela completa"

Remove additional comments in Persian

Hello
There is no need for this comment in Persian anymore. Because you have modified the strings, no longer need to use directional control characters.

<!-- در رشته زیر از نویسه‌های ایزوله چپ‌به‌راست استفاده شده است -->

Please delete it the next time you import these new translations from the weblate.

Pi

Cant connect to pi change all auth on advanced settings but shows same issue disconnected error

FR: set remote display resolution

First of all, thank you for the great app. Especially the built-in SSH tunneling is extremely useful.
In my opinion it would be very useful to be able to set the remote display resolution in the app. I think at the moment the default server resolution is used which leads to impractical scrolling due to the server's default landscape orientation.
Thank you again!

F-Droid build failed

> Task :app:lintVitalRelease
/home/vagrant/build/com.gaurav.avnc/app/src/main/res/values-sr/strings.xml:84: Error: "pref_discovery_restart" is translated here but not found in default locale [ExtraTranslation]
    <string name="pref_discovery_restart">Поново покрени</string>
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/vagrant/build/com.gaurav.avnc/app/src/main/res/values-pt-rBR/strings.xml:144: Error: "pref_discovery_restart" is translated here but not found in default locale [ExtraTranslation]
    <string name="pref_discovery_restart">Reiniciar</string>
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/vagrant/build/com.gaurav.avnc/app/src/main/res/values-fa/strings.xml:152: Error: "pref_discovery_restart" is translated here but not found in default locale [ExtraTranslation]
    <string name="pref_discovery_restart">شروع مجدد</string>
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Explanation for issues of type "ExtraTranslation":
   If a string appears in a specific language translation file, but there is
   no corresponding string in the default locale, then this string is probably
   unused. (It's technically possible that your application is only intended
   to run in a specific locale, but it's still a good idea to provide a
   fallback.)

   Note that these strings can lead to crashes if the string is looked up on
   any locale not providing a translation, so it's important to clean them
   up.

3 errors, 0 warnings

> Task :app:lintVitalRelease FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:lintVitalRelease'.
> Lint found fatal errors while assembling a release target.
  
  To proceed, either fix the issues identified by lint, or modify your build script as follows:
  ...
  android {
      lintOptions {
          checkReleaseBuilds false
          // Or, if you prefer, you can continue to check for errors in release builds,
          // but continue the build even when errors are found:
          abortOnError false
      }
  }
  ...

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Could you please take a look? Thanks!

Keyboard accent and AltGr

Hi. Love your VNC app. We have a Samsung Dex community in Brazil with over 5,000 active users in a telegram group who are clamoring for writing and Portuguese support. It is possible to add accent support and the "AltGr + Q" and "AltGr + W" keys so that we can use the characters "/" and "?". Below is a picture of the keyboard in portuguese brazil ABNT2 layout that is the standard of the TabS7/6. Thanks.
IMG_20211129_153141_534

Clarification of zoom in/out numbers?

Hello,

I'm trying to grasp what the numbers repesent for the min/max zoom. Is it a percentage of the geometry of the vnc server? Setting both min and max zoom to 100% seems to disable zooming as expected, but it leaves about 50% (I'm eyeballing this) of my screen filled with unused black pixels.

As potential feature requests:

  1. could both of the zoom settings be made to accept a wider range of numbers?
  2. could there be a zoom setting for the default zoom when avnc connects to the server (of course it would have to be between the min/max settings)

I am using tigervnc server with an uncommon geometry of 720x1280, so maybe that's what's messing things up :)

Allow Alt+Tab (and other special keys) to be captured by the remote machine

Currently, when using AVNC with an external physical keyboard, the Alt+Tab keyboard sequence is captured by the phone (client) and not by the remote machine (the VNC server).

While this behavior is desired in some cases, in other cases it gets in the way of seamless remote work. For example, when using AVNC with Samsung DeX, the Alt+Tab sequence triggers the DeX app switcher instead of the app switcher in the remote machine. This gets in the way of working smoothly with the remote machine.

Perhaps a more general option to toggle capturing special keys (Alt+Tab, Alt+Shift, WinKey, WinKey+Tab, WinKey+E, etc.) remolty or locally is the best solution for this issue.

Thanks for your great app.

[Feature Request] Option to hide local Android cursor

Summary

  • Currently, when an external mouse is connected, the local Android system cursor completely covers the remote cursor

Proposed Solution

  • An option to hide the local cursor would therefore be useful!

Alternative Solutions

  • Not making this a setting and always hiding the local cursor
    • This would make it harder to debug input issues.

Version Information

AVNC 1.4.0

SSH Tunnel Port Forwarding

First of all great app, I must say that this is the best VNC experience I've had yet on Andriod!

The integrated SSH tunnel is a great feature. However I noticed that there is no place to specify particular port forwards. How does this work? Does AVNC assume that you want to forward the same remote port as the local port that you specific in AVNC?

Some users may want to be able to forward remote port X to local port Y. Maybe this functionality could be enabled in settings somewhere? Or maybe I am overlooking it?

Thank you and great work!

S-Pen not functional

Thank you for what looks like a very promising app.

I use VNC to connect to localhost, which is launched by an Xvnc session inside a Fedora distro deployment via Termux : this allows to run (aarch64) Linux applications almost natively on Android.

My main interest is running note-taking apps not available for Android (mainly Xournal++ and Okular).
This is on a Galaxy Tab S6 Lite with S-Pen (capacitive touchscreen, + EMR layer for the S-Pen).
This works quite well with e.g. MultiVNC.

With avnc, the S-Pen actions are only partly registered :

  • with "Mouse Passthrough" enabled :
  • mouse pointer follows the pen tip when dragging/drawing with the pen ;
  • no mouse clicks registered when touching, double touching, long pressing or dragging the pen tip on the surface.
  • with "Mouse Passthrough" disabled :
  • mouse pointer moves to the pen tip location when touching the surface (discrete touches, no dragging/drawing)
  • no mouse clicks registered when double touching, long pressing or dragging the pen tip on the surface.

IMO, the actual drawing/handwriting is done by registering e.g. left-mouse click while dragging.

Not sure whether this is the solution, but maybe [Left Click] actions should be attributable to "1 Finger Swipe" and/or "Drag (Long Press then Swipe)" ?

ESC key not recognized

I am using AVNC to connect to a remote Linux desktop., connecting from a device with a hardware built-in keyboard (Cosmo) and pressing the ESC key ends AVNC immediately. I can reconnect, but using a desktop without ESC is sometimes difficult.

I understand ESC is "special" in Android and you have to code around it - this is something that e.g. Termux does and offers an option to capture and pass the key to the terminal.

Thanks for the otherwise great vnc client

FR: sort list of servers

Thank you very much for AVNC!! And also thank you for putting it on F-Droid!

This is by far the best VNC-Client for Android I've seen so far.

I would appreciate very much if it was possible to manually sort the list of known servers. As an alternative it would be helpful to sort the servers in alphabetical order.

Thank you!

Diacritics from external keyboard not working

Version: The latest from F-Droid as of now (1.2.0) on Android 10

How to recreate from scratch:

  • Run Ubuntu chrooted through Termux (using AnLinux for the installation).

  • Also use AnLinux to install XFCE. Run ./start-ubuntu.sh and vncserver-start. Connect AVNC to 127.0.0.1:1.

  • In XFCE's Keyboard settings, the "Use system defaults" option is ticked.

Other (maybe useful) info:

  • If this XFCE option weren't ticked, there would be no Keyboard model options (like pc104 and others)
  • setxkbmap pt prints out XKB extension not present on :1.0, what I expected after reading the AVNC code's documentation

Problem:

When using the onscreen keyboard (brought up by swiping from the left and pressing the keyboard button), I can input all characters, including the ones with diacritics.

When using a Bluetooth keyboard, the layout on my keyboard (PT-pt) and the text input match perfectly. The problem comes up when I try to input an accented character. I press the acute accent key (and release it), then I press the key of the letter (á -> ´ + a). Only the letter is registered.

I used an online keyboard tester tool (https://www.keyboardtester.com/tester.html) and, when I clicked on the accent, no key presses at all were registered. When I pressed the letter, only it was registered.

What I tried to do to fix the problem:

Came complaining to the issues tab (just kidding). I tried reading the source code to see if, by any chance, I could quickly fix the problem or at least know what was happening. By the way, I have to congratulate you on the excellent documentation! The issue is probably in KeyHandler.kt.

My best "Android" development experience has been Cordova, so take my guess of what is happening with a big pile of salt: When I press ´ and the the letter, two events are triggered, of which only the second is being considered valid and is emitted. Though, when I use the onscreen keyboard, only one event is triggered (á).

Other:

There can be three events that result in a single chacater: Shift + ´ + a = à (in PT-pt layout). There might be other languages where there can be more events, even letters with two or more diacritics. These are notes to make sure any eventual fix of this problem in the code doesn't just fix this specific issue with two events, when there can be more.

Request: Add animated spinner gif while in discovery mode

Request

Replace loading logo in discovery tab with animated logo for indicating a background process of discovery is ongoing.

Background

A still logo while an ongoing background process looks weired to end user, replacing loading logo with loading gif or some othere kind of visuals will look nice.

Make available apks?

Hi, thanks for the app . I was testing it but I have problems with my s-pen on my tablet, the pointer in avnc does nit follow the pen. I have played with the input settings but still no fix. I am using version 1.0.1 from f-droid. But I see here that you are in version 1.3.0. But no apk is available. Could you please make then available or put the latest version in f-droid? thanks!

VNC URI scheme not supported?

Hi, based on what I've read in RFC 7869 I thought I could run something like this (via activity manager), but the app doesn't recognize the connection name and instead displays a login window:

am start -d vnc://host:port?ConnectionName=name

Supplying the username and password also doesn't work as it still asks for login information:

am start -d vnc://host:port?VncUsername=user&VncPassword=pass

am start -d vnc://host:port?ConnectionName=name&VncUsername=user&VncPassword=pass

Is the VNC URI scheme not supported? Ideally I'd like to just use the name of the connection that is already stored and the rest to be handled by the app. Can it be done?

By the way, it would be a useful feature if you allowed to create connection shortcuts on the homescreen like some SSH clients do (one example would be the app called Termius).

Software Keyboard/Ctrl Key: Not recognised

Summary

  • Pressing Ctrl+D on a software keyboard does not send Ctrl+D to the remote host
Screen_Recording_20211215-150438_AVNC.mp4

I'm using the Samsung Virtual Keyboard. As such, I understand if this can't easily be debugged/fixed!

Version information

AVNC 1.4.0, tigervncserver 1.11.0

Input/Stylus: Remote cursor doesn't follow local cursor

Summary

  • Unless touching the screen with the stylus,
    • The remote cursor is stationary while moving the local cursor
  • Moving the cursor with a bluetooth mouse (while not clicking) works fine
Screen_Recording_20211215-145116_AVNC.mp4

Two-finger scrolling not working with Samsung trackpad (keyboard cover)

Greetings @gujjwal00 . Once again, thank you very much for your commitment to the community. I did the test with the samsung trackpad (keyboard cover). Single click and double click working perfectly. The movement too.

Mistake
I cannot scroll to move up or down a content.

What happens?
When you try to scroll with two fingers on the trackpad, what happens is a navigation through the elements of the screen without the pointer moving.

Screen_Recording_20211223-183745_AVNC.mp4

Originally posted by @zequinh4 in #5 (comment)

remote content scrolling is too sensitive for me

Hi,

I have been using your great (!) app to highlight my pdf directly on my phone.

The only issue I noticed so far is that the remote content scrolling is super sensitive.

Could you consider either toning it down or making it user adjustable? If not, do you know of any workaround?

Anyway thanks a lot for this app :)

Right Click acts as back button

When I right click using physical mouse after running the server it acts as back button not as right click , Please solve this issue it will help me a lot.

"Shift" can't work in keyboard hotkey/shortcuts

When I try to use Shift in any keyboard shortcuts, it seems to be recognized as a capital letter modifier first. For example, when I try to use "Ctrl+Shift+K" in VScode, it goes into "Ctrl+K Ctrl+Shift+". I tried another VNC viewer and Shift can perform functionally in that.

[enhancement] panning should respect zoom level

Hi,

When using your app, I sometimes have to click the cross at the top right corner of the remote app window to close it.

I sat minimum zoom to 70% and was under the impression that the best way to close an app with my fat fingers would be to zoom in, then pan to the corner until the corner of the window is roughly in the middle of the screen, making it easier to reach.

But with the current implementation, panning does not allow to go "over the edge" of the window, making this strategy useless.

The end result is that I think that expected behavior of minimum zoom would allow to pan over the edge, to make sure that edge of screen remote event are not on the edge of the screen of the android phone, making them easier to click on.

I'll let you decide if you think this deserves a change.

Thanks for reading!

(Enhancement) (feature request) Move screen as cursor goes.

Nice interface , clear resulation and smoothness a combination in my opinion its better than other vnc client apps. But in zoomed screen as i move the cursor the screen doesn't move (as it does in realvnc app). Guess its under development .Expect the feature in near future.

Fullscreen on Samsung DeX

Finally I've found a VNC client with PT_BR keyboard full support! Thank you!

I'm using Samsung DeX and avnc doesn't enter in fullscreen mode (which is selected in configs). There's always a top bar with minimize and close buttons and the apps bar on screen bottom.

I think what I want it is called "immersive mode" in Android. So this app would be perfect to use with Andronix in PT_BR.

Not working with wayvnc

I'm currently using wayvnc (latest commit) with sway (v1.6-ish), and I can only access it via bVNC, but not AVNC.

Edit: note that I'm also using Tailscale to access it remotely, though I don't think that connecting via a VPN like this would cause any issue.

Stylus: Pointerdown point not included in stroke

Currently, when using a stylus, the pointerdown first point is not included in the stroke. This makes it difficult to use drawing apps on the host machine.

Stroke start is offset from the expected

Environment

  • AVNC Latest (as of Mar 6) via FDroid
  • Android 11, VNCing into GNOME 40/PoP OS

Steps to Reproduce

  • VNC into host
  • Open drawing app
  • Quickly draw a stroke

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.