Giter Club home page Giter Club logo

opendata's Introduction

Avoindata.fi CircleCI Cypress Dashboard

Main repository for Yhteentoimivuuspalvelut (Interoperability services in Finnish). This service combines two related subservices:

  • Avoindata.fi, a search engine and metadata catalog for Finnish open data
  • A catalog of interoperability tools and guidelines

The service is publicly available at Avoindata.fi. Free registration is required for features such as commenting and publishing of datasets. A developer sandbox is also available at betaavoindata.fi or betaopendata.fi.

Getting started

To try out the service, visit the sandbox/development environment betaavoindata.fi or the production environment avoindata.fi, and register a user account to create new datasets.

To get started in developing the software, install a local development environment as described in the documentation, and then see the development documentation.

Documentation

Please refer to the documentation directory and API documentation.

Contact

Please file issues at Github.

List of CKAN extensions

😎 Name Description
πŸ“‘ ckanext-orgdashboards CKAN extension for creating organization dashboards.
πŸ“ˆ ckanext-matomo CKAN extension to integrate Matomo data into CKAN. Gives download stats on package pages, list of most popular packages, etc.
🚜 ckanext-harvest This extension provides a common harvesting framework for ckan extensions and adds a CLI and a WUI to CKAN to manage harvesting sources and jobs.
🌌 ckanext-spatial This extension contains plugins that add geospatial capabilities to CKAN.
⌚ ckanext-realtime CKAN plugin which makes your CKAN site into a Realtime Data Portal.
🌎 ckanext-dataspatial Dataspatial is a Ckan extension to provide geospatial awareness of datastore data.
πŸ“¬ ckanext-requestdata This extension introduces a new type of dataset in which access to data is by request.
πŸ“‘ ckanext-orgportals CKAN extension for creating organization portals.
πŸ”Ž Data Solr Datasolr is a Ckan extension to use Solr for datastore queries.
πŸ” ckanext-cas CAS (Central Authentication Service) client extension for CKAN.
πŸ“€ ckanext-s3filestore Use Amazon S3 as a filestore for CKAN.
πŸ“Š ckanext-c3charts c3js based charts for CKAN.
🚚 ckanext-cloudstorage Implements support for resource storage against multiple popular providers via apache-libcloud (S3, Azure Storage, etc...).
πŸš‰ ckanext-dcat This extension provides plugins that allow CKAN to expose and consume metadata from other catalogs using RDF documents serialized using DCAT.
πŸ™Š ckanext-fluent This extension provides a way to store and return multilingul fields in CKAN datasets, resources, organizations and groups.
πŸ—Ύ ckanext-mapviews CKAN Resource View to build maps and choropleth maps.
πŸ“‚ ckanext-odata CKAN OData support to connect to tools like Tableau.
πŸ““ ckanext-pages This extension gives you an easy way to add simple pages to CKAN.
🌍 ckanext-spatial This extension contains plugins that add geospatial capabilities to CKAN.
⏩ ckanext-xloader Designed as a replacement for DataPusher because it offers ten times the speed and more robustness.

Copying and License

This material is copyright (c) 2013-2022 Digital and Population Data Services Agency, Finland.

CKAN extensions and Drupal components are licensed under the GNU Affero General Public License (AGPL) v3.0 whose full text may be found at: http://www.fsf.org/licensing/licenses/agpl-3.0.html

All other content in this repository is licensed under MIT License unless otherwise specified.

External services used during development

Some of the external services used.

Browserstack is used to test the service with different browsers and devices.

opendata's People

Contributors

aaronkala avatar amercader avatar beazil avatar bertofl90 avatar bzar avatar cyky avatar dependabot-preview[bot] avatar dependabot[bot] avatar domoritz avatar dvainio avatar eetumans avatar fuhuxia avatar icmurray avatar ilja-dev avatar johnglover avatar jpaakko avatar jsalonen avatar juho9000 avatar jyrkianttila avatar pasi-go avatar rossjones avatar teravill avatar tobes avatar tomkralidis avatar tonihw avatar transifex-integration[bot] avatar tvallas avatar wwitzel3 avatar ytp-bot avatar zharktas 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

