Code Monkey home page Code Monkey logo

astroarch's Introduction

Welcome to AstroArch! Astrophotography on ArchLinux for Raspberry Pi, PC and mini PC (works also on Manjaro and all Arch derived distros)

Discord chat <= Join us on discord!

astroarch

Please find below some (hopefully) useful instructions, if you are here instead because you want to know how you can build this image from scratch, see this

What Raspberry version is supported?

AstroArch runs on any raspberry capable to run aarch64 OS, this means Raspberry Pi 4 and of course Raspberry Pi 5

Download

Please use this link to download the latest astroarch gzipped img file => https://drive.google.com/file/d/1S4lGyRT1soCdO8QAUk5gmDEXj6T2_b2g/view

Flash the img to an SD

If you prefer a GUI, use balenaHetcher otherwise you can use the unix dd to flash it, and if you are using dd I think there is nothing I shall explain to you :)

First boot

After you burned the .img file to your SD, you should be able to reach astroarch via VNC, however if you don't see the desktop or you can't connect to it this likely means that unfortunately your raspberry pi rev cannot boot the image. In this case please plug a monitor and report here the output! Once you are logged in the first thing you should do is update the system, open the terminal and type update-astroarch command

Set timezone

Do not forget to set the right timezone! to do so run sudo timedatectl set-timezone Foo/Bar where Foo/Bar is something like Europe/Rome

Passwords

To save you some time, here the default password you will need for AstroArch:

  • the user password for astronaut (which is the user used to login or for ssh) is astro
  • the password for the AstroArch-XXXXXXX WiFi hotspot is astronomy

How to protect VNC with password

If you want to add more security to your installation (or maybe you are at a starparty with more users running AstroArch), you may want to add a password to VNC (by default there is no password). To do so first set a password running sudo vncpasswd and after that edit /etc/systemd/system/x0vncserver.service changing the ExecStart line from this

ExecStart=x0vncserver -display :0 -SecurityTypes None

to this

ExecStart=x0vncserver -display:0 -rfbauth /root/.vnc/passwd

Reboot and now you should be prompted to input a password when connecting via VNC

How can I use a raspberry camera

AstroArch finally supports raspberry cameras via indi pylibcamera, to install it and having fun with it just run sudo pacman -S indi-pylibcamera

Use only the astro packages mantained for AstroArch on PC and mini PC

If you have an x64 distro based on ArchLinux on your PC and you just want to access the packages I mantain (kstas, phd2, stellarsolver, indi, indi libs and drivers) add my repo to your pacman.conf file (under /etc/pacman.conf) before the [core] section, the repo looks like the following

[astromatto]
SigLevel = Optional TrustAll
Server = http://astroarch.astromatto.com:9000/$arch

after that run sudo pacman -Sy && sudo pacman -S kstars phd2 indi-3rdparty-drivers stellarsolver

Useful commands

The followings are some useful commands that you can run from the terminal so you don't have to deal with complicated stuff by yourself if you don't want to:

  • update-astroarch => this command will update system packages (including kstars, indi, etc. if there are new versions) and will pull any fix for astroarch itself, additionally will update the astroarch configuration that may bring in more commands etc.
  • astro-rollback-indi => rollback automatically indi to the previous version
  • astro-rollback-kstars => rollback automatically indi to the previous version
  • astro-rollback-full => rollback automatically indi and kstars to the previous version
  • use-astro-bleeding-edge => install bleeding edge packages for Kstars and INDI
  • use-astro-stable => install stable packages for Kstars and INDI

Connecting via browser (noVNC)

By default AstroArch will start a hostpot called AstroArch, to connect to that WiFi network use the password astronomy

noVNC is installed and it will start by default, if your pi is wired to your network you can connect to it with the follwing methods:

otherwise, if you want to connect to its hotspot, find the WiFi network AstroArch (the pass is astronomy) and type in your browser http://10.42.0.1:8080/vnc.html

Welcome to astro arch!

Connecting via VNC client

