The YAM Api
api.yam.finance
The Yam API.
Home Page: https://docs.api.yam.finance
License: MIT License
"/treasury"
{
"yamHouse": 200,
"uma": 200,
"dpi": 200,
"weth": 200,
...
}
Add testing for the endpoints with automation.
For the treasury there are multiple data collection points to account for, should be cached every day. Everything should be converted to USDC for its rate. See yam treasury assets to understand where is it located at, and be able to pull it to then save it into the database and serve it on the endpoints.
/treasury
{
timestamp: TIMESTAMP, // time last saved when the data was collected
values: {
assets: {
...
"USDC": 400000,
"WETH": 600000,
"UMA": 100000,
...
},
total: 1100000 // total combined assets value when the data was collected
}
}
/treasury-history
{
...
{
timestamp: TIMESTAMP,
values: {
assets: {
...
"USDC": 0,
"WETH": 0,
"UMA": 0,
...
},
total: 0
}
},
{
timestamp: TIMESTAMP,
values: {
assets: {
...
"USDC": 400,
"WETH": 600,
"UMA": 100,
...
},
total: 1100
}
},
{
timestamp: TIMESTAMP,
values: {
assets: {
...
"USDC": 400000,
"WETH": 600000,
"UMA": 100000,
...
},
total: 1100000
}
},
...
}
Follow the .env.example
to add or use secrets if needed.
/treasury
endpoint calls./degenerative
to /synths
Update current treasury endpoint:
yyDAI+
to yUSD
yUSD
should be what we have currently on the treasury 0x97990b693835da58a281636296d2bf02787dea17
USDC
should be what we have currently on the multisig usdc balance 0x744D16d200175d20E6D8e5f405AEfB4EB7A962d1
USTONKSLP
should be the combination of the ustonks and usdc tokens of what we have in the USTONKS SEP pool 0xb9292b40cab08e5208b863ea9c4c4927a2308eee
(value should be in usdc)index
should be what we have in the timelock hereDescribe the bug:
Upon connecting to the YAM website and dashboard page, the treasury values do not load initially. When trying just now, the values loaded after a few minutes, without me having done anything.
To Reproduce:
Steps to reproduce the behavior:
Not sure if this is universally reproducible, but it has happened to me multiple times in the last 2 days. Changing wallets sometimes fixes it. Sometimes it fixes itself after a while.
Expected behavior:
Prices and charts load quickly.
Screenshots:
full output from the debugger below
You are accessing the MetaMask window.web3.currentProvider shim. This property is deprecated; use window.ethereum instead. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3 inpage.js:1:49382
MetaMask: The event 'close' is deprecated and may be removed in the future. Please use 'disconnect' instead.
For more information, see: https://eips.ethereum.org/EIPS/eip-1193#disconnect inpage.js:1:43460
MetaMask: The event 'networkChanged' is deprecated and may be removed in the future. Use 'chainChanged' instead.
For more information, see: https://eips.ethereum.org/EIPS/eip-1193#chainchanged inpage.js:1:43460
MetaMask: 'ethereum.send(...)' is deprecated and may be removed in the future. Please use 'ethereum.sendAsync(...)' or 'ethereum.request(...)' instead.
For more information, see: https://eips.ethereum.org/EIPS/eip-1193 inpage.js:1:43839
MetaMask: The event 'data' is deprecated and will be removed in the future. Use 'message' instead.
For more information, see: https://eips.ethereum.org/EIPS/eip-1193#message inpage.js:1:43460
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
Error parsing prop TypeError: ne[ae].returnValues.signatures[oe].split(...)[1] is undefined
e https://yam.finance/static/js/main.954b5130.chunk.js:1
c https://yam.finance/static/js/3.714c6283.chunk.js:2
_invoke https://yam.finance/static/js/3.714c6283.chunk.js:2
b https://yam.finance/static/js/3.714c6283.chunk.js:2
n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
promise callback*n https://yam.finance/static/js/3.714c6283.chunk.js:2
s https://yam.finance/static/js/3.714c6283.chunk.js:2
main.954b5130.chunk.js:1:331889
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 101 "connect" listeners added. Use emitter.setMaxListeners() to increase limit. inpage.js:8:22131
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 101 "close" listeners added. Use emitter.setMaxListeners() to increase limit. inpage.js:8:22131
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 101 "data" listeners added. Use emitter.setMaxListeners() to increase limit. inpage.js:8:22131
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 101 "error" listeners added. Use emitter.setMaxListeners() to increase limit. inpage.js:8:22131
If applicable, add screenshots to help explain your problem.
Device:
Migration of the gas median endpoints from the data api to the api.
3 endpoints to migrate from here:
app.get('/median', mongoFunctions.getLatestMedian);
app.get('/median-history', mongoFunctions.getMedians);
app.get('/median-range', mongoFunctions.getMedianRange);
"/apr" # (returns the below apr objects)
"/apr/yam" # (for yam apr in specific)
"/apr/degenerative" # (for degenerative apr in specific)
"/apr"
{
"yam": {
"farm": 55
},
"degenerative": {
"UGAS": {
"MAR21": 40,
"JUN21": 40
}
}
}
"/apr/yam"
{
"farm": 55
}
"/apr/degenerative"
{
"UGAS": {
"MAR21": 40,
"JUN21": 40
}
}
Read about it here.
Describe the bug:
We currently store the synth identifier as cycle. This should be changed since it is a combination of the cycle and other attributes like {name}-{cycle}{year}.
To Reproduce:
Steps to reproduce the behavior:
Expected behavior:
Instead of cycle we should display the key synth.
"/tvl" # (for all the tvl)
"/tvl/yam" # (for yam tvl in specific)
"/tvl/umbrella" # (for umbrella tvl in specific)
"/tvl/degenerative" # (for degenerative tvl in specific)
"/tvl"
6000000
"/tvl/yam"
{
"values": {
"farm": 5356150,
},
"total": 5356150,
}
"/tvl/degenerative"
{
"values": {
"UGAS": {
"MAR21": 0,
"JUN21": 0,
},
"UVOL": {
"JUN21": 200,
},
},
"total": 200,
}
Add treasury history endpoint + docs:
{
timestamp: TIMESTAMP,
values: {
assets: {
"DPI": 154057.42,
"GITCOIN": 44965.41,
"INDEX": 487165.24,
"INDEXLP": 2837992.33,
"SUSHI": 674591.54,
"UMA": 177123.28,
"USDC": 817.84,
"USTONKSLP": 571104.94,
"WETH": 804516.69,
"YAMHOUSE": 1061100,
"YUSD": 44265.85
},
total: 20000000
}
}
Describe the bug:
The APR endpoint returns an object like so:
{"UGAS":{"JUN":6.238587054668649},"UPUNKS":{"SEP":0.20185907125184896},"USTONKS":{"JUN":42.196161533799106}}
The issue is that uPUNKS cycle is now denoted as a number (09) instead of the word (SEP).
Please change to either 9
or 09
"/gas"
{
"slow": 134,
"normal": 134,
"fast": 134
}
"/tx/:txHash"
{
"fees": 0.0345115,
}
Notes:
synths
on the same level of farm
The endpoint /synths/assets
should automatically load what exists in the assets.json file populating the assets data in a returned object.
Describe the issue of the fix request:
The uGas reference price (median) is not updating on the Yam Synths website or on the API endpoint. Both https://data.yam.finance/median and https://data.yam.finance/median-history show an old timestamp and price (2021.10.06).
Links related:
https://synths.yam.xyz/explore/uGAS
https://data.yam.finance/median
https://data.yam.finance/median-history
We need to add a primary call to the coingecko api with a fallback to a secondary api of public choice, to get the yam 30 days avg price.
30d
should be the last 1 month full number of days, value saved every day for the yam price, averaging it over the days to get the value (from 1st to last day of the month).now
should be the last 30 days from today, value is also saved every day (example today is the 14th of the month, we average it as well over the days from: 14th day of last month - to date, this value is more up to date and not a fixed value)./30avg
{
"30d": "2.00",
"now": "1.63",
}
Follow the .env.example
to add or use secrets if needed.
We need to add a primary call to the etherscan api with a fallback to a secondary api of public choice to get the updated gas fees value of ethereum blockchain.
/gas
{
"slow": 124,
"normal": 134,
"fast": 164
}
Follow the .env.example
to add or use secrets if needed.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.