opendata's Issues

wich variables i need to chante for 192.168.88.186 to datosabiertos.felipeurrego.com

i have a VMware appliance with ubuntu 20, and now is all set
my Windows host that virtual appliance in my hosts file in windows i put 192.168.88.186 datosabiertos.felipeurrego.com

in /root/opendata/docker/.env

i change this:

#DOMAIN_NAME=localhost
DOMAIN_NAME=datosabiertos.felipeurrego.com
SECONDARY_DOMAIN_NAME="nginx"
BASE_DOMAIN_NAME="localhost.not-exists"
SECONDARY_BASE_DOMAIN_NAME="nginx.not-exists"
#NAMESERVER=127.0.0.11
NAMESERVER=127.0.0.1

when put docker-compose up --build

show all UP

docker_ckan_cron_1  ... done
docker_nginx_1      ... done
docker_drupal_1     ... done
docker_ckan_1       ... done
docker_solr_1       ... done
docker_datapusher_1 ... done
docker_redis_1      ... done
docker_postgres_1   ... done
docker_mailhog_1    ... done

But in chrome in my windows

SNAG-1304

Vagrant -paketin kanssa ongelmia MAC:issa

TΓ€llainen virhe ilmoitus tuli, kun ajoi vagrant upin:

TASK: [common_webserver | Package modules] ************************************ 
failed: [10.10.10.10 -> 127.0.0.1] => (item=ytp-assets-common) => {"changed": true, "cmd": ["tar", "cf", "ytp-assets-common.tar", "ytp-assets-common", "--exclude=.git", "--exclude-from=ytp-assets-common/.gitignore"], "delta": "0:00:00.021342", "end": "2014-09-26 19:02:43.292957", "item": "ytp-assets-common", "rc": 1, "start": "2014-09-26 19:02:43.271615"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ytp-assets-common/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ckanext-drupal7) => {"changed": true, "cmd": ["tar", "cf", "ckanext-drupal7.tar", "ckanext-drupal7", "--exclude=.git", "--exclude-from=ckanext-drupal7/.gitignore"], "delta": "0:00:00.005832", "end": "2014-09-26 19:02:43.386283", "item": "ckanext-drupal7", "rc": 1, "start": "2014-09-26 19:02:43.380451"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ckanext-drupal7/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ckanext-ytp-drupal) => {"changed": true, "cmd": ["tar", "cf", "ckanext-ytp-drupal.tar", "ckanext-ytp-drupal", "--exclude=.git", "--exclude-from=ckanext-ytp-drupal/.gitignore"], "delta": "0:00:00.007774", "end": "2014-09-26 19:02:43.479756", "item": "ckanext-ytp-drupal", "rc": 1, "start": "2014-09-26 19:02:43.471982"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ckanext-ytp-drupal/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ckanext-ytp-tasks) => {"changed": true, "cmd": ["tar", "cf", "ckanext-ytp-tasks.tar", "ckanext-ytp-tasks", "--exclude=.git", "--exclude-from=ckanext-ytp-tasks/.gitignore"], "delta": "0:00:00.006098", "end": "2014-09-26 19:02:43.570538", "item": "ckanext-ytp-tasks", "rc": 1, "start": "2014-09-26 19:02:43.564440"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ckanext-ytp-tasks/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ckanext-ytp-request) => {"changed": true, "cmd": ["tar", "cf", "ckanext-ytp-request.tar", "ckanext-ytp-request", "--exclude=.git", "--exclude-from=ckanext-ytp-request/.gitignore"], "delta": "0:00:00.006261", "end": "2014-09-26 19:02:43.661039", "item": "ckanext-ytp-request", "rc": 1, "start": "2014-09-26 19:02:43.654778"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ckanext-ytp-request/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ckanext-ytp-main) => {"changed": true, "cmd": ["tar", "cf", "ckanext-ytp-main.tar", "ckanext-ytp-main", "--exclude=.git", "--exclude-from=ckanext-ytp-main/.gitignore"], "delta": "0:00:00.012360", "end": "2014-09-26 19:02:43.758000", "item": "ckanext-ytp-main", "rc": 1, "start": "2014-09-26 19:02:43.745640"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ckanext-ytp-main/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ckanext-googleanalytics) => {"changed": true, "cmd": ["tar", "cf", "ckanext-googleanalytics.tar", "ckanext-googleanalytics", "--exclude=.git", "--exclude-from=ckanext-googleanalytics/.gitignore"], "delta": "0:00:00.006342", "end": "2014-09-26 19:02:43.857926", "item": "ckanext-googleanalytics", "rc": 1, "start": "2014-09-26 19:02:43.851584"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ckanext-googleanalytics/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ytp-theme-drupal) => {"changed": true, "cmd": ["tar", "cf", "ytp-theme-drupal.tar", "ytp-theme-drupal", "--exclude=.git", "--exclude-from=ytp-theme-drupal/.gitignore"], "delta": "0:00:00.008279", "end": "2014-09-26 19:02:43.951074", "item": "ytp-theme-drupal", "rc": 1, "start": "2014-09-26 19:02:43.942795"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ytp-theme-drupal/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ytp-drupal-wysiwyg) => {"changed": true, "cmd": ["tar", "cf", "ytp-drupal-wysiwyg.tar", "ytp-drupal-wysiwyg", "--exclude=.git", "--exclude-from=ytp-drupal-wysiwyg/.gitignore"], "delta": "0:00:00.005302", "end": "2014-09-26 19:02:44.037358", "item": "ytp-drupal-wysiwyg", "rc": 1, "start": "2014-09-26 19:02:44.032056"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ytp-drupal-wysiwyg/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.
failed: [10.10.10.10 -> 127.0.0.1] => (item=ytp-drupal-user) => {"changed": true, "cmd": ["tar", "cf", "ytp-drupal-user.tar", "ytp-drupal-user", "--exclude=.git", "--exclude-from=ytp-drupal-user/.gitignore"], "delta": "0:00:00.005638", "end": "2014-09-26 19:02:44.132079", "item": "ytp-drupal-user", "rc": 1, "start": "2014-09-26 19:02:44.126441"}
stderr: tar: --exclude=.git: Cannot stat: No such file or directory
tar: --exclude-from=ytp-drupal-user/.gitignore: Cannot stat: No such file or directory
tar: Error exit delayed from previous errors.

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/Users/apoikola/single-server.retry

10.10.10.10                : ok=35   changed=5    unreachable=0    failed=1   

Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

Update README

What is the background of this project? Where can more info be found? What will be produced in this repo? What is the roadmap?

Missing translations

Some CKAN terms are missing translations due to update on infrastucture. Probably we will update how translations are handled all together.

Logged in as different names in different languages

Hi,
This is a weird one.
When I log in, in the top right corner of the site it shows a different name based on my language selection. If I click on the name, it takes me to my account as it should, just the display is wrong.
In Swedish it showed my username correctly, but it showed my username to my colleague as well.. :)