If you trust me, this should be always the preferred way to connect usig VNC. noVNC goes through the browser and is less fluid and performant than a real VNC client. You can use whatever VNC client you prefer, there should be no issue.

The address is astroarch.local (or the IP if you prefer) and the port is 5900

Few VNC client suggestions (work an all platforms):

Adding swap

By default astroarch don't have swap, for prevent issues about memory space you can add a swap file and enable it, we will set swappiness to 10 don't use swap file if RAM space is ok. In this example we make a 2GB swapfile

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile 
sudo mkswap /swapfile
sudo swapon /swapfile
sudo echo "vm.swappiness = 10" | sudo tee -a  /etc/sysctl.d/99-swappiness.conf

Check swappiness

$ cat /proc/sys/vm/swappiness
10

Check if Swap is enabled

free -h

Output should be something like this on Swap row :

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.7Gi       1.4Gi       1.1Gi        88Mi       1.3Gi       2.3Gi
Swap:          2.0Gi          0B       2.0Gi

Make permanent swapfile on system

$ sudo echo "/swapfile   none    swap    sw              0       0" | sudo tee -a  /etc/fstab

Boot from external disk (USB, HDD, SSD, NVME)

If you want to use an alternative media to boot AstroArch, just flash the image to your support and it will work out of the box! No special steps are required

Software available

the following software will be available, by category

