Giter Club home page Giter Club logo

easyeda2kicad's Introduction

This project is no longer maintained!

We recommend the easyeda2kicad python package instead.

EasyEDA 2 KiCad

Convert EasyEDA PCBs to KiCad format

Build Status

Online Converter

The easiest way to convert EasyEDA boards to KiCad format is to use the online convertor:

https://wokwi.com/easyeda2kicad

Installation

npm install -g easyeda2kicad

Usage

easyeda2kicad <input.json> [output.kicad_pcb]

Notes

Copper zones are converted but not filled. When you load the converted PCB in KiCad press "b" (or "Edit" → "Fill All Zones") to recalculate the zones.

License

Copyright (C) 2019, Uri Shaked.

Most of the code is released under the MIT license, with the exception of src/svg-arc.ts, which is released under the Apache 2.0 license.

easyeda2kicad's People

Contributors

coolio986 avatar dependabot[bot] avatar karinch avatar pjvds avatar urish avatar zeevj avatar

Stargazers

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

Watchers

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

easyeda2kicad's Issues

Board "No Solid" zones should allow tracks/vias

Currently, EasyEDA "No Solid" zones are converted to KiCad keepout zones which do not allow copper pours, tracks or vias. EasyEDA seems to permit tracks/vias in these zones, so we should also allow them in KiCad

>Export Error

Hi, i export my easyeda files to json, then convert them into kicad, when i try to open de kicad file i get this error
image

I dont know what it means, can you explain me the error please? or what can i do to fix it.

thanks.

Mounting holes are not present after conversion

Description:
Mounting holes are not present after converting a board from EasyEDA to KiCAD.

Expected result:
Mounting holes should be present after conversion.

See attached pictures.

Original:
pcb_bottom

After conversion:
Screenshot from 2020-02-05 15-18-36

Project files:

project.zip

KiCAD version (latest stable): 5.1.5
easyeda2kicad version: 1.4.1

If any other details are needed please let me know.
Thanks.

Unable to open KiCAD pcb file

Description:
I tried to convert one of my projects to KiCAD and the process seems to be successful (lots of warnings though). When I try to open the generated kicad_pcb file I get this error message and it refuses to go further.

Expected result:
Should be able to open the generated KiCAD pcb file without issues.

Screenshot from 2020-01-27 12-44-15

Original PCB:

Top view:
top

Bottom view:
bottom

KiCAD version (latest stable): 5.1.5
easyeda2kicad version: 1.3.2

Source file used for testing:
custom_pcb.zip

Thanks.

Documentation for building package in npm

I was able to npm install -g easyeda2kicad, but when I try to build it I am getting errors. I can run the program without issues, but when building to typescript it does not work.

I have made changes to the conversions of holes to via's and I would like to create a pull request, but since I cannot build, I cannot pull.
C:\Users\Anthony\AppData\Roaming\npm\node_modules\easyeda2kicad>npm run-script build

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] build: 'tsc'
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Anthony\AppData\Roaming\npm-cache\_logs\2020-03-03T21_09_19_260Z-debug.log

It's possible that I did something wrong.

I was able to import this project into vscode and debug it (to test my converter). It would really be useful for others.

Thanks

Components package rotation issues

Description:
It seems that this QFN 48 package is rotated 180 degree after conversion. This happens with other SMD components on the board also like some decoupling capacitors around the QFN 48 IC.

Expected result:
Should have the right rotation for component packages after conversion.

Please see attached screenshots.

After conversion:
package_rotation

Original:
original_package

EasyEDA project:
Touch_Switch_2ch.zip

I tested it using latest master code as it was now at this time of writing.

PCB outline left open

Description:
Seems that when dealing with an outline that follows an arc path then after conversion the contour is not enclosed properly.
Here I have an example of an arc and a segment that closes the path. At a first glance the arc seems to be rotated thus breaking up the connection with the enclosing segment/line.

Expected result:
PCB outline path should be fully closed.

See attached pictures.

Original:
Screenshot from 2020-01-29 15-34-47

Conversion result:
Screenshot from 2020-01-30 09-38-32

Project files:
project.zip

KiCAD version (latest stable): 5.1.5
easyeda2kicad version: 1.3.4