Which service (alpha or beta of avoindata.fi) to use to experiment with CKAN-api for ytp?

In https://github.com/yhteentoimivuuspalvelut/ytp the usage instructions for the API refer to https://alpha.avoindata.ti but there alreaydy exists https://beta.avoindata.fi? Which one should be used? What is the difference between these two? Most importantly should there only be one (the latest version of avoindata.net available) cause probably all the possible users experimenting with publishing and using #opendata shared thru this CKAN-API might get confused abput which service instance to use? If they are for different use case or tests, then it's unclear to users how should they be used.

SYKE harvesting throws exception

Traceback (most recent call last):
File "/usr/lib/ckan/default/bin/paster", line 11, in
sys.exit(run())
File "/usr/lib/ckan/default/local/lib/python2.7/site-packages/paste/script/command.py", line 102, in run
invoke(command, command_name, options, args[1:])
File "/usr/lib/ckan/default/local/lib/python2.7/site-packages/paste/script/command.py", line 141, in invoke
exit_code = runner.run(args)
File "/usr/lib/ckan/default/local/lib/python2.7/site-packages/paste/script/command.py", line 236, in run
result = self.command()
File "/srv/ytp/ckanext-harvest/ckanext/harvest/commands/harvester.py", line 191, in command
fetch_callback(consumer, method, header, body)
File "/srv/ytp/ckanext-harvest/ckanext/harvest/queue.py", line 409, in fetch_callback
fetch_and_import_stages(harvester, obj)
File "/srv/ytp/ckanext-harvest/ckanext/harvest/queue.py", line 426, in fetch_and_import_stages
success_import = harvester.import_stage(obj)
File "/srv/ytp/ckanext-spatial/ckanext/spatial/harvesters/base.py", line 565, in import_stage
'harvest_object': harvest_object,
File "/srv/ytp/ckanext-ytp_main/ckanext/ytp/plugin.py", line 700, in get_package_dict
package_dict = unflatten(flattened)
File "/usr/lib/ckan/default/src/ckan/ckan/lib/navl/dictization_functions.py", line 450, in unflatten
current_pos = current_pos[key]
IndexError: list index out of range