Astronomical

  • Kstars 3.7.1
  • phd2 2.6.13dev1
  • indi libs 2.0.8 (all of them)
  • indi drivers 2.0.8 (all of them)
  • most of the widefield indexes for plate solving
  • astromonitor (you never heard of it? Check it here https://github.com/MattBlack85/astro_monitor)
  • AstroDMx (a capture software like FireCapture)

OS

  • Konsole (terminal)
  • KDE Plasma (Desktop environment)
  • pacman (package manager, this is NOT debian based and pacman instead of apt is your package manager
  • NetworkManager (to manage networks)
  • Discovery (to install other packages)

Connectivity

  • tigervnc (x0vncserver)
  • noVNC

Browser

  • chromium (like chrome, but without google tracking code)
  • firefox

How to add a RTC

Adding a RTC to AstroArch is easy from version 1.6. First, wire your RTC to your pi, open a terminal and type sudo i2cdetect -y 1 you should see a similar table, take note of the number for the next steps i2cdetect

Now find the line dtoverlay=i2c-rtc in /boot/config.txt and modify it by adding a comma and the name of your RTC device, in my case for the ds3231 will be dtoverlay=i2c-rtc,ds3231

Reboot your Raspberry PI and if you type again sudo i2cdetect -y 1 you should now see a UU instead of the number, this means the kernel module for your RTC has been loaded correctly.

That's all you need! We just enabled automatic modules to setup the system time from the RTC if it's present! No more steps are required!

Reboot your PI and you should have the time automatically synchronized when it starts!

If you want to remove the RTC sync just drop ,xxxx from /boot/config.txt at line dtoverlay=i2c-rtc,xxxx

Using a GPS dongle

To use a GPS dongle, simply plug in your device and activate the GPSD service which is disabled by default. So the only command required is sudo systemctl enable gpsd --now and the service will start automatically after each boot. You can also manually edit /etc/gpsd and hardcode the device path on the DEVICES="" line with DEVICES="/dev/gps0"

Otherwise, simply use the following command gps_on to perform these two operations.

For users of a GPS dongle models u-blox 7 or VK-162 with a mount using the eqmod module, use the gps_ublox_on command. This helps avoid a conflict between the GPS and the mount.

If you want to disable automatic startup of the GPS daemon, run gps_off.

ADDITIONAL CONSIDERATIONS (use these as guidelines):

If you are having trouble getting the signal, you may need to protect your USB3 cables (they interfere with the GPS signal) if the device is not recognized (which is very unlikely on ArchLinux), we do not recommend using ttyXXX as it may point to other serial devices after a reboot

How to enable bluetooth

By default there are no packages to enabling bluetooth, to install them and enabling bluetooth functionalities run the following command bluetooth_on, this command will install the BT packages and enable the bluetooth daemon to run automatically at boot. If you want to disable bluetooth daemon autostart just run bluetooth_off and if you want to remove it run bluetooth_remove

How to enable FTP

Identical to Bluetooth, there is no default package to activate an FTP server.

To install and activate it, run the following command ftp_on. This command will install the Very Secure FTP Daemon package and allow the FTP server to run automatically on startup.

To connect from a remote station, use an FTP client such as FileZilla or other. All you need to do is identify yourself with the astronaut user, his password and the IP address where the server is located. You will easily find the IP address of your LAN or WLAN with the ifconfig command in a console. Once connected, you can very quickly transfer your files in both directions.

If you want to disable the automatic start of the FTP server, simply run ftp_off and if you want to remove it, run ftp_remove.

Where to find more packages?

If you want to install more packages you should look what is available here https://archlinuxarm.org/packages - if you find the package there you can easily install it running sudo pacman -S PACKAGE_NAME, if you want to install packages using a GUI instead, open discovery (the blue bag icon on the tray) and follow the instructions.

If the package you are looking for is not there you may additionally have a look at the AUR https://aur.archlinux.org/ - AUR is a list of packages mantained by the community, they are not ready to be installed so they can't be installed with pacman but instead you need paru (already installed on AstroArch), if you find your package on the AUR run paru -S PACKAGE_NAME it will ask you for a review (confirm it) and then it will compile the package for you and install it. Please be patient, some packages are just huges and it may take some time to compile on lower hardware like the raspberry. Even for AUR there is a graphical installer (although I never used it and I cannot guarantee if it works well or not), run sudo pacman -S pamac-full and you can run pamac to install graphically packages from the AUR.

What if your package is not in the AUR or the offcial ArchLinux repository? Please let me know, it is not hard to package stuff for ArchLinux and in fact I already do it for few things, I can take a look at the source and if possible I will try to package it for Arch so that you may be able to install it using pacman.

How to install Python packages?

PLEASE READ THIS CAREFULLY

Python packages via pip installing has changed over time and it now looks way more different than it was years ago, this may looks like a cultural shock if you are coming from more stable distros (Debian and similar) that still didn't catch up with this change but bear with us; installing packages via pip globally is not supported anymore by default (sudo pip install) cause it messes up distro packaging. If you try to do so you will see an error message suggesting to use a virtual environment (which, by the way, is a GREAT suggestion). Sometimes vietual envs are not simply possible, so there are 3 ways to achieve the wanted result:

  1. install the package via the package manager (pacman) - if the python package you want to install is a common one, there is a big chance it's been packaged for ArchLinux already and you can install it with pacman - BEST WAY
  2. open an issue here on github and let me know what python packages you would like to see available to be installed via pacman, it will take few days to few weeks depending on availability but it is doable - RECOMMENDED WAY if 1 is not possible
  3. bypass the pip check and force a global install running sudo pip install --break-system-packages PACKAGE_NAME - NOT RECOMMENDED and likely to break other dependencies in the long run, if you do so, we do not offer any support, sorry!

Reporting issues

AstroArch is actually in a stable state, however, should you find any issue please report them here https://github.com/MattBlack85/astroarch/issues this will help me tracking them and ship a fix for them

Quick video intro to AstroArch

Intro_AtroArch.mp4

astroarch's People

Contributors

m-molinari avatar mattblack85 avatar sc74 avatar teoteo 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

Watchers

 avatar  avatar  avatar  avatar  avatar

astroarch's Issues

enable systemd-timesyncd

it seems it is disabled by default and time doesn't get updated automatically.
To fix this timesyncd should be enabled when building the image

Local Network

There is no possibility to see astroarch as a local computer on the network or as a network drive, so as to be able to access folders or a specific folder (eg Pictures)

Useful packages for Arch user

Some useful packages for users, maintenance or future versions of AstroArch.
System:

rsync wget parted dosfstools sudo accountsservice cmake meson opencv ffms2 libgit2 vim ninja gtk3 ark irqbalance inxi lsb-release ncdu plymouth smbnetfs alacritty

Kde:

kdenetwork-filesharing dolphin-plugins qt5-imageformats

THANKS

Stéphane

Kstars not starting in Manjaro

On my Manjaro Laptop kstars is not starting.

kstars: error while loading shared libraries: libwcs.so.7: cannot open shared object file: No such file or directory

A few days ago there was a big update for Manjaro, since then Kastars doesn't start anymore.
I entered the repository, it was still working fine a few weeks ago.
wcslib is now at version 8.1-1

Problema raffreddamento camera ToupTek

Salve Mattia,
E complimenti per questo progetto che stai portando avanti!
Ho un problema con la mia camera ToupTek ATR3CMOS09000KPA con sensore imx 533 con ekos su astroarch. Il comando di raffreddamento non funziona; inserisco la temperatura desiderata ma non si avvia il raffreddamento anche se la ventola è in funzione. Ho provato la camera con NINA e funziona perfettamente. Come si può risolvere? Sarà un problema del driver?
Grazie

unable to set time

I am trying my hand at using Kstart/Ekos to trigger my camera and was very happy to find your fantastic package

however, I am unable to set the time and date on my brand spanking new astroarch installation, no issue changing the timezone, but it has not updated the clock, the system thinks we are 6 days ago!

image

my pi4 B is connected to my wifi network, so I would have expected it to update time after three or for reboots by now.

if I untick 'set date and time automatically' update and apply, I get 'unable to set current time' after entering the password when requested:
image

any idea why that might be?

FTP server?

Maybe it would be useful to have a ftp server such as vsftpd on ArstroArch? What do you think ?

Fail updating astroarch.

When I try to update astroarch using sudo pacman -Syu. I get a error with astroarch.db download.
failed retrieving file astroarch.db from astroarch.astromatto.com:9000: the request url returned error: 404

GPIO access in AstroArch and Raspberry Pi 5

Hello,

Is there any special access I need to have for GPIO chip in Raspberry Pi 5?
I have installed https://abyz.me.uk/lg/lgpio.html library that works fine for me on RPi 5 and Debian based distributions. But I cannot make it connect to GPIO under AstroArch.

Steps I made:

  1. fresh SD card flash
  2. update-astroarch done
  3. installation unzip, make, python and python3
  4. installation lgpio from sources

After that, I ran rgpdiod daemon (started ok) and tried to connect to the GPIO chip with

rgs c 1 go

with chipnr set from 0 to 5, and it always return -78 which means LG_CANNOT_OPEN_CHIP.

Many thanks in advance for any hints!

Lucas

Replace systemd-timesyncd with chrony

it seems timesyncd does not work perfectly and has issues with LTE networks, to deliver a constant experience to everyone we should replace it with ntp which seems to work also for those cases

Astrometry Files Folder Is Locked

The folder to copy astrometry files for plate solving is locked off, you can't download files, you can't copy files over, and you can't sudo dolphin over. The only choice is to copy an astrometry files folder to the desktop.

WTF?

Chrome doesn't work

Chrome does not come up when clicked on. I tried downloading a Debian installer on another Linux box, but it's just asking me what app to open it with instead of just installing.

How can I install a new version, or another browser? I have no web access on the AstroArch system.

Thanks.

Unstable VNC server

Hi,

The 99-v3d-conf file must be modified like this to disable 3d acceleration which is experimental in v4c. Because this creates outages in the vnc service.

“OutputClass” section
Identify "vc4"
MatchDriver "vc4"
Driver “modesetting”
"AccelMethod" option "none"
EndSection

A clear sky

Stephane

Astro software

Good morning,

Do you plan to keep collimation-circles?

It is practical for roughing out the collimation of a sc tube.

A software that is missing and which seems important to me given its evolution is Siril.

Indeed, this software is not too heavy for a rpi.

It allows you to quickly open a fit image and work on it. It also allows you to do live stacking.

But the most essential thing for me is that it allows you to visualize the faults of the instrument (tilt, backfocus, etc.). It already has good tools for here and there, future version will bring others. It helps me a lot during my outdoor astro sessions.

Good clear sky.

Stéphane

default password for user astronaut?

... but what is the root password by default? whatever i do, i get a request: password for astronaut: and neither astro, astronomy or root works ...

Two useful packages

Will it be possible to get 2 AUR packages that I really like as an Arch user?

The first is downgrade to downgrade certain packages when troubleshooting your system. Quite useful to experienced users

The second is arch-update. A great script that doesn't just do normal +Aur +Flatpak updates. It informs about the latest news from Arch Linux, allows you to remove orphaned packages and old packages from the cache. It processes pacnew/pacsave files. And also offers a restart if there has been a kernel update.

For more information: https://github.com/Antiz96/arch-update

Thanks in advance.

Stéphane

Unprotected VNC server

The VNC is not password protected.

To protect yourself when several networks are nearby?
Think this is useful?

THANKS.

Stéphane

A small line in astroarch_build.sh

Password tigervnc

(echo astroarch; echo astroarch; echo y; echo astroarch; echo astroarch) | vncpasswd

And this in X0vncserver.service

ExecStart=x0vncserver -display:0 -rfbauth /root/.vnc/passwd

Performance of ArchLinux vs Raspberry Pi OS 64bit Bullseye

@MattBlack85 Mattia I'm wandering what is benifits of choosing ArchLinux over Raspberry Pi OS for AstroArch? I tried both, but in my case desktop experiance with Raspberry Pi OS is way better that with ArchLinux. Raspberry Pi OS 64bit Bullseye desktop feels more responsive even over VNC, comparing to ArchLinux. Am I missing something here? Maybe some VNC configuration different VNC client? Currently I'm using VNC Viewer by RealVNC client.

Duplicated char in terminal

Sometimes zsh calculates a bad offset to display chars, this is probably due the fact LC_CTYPE is never set during the image preparation.
Adding it to .zshrc won't be enough to fix the issue, locale-gen should be invoked at bootstrap time to fix it (so en_US.UTF-8 should be uncommented before running locale-gen)

Warning at kernel startup

Hello,

Some small fixes for kernel startup.

1 - Modification of the /etc/fstab file to eliminate the "failed to start remount root and kernel file systems" message

PARTUUID=cafd14b5-02 / ext4 defaults 0 1

2 - Error message "at-fs not properly umounted". To be checked when creating the image. Solved after installing dosfstools package and doing fsck.vfat /dev/sda1

3 - avahi asks for the nss-mdns package to be installed. Install the package?

4 - A line is missing in the service file x0vncserver.service so that it starts after the network.

After=network-online.target

A great day.

Stephane.

Help onboarding RTC devices

The following actions are needed:

  • Add i2c-tools to the list of dependencies
  • Add backward compatible installation of i2c-tools to 1.6.sh script
  • Add the following lines dtparam=i2c_arm=on and dtoverlay=i2c-rtc to /boot/config.txt in 1.6.sh
  • Add the following lines dtparam=i2c_arm=on and dtoverlay=i2c-rtc to build.sh
  • Document RTC onboarding

Configuring GPS in Astroarch

A little code idea to insert into the astroarch_build.sh file for GPS. The # Set GPS part can also be a file in the .astroarch/configs folder to be uploaded to /etc/default/gpsd

Set GPS

rm /etc/default/gpsd
touch /etc/default/gpsd
cat > /etc/default/gpsd << 'EOL'
#Default settings for gpsd.
START_DAEMON="false"
GPSD_OPTIONS="-n"
DEVICES="/dev/ttyACM0"
USBAUTO="false"
EOL

2 lines to synchronize the system time with the GPS

echo 'refclock SHM 0 offset 0.5 delay 0.2 refid NMEA' >> /etc/chrony.conf
echo 'driftfile /var/lib/chrony/drift' >> /etc/chrony.conf

Start GPS

systemctl enable gpsd
systemctl start gpsd

Add MOTD

with some useful insights:

  • Add pacman-contrib to boot.sh
  • Add pacman-contrib to 1.6.sh
  • Add motd to assets
  • link motd to /etc/motd
  • link motd to /etc/motd in 1.6.sh
  • Show how many packages are ready to be updated in /etc/motd

replace x11vnc with krfb

krfb looks really interesting and, more important, lighter than x11vnc.

It could be a good alternative for astroarch, preliminary tests show it's working, we should point websockify at it as last step to see if routing through the browser works as well

Is it possible to connect to Astroarch on a R-Pi by wifi, without hotspot?

The setup I want is to have my Raspberry Pi making a WIFI (not wired) connection to MY network and being accessible to my laptop, without having to change the WiFi connection to use the hotspot in AstroArch on the Pi, as if the Pi had a wired connection to the network.

Somehow, don't ask me how it works, I have such a connection working when the Pi is running Astroberry. Then, I can type http://astroberry.local/desktop/ into my browser and it goes right to the Astroberry desktop. I don't have to use the hotspot at all. As I said, I have no idea how this works because the Astroberry docs specifically state that you DO have to point the computer at the Astroberry's hotspot on the Pi.

After the first boot, search for 'astroberry' wireless hotspot and connect your PC to it using 'astroberry' for password. Point your browser to https://astroberry.local/ or https://10.42.0.1/ to access Astroberry Server. For the Internet access connect your Astroberry to your home wireless network. Right-click top bar Wi-Fi icon and edit Wireless connection by entering your home network SSID and password.

This indicates to me that I should not be able to connect to astroberry without going through its hotspot, AND YET I CAN! I thought maybe this would somehow be cached in the browser but I just opened Firefox which I hardly ever use and it connected just as chrome does! If not in the browser, just how the heck does my computer find this address?

So I would like some networking guru to explain what might be going on. If I understood how it worked in Astroberry, maybe I could get the same setup going with Astroarch. As of now, without a wired connection, I can connect to Astroarch only by connecting the laptop to the Astroarch hotspot and putting http://10.42.0.1:8080/vnc.html in the browser.

Actually, the astroberry instructions above don't really work either. If I connect to the Astroberry hotspot, log in, and try to change the Pi's Wireless connection to my network, the connection from the laptop to the pi is lost and I can't do anything with it. And it's exactly the same with Astroarch.

So I am one confused puppy and hope someone can untangle all this and explain it. Thanks for listening.

Impossibile connettere SynScan V4

Salve Mattia,

Sto sperimentando AstroArch e non ho trovato nessuna difficoltà nell'installazione e nell'aggiornamento.
Provando però con due sysncan, mentre la V3 si connette senza problemi con Kstars, la V4 (che ha anche la porta usb) non c'è modo.
Da cosa potrebbe dipendere?

Grazie,
Paolo

fix samba share

It's been reported trying to mount astronaut home on windows through samba does not work. User/pass are not working probably because of the bad samba configuration on AstroArch.
This should be investigated and tweaked such that it will work out of the box

Passwords don't work

I just installed AstroArch on an 8 gig Pi4, and when I try to run the updates or change location and time, it won't recognize the passwords. I've tried astro, astronaut, astroarch, AstrArch, nothing works.

So, what' sup?

Thanks.

Missing Toutptek drivers

Updating from AstroArch 1.7 to Kstars 3.6.8 and INDI 2.0.5 INDI 2.0.5 indi_toupcam_ccd driver is missing and I get this error:

[2023-12-14T17:18:53.444 CET WARN ][ org.kde.kstars.indi] - Driver "Touptek" failed to start. Retrying in 5 seconds...

Screenshot_2023-12-14_alle_17 30 21

libssl.so.1.1: cannot open shared object file

It seems that launching paru -S leads to an error with libssl1.1 on AstroArch

error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

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.