Coder Social home page Coder Social logo

5e-database's People

Contributors

adm7373 avatar adrpadua avatar andruc avatar antchouay12 avatar astrelion avatar bagelbits avatar breni-tiber avatar brittonhayes avatar caldane avatar dependabot[bot] avatar ecshreve avatar fergcb avatar johnsenner avatar kreemer avatar markbastian avatar mikkelpaulson avatar ogregoire avatar oznogon avatar radkostanev avatar ragnork2 avatar rarst avatar rbmy avatar sleeplessone1917 avatar stevenwinfo avatar syntaxaire avatar tenari avatar tognee avatar wyrmwood avatar wyzards avatar zachanator070 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

5e-database's Issues

Convert Spellcasting Ability information into a full object

"special_abilities": [{
    "name": "Spellcasting",
    "desc": "The acolyte is a 1st-level spellcaster. Its spellcasting ability is Wisdom (spell save DC 12, +4 to hit with spell attacks). The acolyte has following cleric spells prepared:\n\n• Cantrips (at will): light, sacred flame, thaumaturgy\n• 1st level (3 slots): bless, cure wounds, sanctuary",
    "attack_bonus": 0
}]

would read something like

"special_abilities": [
    {
        "name": "Spellcasting",
        "desc": {
            "spellcasting_level":1,
            "spellcasting_ability":"wisdom",
            "spellcasting_dc":12,
            "spellcasting_attack_modifier":4,
            "spellcasting_school":"cleric",
            "spells":{
                "cantrips": [ "light", "sacred flame", "thaumaturgy" ],
                "1st":[ "bless", "cure wounds", "sanctuary" ]
            },
            "spell_slots":{
                "1st":3
            }
        }
    }
]

I'd love input/thoughts on structure, key names, etc above.

Ranger Starting Equipment

Here is what currently present for the Starting equipment of a Ranger.
{ "index": 8, "class": { "url": "http://www.dnd5eapi.co/api/classes/8", "name": "Ranger" }, "starting_equipment": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/36", "name": "Longbow"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/54", "name": "Arrow"}, "quantity": 20}], "choices_to_make": 3, "choice_1": [{ "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/43", "name": "Scale Mail"}, "quantity": 1}] }, { "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/28", "name": "Shortsword"}, "quantity": 1}] }], "choice_2": [{ "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/156", "name": "Dungeoneer's Pack"}, "quantity": 2}] }, { "choose": 2, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/1", "name": "Club"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/2", "name": "Dagger"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/3", "name": "Greatclub"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/4", "name": "Handaxe"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/5", "name": "Javelin"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/6", "name": "Light hammer"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/7", "name": "Mace"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/8", "name": "Quarterstaff"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/9", "name": "Sickle"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/10", "name": "Spear"}, "quantity": 1}] }], "choice_3": [{ "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/156", "name": "Dungeoneer's Pack"}, "quantity": 1}] }, { "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/158", "name": "Explorer's Pack"}, "quantity": 1}] }], "url": "http://www.dnd5eapi.co/api/startingequipment/8" }

This doesn't match the official PHB, or make sense between the choices.

  • (A) scale mail or (b) leather armor
  • (a) two shortswords or (b) two simple melee weapons
  • (a) a dungeoneer's pack or (b) and explorer's pack
  • a longbow and a quiver of 20 arrows