If any other details are needed please let me know.
Thanks.

"No copper" zones aren't respected

Description:
Seems that after the conversion the no copper zones are not taken into consideration and I get a full copper fill for the board. This happens for both sides of the board. See attached pictures and the original project file.

Expected result:
No copper zones should be respected after conversion.

Small note:

  • The "no copper" zones are stacked over the "full copper" zones creating the subtraction effect in the original design.

Conversion:
conversion_copper_areas

Original:
Screenshot from 2019-11-26 13-55-09

EasyEDA project:
Touch_Switch_2ch.zip

easyeda2kicad version: 1.3.1

Add support for 4-layer (or more) PCBs

Currently, we only convert layer numbers 1...15.

Looking at an EasyEDA board file, it seems like the inner layers are numbered starting from 21:

    "21~Inner1~#999966~false~false~false~~",
    "22~Inner2~#008000~false~false~false~~",
    "23~Inner3~#00FF00~false~false~false~~",
    "24~Inner4~#BC8E00~false~false~false~~",
    "25~Inner5~#70DBFA~false~false~false~~",
    ...

Thus, we need to find the corresponding layer names in KiCad, and probably also add them to the generated layers array in the output file.

Non-GND solid regions are missing after conversion

Description:
If I have in the original design a solid copper region created say for a MOSFET cooling and/or for high current paths which are not tied to GND then those aren't being translated.

Expected result:
The solid region tied to MOSFET drain pad should be present on both sides of the PCB.

See attached pictures.

Original:
original

Another two pictures (top/bottom) for reference:
Screenshot from 2020-01-30 10-01-03
Screenshot from 2020-01-30 10-00-45

Conversion result:
Screenshot from 2020-01-30 09-49-46

Project files:
project.zip

KiCAD version (latest stable): 5.1.5
easyeda2kicad version: 1.3.4

If any other details are needed please let me know.
Thanks.

file conversation error

Running easyeda2kicad v1.8.0:
Reading file 2.4g telecontrol board_2020-04-23_00-23-43.json...
Parsing content...
Detected EasyEDA board (PCB) file.
Warning: unsupported shape DIMENSION
Warning: unsupported shape DIMENSION
Warning: unsupported shape DIMENSION in footprint gge20f64733a18c5380
Warning: unsupported shape DIMENSION in footprint gge20f64733a18c5380
Warning: unsupported shape DIMENSION in footprint gge20f64733a18c5380
Warning: unsupported shape SVGNODE in footprint gge20f64733a18c5380
Warning: unsupported shape VIA in footprint gge16cbebb8866e1842
Warning: unsupported shape VIA in footprint gge16cbebb8866e1842
Warning: unsupported shape RECT
Warning: unsupported shape RECT
Warning: unsupported shape RECT
Warning: unsupported shape RECT
Warning: unsupported shape RECT
Warning: unsupported shape SVGNODE
Warning: unsupported shape SVGNODE
Warning: unsupported shape SVGNODE
Warning: unsupported shape SVGNODE
Warning: unsupported shape SVGNODE
Writing output to 2.4g telecontrol board_2020-04-23_00-23-43.kicad_pcb...

Conversion failed: InvalidCharacterError: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

name of the footprint

It should be better to use EasyEDA package name according to KiCAD footprint name.

1

2

Does able to convert schematic file also?

Thank you. It's quite a excellent tool. That can convert easyeda pcb file to kicad, include netlist.
Is there any way to covert PCB file to schematic file? Or directly convert schematic from easyeda?

Error in conversion

$ easyeda2kicad PCB1.0.json PCB1.0.kicad

Unsupported shape DIMENSION
Unsupported shape DIMENSION
Unsupported shape DIMENSION
Unsupported shape DIMENSION
Unsupported shape HOLE
Unsupported shape HOLE
Unsupported shape HOLE
Unsupported shape HOLE
/usr/local/lib/node_modules/easyeda2kicad/dist/spectra.js:26
.filter(function (it) { return it !== null; })
^