ERROR: Service 'nginx' failed to build : Build failed docker method

Step 11/14 : COPY --from=ayv41550.live.dynatrace.com/linux/oneagent-codemodules-musl:nginx / /
invalid from flag value ayv41550.live.dynatrace.com/linux/oneagent-codemodules-musl:nginx: Head "https://ayv41550.live.dynatrace.com/v2/linux/oneagent-codemodules-musl/manifests/nginx": no basic auth credentials
ERROR: Service 'nginx' failed to build : Build failed

Increase publishable dataset size

The current size limit for datasets, 50 MB, seems too small. It's unnecessarily hard to publish when the data needs to be split into pieces first. Similarly the user needs to glue the pieces back together. Is there a specific reason for the low limit? Thanks for your work.

Discourage hard-to-use formats more prominently

I'll open a new issue for this discussion that branched off from #4.

The definition of open data requires a "machine-readable" and "convenient and modifiable form".

Even though avoindata.fi has a page which discourages the use of Excel formats, currently 892 out of the 1625 published datasets are in XLS format.

Perhaps Excel formats should be more prominently discouraged when someone tries to upload data. Perhaps simple advice could be given on how to transform the data into CSV format. What do you think?

ckanext-ytp-requests fails with Attribute Error on CKAN 2.4

Hey!

I've got a ckan 2.4 instance installed with datacats and get the error AttributeError: 'module' object has no attribute 'ytp_common_js/ytp_form.js' after installing ytp-requests an trying to open an organisation on my ckan.

I've got ckanext-hierarchy installed, which allows for the creation of hierarchical organisations. Not sure if there's a potential conflict or if I maybe missed installing a dependency? Nothing specific was mentioned in the install instructions though.

Here's the full traceback:

URL: http://energydata.uct.ac.za/organization/sanedi
File '/usr/lib/ckan/local/lib/python2.7/site-packages/weberror/evalexception.py', line 428 in respond
  app_iter = self.application(environ, detect_start_response)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/webob/dec.py', line 147 in __call__
  resp = self.call_func(req, *args, **self.kwargs)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/webob/dec.py', line 208 in call_func
  return self.func(req, *args, **kwargs)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/fanstatic/publisher.py', line 234 in __call__
  return request.get_response(self.app)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/webob/request.py', line 1053 in get_response
  application, catch_exc_info=False)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/webob/request.py', line 1022 in call_application
  app_iter = application(self.environ, start_response)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/webob/dec.py', line 147 in __call__
  resp = self.call_func(req, *args, **self.kwargs)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/webob/dec.py', line 208 in call_func
  return self.func(req, *args, **kwargs)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/fanstatic/injector.py', line 54 in __call__
  response = request.get_response(self.app)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/webob/request.py', line 1053 in get_response
  application, catch_exc_info=False)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/webob/request.py', line 1022 in call_application
  app_iter = application(self.environ, start_response)