It should really be:
{ "index": 8, "class": { "url": "http://www.dnd5eapi.co/api/classes/8", "name": "Ranger" }, "starting_equipment": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/36", "name": "Longbow"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/54", "name": "Arrow"}, "quantity": 20}], "choices_to_make": 3, "choice_1": [{ "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/43", "name": "Scale Mail"}, "quantity": 1}] }, { "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/39", "name": "Leather Armor"}, "quantity": 1}] }], "choice_2": [{ "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/28", "name": "Shortsword"}, "quantity": 2}] }, { "choose": 2, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/1", "name": "Club"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/2", "name": "Dagger"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/3", "name": "Greatclub"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/4", "name": "Handaxe"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/5", "name": "Javelin"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/6", "name": "Light hammer"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/7", "name": "Mace"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/8", "name": "Quarterstaff"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/9", "name": "Sickle"}, "quantity": 1}, { "item": { "url": "http://www.dnd5eapi.co/api/equipment/10", "name": "Spear"}, "quantity": 1}] }], "choice_3": [{ "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/156", "name": "Dungeoneer's Pack"}, "quantity": 1}] }, { "choose": 1, "type": "equipment", "from": [{ "item": { "url": "http://www.dnd5eapi.co/api/equipment/158", "name": "Explorer's Pack"}, "quantity": 1}] }], "url": "http://www.dnd5eapi.co/api/startingequipment/8" }

Changes to the repo, update the database

This will probably have to wait until after the repos are transferred. But it would nice to have some CD for DB changes. I'll most likely use BK to set it up. I'll also put in a test that just verifies all the files are valid JSON before we try to upload.

New Data?

There is a lot of other data for monster, classes, races, etc. for dnd.
Are you planning on adding this data to database?
Would it be ok if I submitted pull requests for new data added?
-------I know it won't work with the API, but at least it can be in the database

Incorrect encoding

Hi

Just been helping a friend debug some encoding issue with the API. Namely, the example we were on was for https://github.com/adrpadua/5e-database/blob/master/5e-SRD-Spells.json#L18.

Seems Windows-1252 has been stored as UTF-8 or vice versa (not quite sure which way around it is).

Solution for us was to do the following.

import requests

res = requests.get('http://www.dnd5eapi.co/api/spells/1')
data = res.json()

print(data['material'])
>>> 'Powdered rhubarb leaf and an adder’s stomach.'

data['material'] = data['material'].encode('windows-1252').decode('utf-8')
print(data['material'])
>>> 'Powdered rhubarb leaf and an adder’s stomach.'

The HTTP response headers are being sent in UTF-8 format, which is why I reckon this is being sent wrong, rather than being corrected by the library when it detects the encoding.

Hope this is of help.

Race Traits contain incorrect URL

5e-SRD-Races.json
Some of the Racial Traits for the different races have the incorrect url associated with the name in the Traits section.

EX:
Elf Traits
traits": [ { "url": "http://www.dnd5eapi.co/api/traits/5", "name": "Darkvision (Elf)"
Darkvision is http://www.dnd5eapi.co/api/traits/1

Issue opening up a connection to DB

Hey all, just found this lovely project and want to contribute! Is there a process for making a user, pass for myself or are we all on one super admin user? If so can you point me to where those creds are stored? Thanks!

Remove base domain from URLs

This would allow this database to more easily be used with other projects and not be tied directly to the API.

Can some values be null?

Yesterday I wanted to clean up the language file, which I did. But I noticed that in the SRD, a big line strikes through the script column of the "deep speech" language. This basically means that there is no script.

However the file https://github.com/adrpadua/5e-database/blob/master/5e-SRD-Languages.json currently contains the actual value "none". There is no indicator that there is no script: the script currently has the value "none". In my view, this is incorrect.

There are usually two alternatives to this:

  • the first is to remove the field entirely. If we do that, then the file is inconsistent with other files because the key is usually present but maps to an empty value, usually an array. Check the race file: it has that behavior.
  • the second alternative is to use null. This way all the fields are set, but the actual value is set to null, and not "none". I personally like it less than the first alternative, but it keeps the consistency with the other files and reduce the work to provide.

So in short, we have three options:

  1. Keep as is, having the field set to a dummy value

     {
     	"index": 12,
     	"name": "Deep Speech",
     	"type": "Exotic",
     	"typical_speakers": ["Aboleths", "Cloakers"],
     	"script": "none",
     	"url": "http://www.dnd5eapi.co/api/languages/12"
     }
    
  2. Remove the field, opening the door to inconsistency.

     {
     	"index": 12,
     	"name": "Deep Speech",
     	"type": "Exotic",
     	"typical_speakers": ["Aboleths", "Cloakers"],
     	"url": "http://www.dnd5eapi.co/api/languages/12"
     }
    
  3. Change "none" to null so that the key is present, but the value effectively shows that there is no value.

     {
     	"index": 12,
     	"name": "Deep Speech",
     	"type": "Exotic",
     	"typical_speakers": ["Aboleths", "Cloakers"],
     	"script": null,
     	"url": "http://www.dnd5eapi.co/api/languages/12"
     }
    

In the future, it might be good to tend towards 2 for everything, but it might require too much work at once. So I strongly suggest that null is accepted for the time being.

Monster multiattacks hard to parse

I'm wondering if it's possible to define multiattacks in a way that's more easily parsed in code. Right now, the only place that specifies all of the possible attacks is the "desc" field of the "Multiattack" action. For example, in trying to figure out which attacks are available to the "Bandit Captain" on their turn, the only information I have is, "The captain makes three melee attacks: two with its scimitar and one with its dagger. Or the captain makes two ranged attacks with its daggers."

This is tricky to parse out programmatically. One option I can think of is to maybe add an explicit list of "action sets", where each set is considered a potential set of actions for each turn, something like:

"action_sets": [
 	{
		"name": "Multiattack",
		"actions": [
			{
				"name": "Scimitar",
				"count":  2,
				"type": "melee"
			},
			{
				"name": "Dagger",
				"count":  1,
				"type": "melee"
			}
		]
	},
 	{
		"name": "Multiattack",
		"actions": [
			{
				"name": "Dagger",
				"count":  2,
				"type": "ranged"
			}
		]
	}
]

I wouldn't mind giving this a shot if we can agree on a format.

Setup test to verify non-SRD information is not included.

I believe Travis-CI will run for free against a github repo. As long as PRs are used rather than direct merge to master, a simple test script could be written to read the JSON files, and validate the items.
For example, load the monsters-SRD.json, loop all the names and verify a hard-coded list of names. If anyone adds additional, tests fail.

Ancient White Dragon missing legendary actions in JSON

Ancient White Dragon is at monsters/24/. Missing legendary actions should be as follows:
"legendary_actions": [
{
"attack_bonus": 0,
"desc": "The dragon makes a Wisdom (Perception) check.",
"name": "Detect"
},
{
"attack_bonus": 0,
"desc": "The dragon makes a tail attack.",
"name": "Tail Attack"
},
{
"attack_bonus": 0,
"desc": "The dragon beats its wings. Each creature within 15 ft. of the dragon must succeed on a DC 22 Dexterity saving throw or take 15 (2d6 + 8) bludgeoning damage and be knocked prone. The dragon can then fly up to half its flying speed.",
"name": "Wing Attack (Costs 2 Actions)"
}
],

Half-Elf should have two non-CHA ability scores increased by 1.

For the Half-Elf, on page 6, the SRD states:

Ability Score Increase.
Your Charisma score increases by 2, and two other ability scores of your choice increase by 1.

The part about "two other ability scores of your choice increase by 1" isn't present in the database.

Standardize use of Unicode punctuation

The files currently contain a mixture of ASCII and Unicode punctuation. For example, in 5e-SRD-Spells.json the usages can’t and can't both appear. The escaped string \"Attack that creature,\" appears in Dominate Beast, but the Unicode double quotation marks are used with “Attack that creature,” in Dominate Monster.

The Unicode punctuation probably came from copying and pasting from the SRD PDF which was produced in Word from WOTC, whereas the ASCII versions have come from manual edits.

I'd like to propose a PR that would standardize the use of Unicode in the project as follows:

  • Replace all Unicode single right quotation marks with ASCII apostrophe
    e.g. doesn’t becomes doesn't
    The reasoning for changing these is that the ASCII apostrophe is the standard for typing English words, and the visual difference is small. Also, JetBrains IDEs do not recognize the Unicode apostrophe, making simple words like aren’t fail spell checking.

  • Use Unicode left and right double quotation marks for all embedded quotes
    e.g. \"Attack\" becomes “Attack”
    The reasoning for changing this is that the Unicode marks are already prevalent from the official SRD, and they are not required to be escaped in JSON. There is a significant visual difference between the two, and as D&D is a largely text-based game, it gives a more booklike appearance to the output.
    The downside is that most keyboards do not include the Unicode version, but I think the visual tradeoff is worth it.

Combined damage types

While reviewing a PR I noticed for some of the monsters we show damage dice and damage bonus but we don't differentiate between what kinds of damage each roll is. It might not be a bad idea to determine a better way to convey damage. I'll probably think on this some when I have some time but I'll happily review a PR if anyone wants to take a crack at it.

Webhook

We use this database for lookup functions programmed into our d&d 5e discord bot, which can be found here: https://github.com/RubenJ01/rewrite. We have also pushed a fair amount of updates to the database with several corrections. We were wondering if we could set up a webhook with this repository so we can see when something changes on our discord server. Thanks in advance!

Url property of Character Class levels does not return valid endpoints.

Howdy - first of all, THANK YOU for putting the work into this project - currently need to fetch/parse the data on a project I started in order to learn React/Redux and this is super convenient!

Issue: The url property values for some of the Classes resources do not seem to be valid endpoints. I have not confirmed for all endpoints but at least whats needed in my case, none of the url values in class_levels for a Character Class are valid.

For instance, say I retrieved the data for a "Fighter" class using http://www.dnd5eapi.co/api/classes/fighter (Side note: http://www.dnd5eapi.co/api/classes/Fighter is also not valid), the relevant part of the returned data is:

{ ... "class_levels": { "url": "http://www.dnd5eapi.co/api/classes/Fighter/levels", "class": "Fighter" }, ... }

If I make a request to the resource at http://www.dnd5eapi.co/api/classes/Fighter/levels from the fetched class_levels data to get the next batch, nothing is returned.

However, if I request http://www.dnd5eapi.co/api/classes/fighter/levels (Notice the lowercased path), data is successfully retrieved. So it seems that since the parent class path has to be be consistent within the resource url in order to work.

Since I am using retrieved data to make the next request, the workaround I am currently using is passing the url to a utility function to ensure lower case.

Subrace object is invalid

Check out "starting proficiencies" -- there's an extra colon at the end of the quoted text that needs to be removed:
{ "_id":"5a52bbf7559f00418e532cf8", "index":1, "name":"Hill Dwarf", "race":{ "url":"http://www.dnd5eapi.co/api/races/1", "name":"Dwarf"}, "desc":"As a hill dwarf, you have keen senses, deep intuition, and remarkable resilience.", "ability_bonuses":[0,0,0,0,1,0], "starting_proficiencies:":[], "languages":[], "racial_traits":[ { "name":"Dwarven Toughness", "url":"http://www.dnd5eapi.co/api/traits/4" }], "url":"http://www.dnd5eapi.co/api/subraces/1" }

-1 level spells?

Howdy!

First of all, great work on this. I'm messing around with a small Clojure project to parse this info and I'm glad somebody has done the hard work for me 👍

Just curious - the following spells have a spell level of -1 - Is this correct?

  • Druidcraft
  • Fire Bolt
  • Poison Spray
  • Spare the Dying
  • Vicious Mockery

Regards,
James.

Wrong ability score name for acrobatics

In the ability score library for acrobatics sub 'name' it shows 'STR' when it should be 'DEX' if I am not mistaken
{"_id":"58f40b8dc9e7ce9f72153252","index":1,"name":"Acrobatics","desc":["Your Dexterity (Acrobatics) check covers your attempt to stay on your feet in a tricky situation, such as when you’re trying to run across a sheet of ice, balance on a tightrope, or stay upright on a rocking ship’s deck. The GM might also call for a Dexterity (Acrobatics) check to see if you can perform acrobatic stunts, including dives, rolls, somersaults, and flips."],"ability_score":{"url":"http://www.dnd5eapi.co/api/ability-scores/1","name":**"STR"**},"url":"http://www.dnd5eapi.co/api/skills/1"}

Open Source, but which license?

Hi!

Just found your 5e API and Database. Great piece of work! And also it is great to hear you have it opened to the world. But this repo cannot be legally forked/copied/reused unless you include license file in it.

Can you include such file? GitHub provides pre-generated files to help out.

If I reuse or share this lib, I would like to know how should I refer to you properly :)