TypeError: Cannot read property 'filter' of undefined
at encodeObject (/usr/local/lib/node_modules/easyeda2kicad/dist/spectra.js:26:14)
at encodeValue (/usr/local/lib/node_modules/easyeda2kicad/dist/spectra.js:20:12)
at Array.map ()
at encodeObject (/usr/local/lib/node_modules/easyeda2kicad/dist/spectra.js:27:14)
at encodeValue (/usr/local/lib/node_modules/easyeda2kicad/dist/spectra.js:20:12)
at Array.map ()
at encodeObject (/usr/local/lib/node_modules/easyeda2kicad/dist/spectra.js:27:14)
at encodeValue (/usr/local/lib/node_modules/easyeda2kicad/dist/spectra.js:20:12)
at Array.map ()
at encodeObject (/usr/local/lib/node_modules/easyeda2kicad/dist/spectra.js:27:14)

Underlying object:

[
  'fp_line',
  [ 'start', -7.549997600000012, 3.599992800000038 ],
  [ 'end', 1.2500101999999913, 3.599992800000038 ],
  [ 'width', 0.049987199999999996 ],
  [ 'layer', undefined ],
  null,
  null
]

Original EasyEDA project:

[(https://easyeda.com/sundbyk/gotek)]

Parts of footprints silkscreen are flipped

Description:
Some parts of the footprint silkscreen drawing seem to be flipped. This may be related to #9 but I'm not sure if it's the same root cause.

Expected result:
Footprints silkscreen should render correctly.

See attached pictures.

Original:
Screenshot from 2020-01-30 10-01-03

After conversion:
Screenshot from 2020-01-30 10-21-54

Project files:
project.zip

KiCAD version (latest stable): 5.1.5
easyeda2kicad version: 1.3.4

If any other details are needed please let me know.
Thanks.

Error in Object.convertBoard

I get an error trying to convert:

$ easyeda2kicad ~/123ADC.json ~/123ADC.kicad_pcb
/usr/local/lib/nodejs/node-v12.14.1-linux-x64/lib/node_modules/easyeda2kicad/dist/board.js:379
    var outputObjs = __spreadArrays(nets.map(function (net, idx) { return ['net', idx, net]; }), flatten(input.shape.map(function (shape) { return convertShape(shape, nets); }))).filter(function (obj) { return obj != null; });
                                                                                                                     ^

TypeError: Cannot read property 'map' of undefined
    at Object.convertBoard (/usr/local/lib/nodejs/node-v12.14.1-linux-x64/lib/node_modules/easyeda2kicad/dist/board.js:379:118)
    at Object.<anonymous> (/usr/local/lib/nodejs/node-v12.14.1-linux-x64/lib/node_modules/easyeda2kicad/dist/main.js:18:42)
    at Module._compile (internal/modules/cjs/loader.js:955:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
    at Module.load (internal/modules/cjs/loader.js:811:32)
    at Function.Module._load (internal/modules/cjs/loader.js:723:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1043:10)
    at internal/main/run_main_module.js:17:11

$ easyeda2kicad -v
Version 1.3.4
$ node -v
v12.14.1

OS is Linux Mint 19.2. KiCad version 5.1.5-52549c5~84~ubuntu18.04.1
Attached file is what I attempted to import.

123ADC.json.zip

Some footprints silkscreen is too large

Description:
I just converted one of my designs and some capacitors get a pretty large footprint silkscreen drawing.

Expected result:
Footprints silkscreen should have the right size after conversion.

See attached pictures.

Original:
Screenshot from 2020-01-29 15-34-47

Conversion result:
Screenshot from 2020-01-29 15-35-31

Project files:
project.zip

KiCAD version (latest stable): 5.1.5
easyeda2kicad version: 1.3.2

If any other details are needed please let me know.
Thanks.

PTH pad converted into via

I have an issue where plated thru hole pad is converted into via on Kicad. The pad doesn't belong to any component, it's just added via Easyeda toolbox (keyboard shortcut P). Pads that belong to component (eg. pin header) is converted correctly.

Screenshot_1

Rectangular SMD pads seem to be 90 degree rotated

Description:
I noticed that some rectangular pads are rotated also causing collisions with vias (in this case a ground one).

Expected result:
Pads should have the right orientation.

See attached screenshots.

Conversion result:
shifted_gnd_via

Original:
original

EasyEDA project:
Touch_Switch_2ch.zip

easyeda2kicad version: 1.3.1

Missing nets after conversion

In some cases, the EasyEDA board file is missing the routerRule object with the list of nets. This currently results in no nets being converted. An example for such case is the board from #28.

We should be able to reconstruct the list of nets as we go over the PCB tracks/pads, and save this information in the converted kicad file.

unsupported layer id: 101

i got this output

Running easyeda2kicad v1.9.2:
Reading file C149588.json...
Parsing content...
Detected EasyEDA board (PCB) file.
Warning: unsupported layer id: 101
Warning: unsupported layer id: 100
Warning: unsupported layer id: 100
Warning: unsupported layer id: 99
Warning: unsupported shape SVGNODE in footprint gge30
Writing output to C149588.kicad_pcb...
Conversion done!

but no output file

C149588.txt

i attached the file just as a txt because github dont support json as attachment.

thanks for help

Component Footprint Missing Drill Holes

To reproduce:

  1. Open LCSC parts catalog and find, for example, component C319164 (micro USB female):
    https://lcsc.com/product-detail/USB-Connectors_XKB-Connectivity-U254-051T-4BH23-S2B_C319164.html/
  2. Open EasyEDA model by clicking "EasyEDA Model" button and export the EasyEDA PCB as JSON.
  3. Then try to convert this EasyEDA JSON to KiCad PCB using this tool.
  4. Open in KiCAD PCBNew. (Looks good)
  5. Hit Alt+3 to view 3D model preview, and see how their is no drill holes for the footprint.

Maybe this is expected from the converter tool. Do I need to further edit the footprint to add drill holes?

Error: unsupported file format

i got a ‘Error: unsupported file format‘ when using the online converter
the json file is exported from easyeda, and the library name is 'EC11E1834403'
the online converter show
Running easyeda2kicad v1.7.1: Reading file SW-TH_EC11E1820402.json... Parsing content... Error: unsupported file format
also i used the npm version(1.7.1) to conveter the same json file, there is no error but a waring 'Warning: unsupported shape PAD' seem like #34

this is the origin foorprint on easyeda
QQ截图20200408210314
and this is what it be in kicad(convert by npm version)
QQ截图20200408210349

can it export shematic part of easyeda to kicad too?!

based of this instruction:

Introducing: EasyEDA 2 KiCad

by getting this plugin, when i tried to export the file saved by easyeda (the json files of pcb and schematics could be seen here) :

enter image description here

My Problem is in exporting the Easyeda file to kicad pcb designing software, i tried to export two pcb and schematic part of easyeda project by


so@so-notebook:~/Desktop/trash/kicad/imported from easyeda/ipt power outler/Project_POWER IOT OUTLET_20200416140429$ easyeda2kicad "1-Schematic_POWER IOT OUTLET.json" board.kicad_pcb
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no version information available (required by node)
/usr/local/lib/node_modules/easyeda2kicad/dist/board.js:524
    var shapes = flatten(input.shape.map(function (shape) { return convertShape(shape, nets); }));
                                     ^

TypeError: Cannot read property 'map' of undefined
    at Object.convertBoard (/usr/local/lib/node_modules/easyeda2kicad/dist/board.js:524:38)
    at Object.<anonymous> (/usr/local/lib/node_modules/easyeda2kicad/dist/main.js:17:84)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)
    at bootstrap_node.js:609:3
so@so-notebook:~/Desktop/trash/kicad/imported from easyeda/ipt power outler/Project_POWER IOT OUTLET_20200416140429$ ls
'1-PCB_PCB_2020-04-16 03:17:41.json'   README.txt
'1-Schematic_POWER IOT OUTLET.json'
so@so-notebook:~/Desktop/trash/kicad/imported from easyeda/ipt power outler/Project_POWER IOT OUTLET_20200416140429$ easyeda2kicad "1-PCB_PCB_2020-04-16 03:17:41.json" board.kicad_pcb
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no version information available (required by node)
Warning: SOLIDREGION with arcs/circles are not supported yet!

so it could convert the PCB part of easyeda project but can not do it for Schematic part of it,a s you can see at above like this:

so@so-notebook:~/Desktop/trash/kicad/imported from easyeda/ipt power outler/Project_POWER IOT OUTLET_20200416140429$ easyeda2kicad "1-PCB_PCB_2020-04-16 03:17:41.json" board.kicad_pcb
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libssl.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no version information available (required by node)
node: /lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no version information available (required by node)
Warning: SOLIDREGION with arcs/circles are not supported yet!

Thanks for your attention.

Strange texts (e.g. gge638a534c459c248c) in the Cmts.User layer and other minor problems

Hi!

Thanks for the COOL tool!

I've just tried your online tool with one of my designs (attached below) and found some minor problems.

  1. The placement of the silk screen texts are off, which is unfortunate as it requires additional manual effort to cleanup the board. As this is a board for experimentations, having correctly placed texts is quite important. Probably what you meant with "... with the exception of texts which may look a bit different."

  2. While importing, I got several messages like:
    Warning: unsupported shape SVGNODE in footprint gge4bb415021ae37c69
    Probably correspondingly, I'm missing the OSHW logo in the silk screen in the middle of both sides of the board.
    ... seems to be already mentioned in bug #42

  3. There a some strange texts (e.g. gge638a534c459c248c) in the Cmts.User layer. The texts can also be found in the original .json file, so I suspect this is caused by some "unfiltered content".

Anyway, thanks for putting all the work into this!

Regards, ULFL

P.S: Have you thought about putting this to upstream Kicad? While they are currently busy fixing bugs for the 6.0 release, this seems to be a valuable extension for the future!

P.P.S: PCB .json
PCB_Breakout 40 Pin V2.0.json.zip

Incorrect footprint orientation

Footprints are always exported with orientation value of 0. This causes issues when exporting a pick-n-place file from the KiCad PCB file

Wrong pads orientation for QFN packages

Description:
I tried to convert one of my projects to KiCAD using this utility but it generates pads with wrong orientation for QFN packages (pads seem to be rotated 90 degree).

Expected result:
Pads should have the right orientation.

See attached pictures.

Thanks for this little nifty tool.

wrong_pads_orientation

EasyEDA project:
Touch_Switch_2ch.zip

Some silkscreen symbols are not being rendered completely

Description:
Seems that some symbols present on the PCB silkscreen (top and/or bottom) are not converted completely leading to an incomplete drawing. See the "high voltage symbols" in the attached pictures.

Expected result:
Any silkscreen symbols should be fully translated.

Original:
Screenshot from 2020-01-29 15-34-47

Conversion result:
Screenshot from 2020-01-30 09-30-27

Project files:
project.zip

KiCAD version (latest stable): 5.1.5
easyeda2kicad version: 1.3.4

If any other details are needed please let me know.
Thanks.

"Warning: unsupported shape SVGNODE [...]"

Hi.

I developed a simple PCB that I'd like to import in FreeCAD using this addon which seems to works great with some .kicad_pcb files from a KiCad project.

I can generate my EasyEDA file "input.json" an get the "output.kicad_pcb" in both Node library on my pc and the online converter. But FreeCAD can't open the file. As I pointed out it seems to work just fine with another directly generated .kicad_pcb files so I don't think the issue is the addon.

I got two warnings:

Running easyeda2kicad v1.8.0:
Reading file input.json...
Parsing content...
Detected EasyEDA board (PCB) file.
Warning: unsupported shape SVGNODE in footprint ggef90f9c042f2df78c
Warning: unsupported shape SVGNODE in footprint gge5701536e7eb809af
Writing output to input.kicad_pcb...
Conversion done!

I can make FreeCAD open the file if I open the "output.kicad_pcb" in KiCad and save it as another file. The input.json, output.kicad_pcb and the savedAsWorking.kicad_pcb files are attached. It may be an enhancement once it works to open the output in Kicad. But it would be really nice to have this converter to works just like a KiCad "Save as ..". Anyway thank you so much for your time and let me know if I can help you with more info.

inOutFiles.zip
SavedAsWorking.zip

Windows 10 Home
Chrome 83.0.4103.97
EasyEDA v6.3.53
Node v12.16.3
NPM v6.14.4

Board outline is not closed

When I convert my EasyEDA board it can be opened in KiCAD just fine. The outline is as expected but when I view the 3D Viewer I get an error "Board outline is not closed: Unable to find edge with and endpoint of (27.221,-0.444)".

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.