File '/project/ckan/ckan/config/middleware.py', line 389 in inner
  result = application(environ, start_response)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/beaker/middleware.py', line 73 in __call__
  return self.app(environ, start_response)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/beaker/middleware.py', line 155 in __call__
  return self.wrap_app(environ, session_start_response)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/routes/middleware.py', line 131 in __call__
  response = self.app(environ, start_response)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/pylons/wsgiapp.py', line 125 in __call__
  response = self.dispatch(controller, environ, start_response)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/pylons/wsgiapp.py', line 324 in dispatch
  return controller(environ, start_response)
File '/project/ckan/ckan/lib/base.py', line 296 in __call__
  res = WSGIController.__call__(self, environ, start_response)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/pylons/controllers/core.py', line 221 in __call__
  response = self._dispatch_call()
File '/usr/lib/ckan/local/lib/python2.7/site-packages/pylons/controllers/core.py', line 172 in _dispatch_call
  response = self._inspect_call(func)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/pylons/controllers/core.py', line 107 in _inspect_call
  result = self._perform_call(func, args)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/pylons/controllers/core.py', line 60 in _perform_call
  return func(**args)
File '/project/ckan/ckan/controllers/group.py', line 228 in read
  extra_vars={'group_type': group_type})
File '/project/ckan/ckan/lib/base.py', line 175 in render
  return cached_template(template_name, render_template)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/pylons/templating.py', line 249 in cached_template
  return render_func()
File '/project/ckan/ckan/lib/base.py', line 129 in render_template
  return render_jinja2(template_name, globs)
File '/project/ckan/ckan/lib/base.py', line 86 in render_jinja2
  return template.render(**extra_vars)
File '/usr/lib/ckan/local/lib/python2.7/site-packages/jinja2/environment.py', line 894 in render
  return self.environment.handle_exception(exc_info, True)
File '/project/ckanext-ytp-request/ckanext/ytp/request/templates/organization/read.html', line 1 in top-level template code
  {% ckan_extends %}
File '/project/ckan/ckan/templates/organization/read.html', line 1 in top-level template code
  {% extends "organization/read_base.html" %}
File '/project/ckanext-hierarchy/ckanext/hierarchy/templates/organization/read_base.html', line 1 in top-level template code
  {% ckan_extends %}
File '/project/ckanext-datarequests/ckanext/datarequests/templates/organization/read_base.html', line 1 in top-level template code
  {% ckan_extends %}
File '/project/ckan/ckan/templates/organization/read_base.html', line 1 in top-level template code
  {% extends "page.html" %}
File '/project/ckan/ckan/templates/page.html', line 1 in top-level template code
  {% extends "base.html" %}
File '/project/ckanext-pages/ckanext/pages/theme/templates_main/base.html', line 1 in top-level template code
  {% ckan_extends %}
File '/project/ckan/ckan/templates/base.html', line 103 in top-level template code
  {%- block page %}{% endblock -%}
File '/project/ckan/ckan/templates/page.html', line 19 in block "page"
  {%- block content %}
File '/project/ckan/ckan/templates/page.html', line 22 in block "content"
  {% block main_content %}
File '/project/ckan/ckan/templates/page.html', line 57 in block "main_content"
  {% block primary %}
File '/project/ckan/ckan/templates/page.html', line 70 in block "primary"
  {% block primary_content %}
File '/project/ckan/ckan/templates/page.html', line 85 in block "primary_content"
  {% if self.page_primary_action() | trim %}
File '/project/ckanext-ytp-request/ckanext/ytp/request/templates/organization/read.html', line 6 in block "page_primary_action"
  {% resource 'ytp_common_js/ytp_form.js' %}
File '/project/ckan/ckan/lib/jinja_extensions.py', line 315 in _call
  h.include_resource(args[0], **kwargs)
File '/project/ckan/ckan/lib/helpers.py', line 1436 in include_resource
  r = getattr(fanstatic_resources, resource)
AttributeError: 'module' object has no attribute 'ytp_common_js/ytp_form.js'

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.