Gnome subraces

The Gnome subraces (Forest Gnome and Rock Gnome) with ID's /subraces/7 and /subraces/8 respectively are missing in the API. Can you fix it, please?

Non-SRD monsters should be removed

A few monsters are present in the database but should be removed.

So far I could only spot the Ancient Blue Dracolich, but I suspect more are present. I'll check this deeper in the following days.

Breath Weapons could be better written

This could be better written using the choice structure as well as showing the recharge rate.

{
        "name": "Breath Weapons (Recharge 5-6)",
        "desc": "The dragon uses one of the following breath weapons.\nFire Breath. The dragon exhales fire in an 20-foot line that is 5 feet wide. Each creature in that line must make a DC 11 Dexterity saving throw, taking 14 (4d6) fire damage on a failed save, or half as much damage on a successful one.\nSleep Breath. The dragon exhales sleep gas in a 15-foot cone. Each creature in that area must succeed on a DC 11 Constitution saving throw or fall unconscious for 1 minute. This effect ends for a creature if the creature takes damage or someone uses an action to wake it.",
        "attacks": [
          {
            "name": "Fire Breath",
            "dc": {
              "dc_type": {
                "name": "DEX",
                "url": "http://www.dnd5eapi.co/api/ability-scores/2"
              },
              "dc_value": 11,
              "success_type": "half"
            },
            "damage": [
              {
                "damage_type": {
                  "name": "Fire",
                  "url": "http://www.dnd5eapi.co/api/damage-types/4"
                },
                "damage_dice": "4d6",
                "damage_bonus": 0
              }
            ]
          },
          {
            "name": "Sleep Breath",
            "dc": {
              "dc_type": {
                "name": "CON",
                "url": "http://www.dnd5eapi.co/api/ability-scores/3"
              },
              "dc_value": 11,
              "success_type": "none"
            }
          }
        ]
      }

Add a script to reindex files or change how we id

This would probably be an all or nothing script as it would need to reindex associations as well.

Alternatively, we could set ids to not be sequential numbers. Instead have them be something random. Something akin to a UUID comes to mind. This would avoid needing to reindex ever again. But there needs to be a standard way to generate a new id.

@ogregoire @Alex-frazer Thoughts?

Add more API languages.

Hey, love this repo!

I play DnD in Ukraine, and we use Russian as our primary language for the parties, so I would love to have this API available in different languages.

Maybe creating folders like en, ru and just storing the different json files there would be a good option?

I am ready to contribute, just don't want to deploy my own API :)

Extra colon for equipment "weapon_category" key

For all equipment that is in the"Weapon" equipment category, there's an extra colon at the end of the "weapon_category" key. Should be weapon_category: {...category}

Sample data fetched from http://www.dnd5eapi.co/api/equipment/3
{ _id: "5bce91275b7768e792017db1", index: 3, name: "Greatclub", equipment_category: "Weapon", **weapon_category:: "Simple",** // Should be weapon_category: "Simple" weapon_range: "Melee", ... }

Error searching for Equipment Packs

I might just need to php code help, but I have a website that uses this API for the data. When searching through the equipment, my results always return invalid when I search for any equipment packs, ie Explorer's pack (equipment/155 - 160).
I also can only however search for items like Alchemist's supplies (equipment/161-177) if I copy and paste it directly from the overall list.
The apostrophe doesn't match what the keyboard inputs.
{"name":"Scholar's Pack","url":"http://www.dnd5eapi.co/api/equipment/160"},{"name":"Alchemist’s supplies","url":"http://www.dnd5eapi.co/api/equipment/161"}

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.