einschmidt / addon-caddy-2 Goto Github PK
View Code? Open in Web Editor NEWCaddy 2 is a powerful, open source web server with automatic HTTPS
License: MIT License
Caddy 2 is a powerful, open source web server with automatic HTTPS
License: MIT License
Does Caddy log all remote page loads? I'd like to effectively build a log of IPs that are trying to load 443, I can see IPs in the add-on log when a connection is refused. Any way to enable this for successful connections?
Thanks!
Home Assistant 2024.5.5
Supervisor 2024.05.1
Operating System 12.3
Frontend 20240501.1
With version v1.5.7, Caddy no longer starts. I had to restore the backup of 1.5.6 version
The error displayed was this:
Registratore: homeassistant.components.hassio
Fonte: components/hassio/websocket_api.py:135
Integrazione: Home Assistant Supervisor (documentazione, problemi)
Prima occorrenza: 12:09:23 (8 occorrenze)
Ultima registrazione: 12:13:43
Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
Logs:
2024-06-02 12:09:23.823 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
2024-06-02 12:10:09.901 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
2024-06-02 12:10:31.208 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
2024-06-02 12:10:55.370 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
2024-06-02 12:11:00.670 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
2024-06-02 12:12:33.439 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
2024-06-02 12:13:28.109 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
2024-06-02 12:13:43.151 ERROR (MainThread) [homeassistant.components.hassio] Failed to to call /addons/c80c7555_caddy-2/stats - Container addon_c80c7555_caddy-2 is not running
After setting up the reverse proxy and everything working to properly point where it needs to be i noticed a new issue pop up. I can no longer play mp3 files on alexa media devices in home assistant.
It seems like alexa doesnt allow people using letsencrypt
Hi
I'm not sure if this is the right place, but after upgrading to the newest Caddy (2.6.1) Home Assistant refuses to load on both Safari and the app on iOS 16 (not tested on other versions), it just loads up a blank screen, however I can see that the app still has a WebSocket connection to Home Assistant even when the UI does not show up.
Resetting the app causes a HTTP error 421 to show up when trying to setup.
To make the app/safari work correct I had to add the following to my config:
{
servers {
protocols h1 h2
}
}
That is a global config to disable HTTP/3.
If anyone knows how to fix this so I can reenable HTTP/3, then let me know, otherwise this may help others that end up in the same situation.
Hi
I tried placing in the /share/caddy folder a custom binary built with xcaddy and the latest beta found on the caddy github page, but the add-on fails to start
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service base-addon-banner: starting
-----------------------------------------------------------
Add-on: Caddy 2
Open source web and proxy server with automatic HTTPS
-----------------------------------------------------------
Add-on version: 1.4.1
You are running the latest version of this add-on.
System: Home Assistant OS 10.2 (aarch64 / raspberrypi4-64)
Home Assistant Core: 2023.6.2
Home Assistant Supervisor: 2023.06.2
-----------------------------------------------------------
Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
s6-rc: info: service base-addon-banner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service base-addon-log-level: starting
s6-rc: info: service fix-attrs successfully started
Log level is set to DEBUG
s6-rc: info: service base-addon-log-level successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service caddy: starting
s6-rc: info: service caddy successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
INFO: Prepare Caddy...
INFO: Found custom Caddy at /share/caddy/caddy
/usr/bin/caddy.sh: line 8: 184 Illegal instruction (core dumped) "${CADDY_PATH}" version
INFO: Service caddy exited with code 132 (by signal 0)
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service caddy: stopping
s6-rc: info: service caddy successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service base-addon-log-level: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service base-addon-log-level successfully stopped
s6-rc: info: service base-addon-banner: stopping
s6-rc: info: service base-addon-banner successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
When using custom 2.6.4 binaries, it works just fine.
I also tested the new binary on another machine and it's working there.
Hi, I am seem to facing some issues trying to configure caddy2. I get the following error:
adapting config using caddyfile: parsing caddyfile tokens for 'tls': getting module named 'dns.providers.duckdns': module not registered: dns.providers.duckdns, at /share/caddy/Caddyfile:7
Full log:
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service base-addon-banner: starting
-----------------------------------------------------------
Add-on: Caddy 2
Open source web and proxy server with automatic HTTPS
-----------------------------------------------------------
Add-on version: 1.5.4
You are running the latest version of this add-on.
System: Home Assistant OS 12.1 (amd64 / generic-x86-64)
Home Assistant Core: 2024.3.1
Home Assistant Supervisor: 2024.03.0
-----------------------------------------------------------
Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
s6-rc: info: service base-addon-banner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service base-addon-log-level: starting
s6-rc: info: service fix-attrs successfully started
Log level is set to INFO
s6-rc: info: service base-addon-log-level successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service caddy: starting
s6-rc: info: service caddy successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
INFO: Prepare Caddy...
INFO: Use built-in Caddy
v2.7.6 h1:w0NymbG2m9PcvKWsrXO6EEkY9Ru4FJK8uQbYcev1p3A=
INFO: Prepare Caddyfile...
INFO: Caddyfile found at /share/caddy/Caddyfile
INFO: Run Caddy...
{"level":"info","ts":1711030709.788712,"msg":"using provided configuration","config_file":"/share/caddy/Caddyfile","config_adapter":""}
Error: adapting config using caddyfile: parsing caddyfile tokens for 'tls': getting module named 'dns.providers.duckdns': module not registered: dns.providers.duckdns, at /share/caddy/Caddyfile:7
INFO: Service caddy exited with code 1 (by signal 0)
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service caddy: stopping
s6-rc: info: service caddy successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service base-addon-log-level: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service base-addon-log-level successfully stopped
s6-rc: info: service base-addon-banner: stopping
s6-rc: info: service base-addon-banner successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
Caddyfile:
{
email [email protected]
}
mydomain.duckdns.org {
tls {
dns duckdns mytoken
}
reverse_proxy https://192.168.1.105:9090
}
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
This repository currently has no open or pending branches.
caddy-2/Dockerfile
.github/workflows/ci.yaml
.github/workflows/deploy.yaml
.github/workflows/labels.yaml
.github/workflows/lock.yaml
.github/workflows/pr-labels.yaml
.github/workflows/release-drafter.yaml
.github/workflows/stale.yaml
caddy-2/build.yaml
ghcr.io/hassio-addons/base 16.2.0
ghcr.io/hassio-addons/base 16.2.0
ghcr.io/hassio-addons/base 16.2.0
ghcr.io/hassio-addons/base 16.2.0
caddy-2/Dockerfile
caddyserver/caddy v2.8.4
caddy-2/Dockerfile
alpine_3_20/nss-tools 3.101-r0
No errors or warnings in either the HASS or Caddy 2 logs. Ping my_subdomain.duckdns.org works.
Partial restore only Caddy 2 1.0.4 and all works again.
How do I securely send my Caddyfile (if needed)?
System Health
version: core-2021.8.8
installation_type: Home Assistant Supervised
dev: false
hassio: true
docker: true
user: root
virtualenv: false
python_version: 3.9.6
os_name: Linux
os_version: 5.10.0-8-amd64
arch: x86_64 (Lenovo M93p 8GB, SSD)
timezone: America/New_York
GitHub API: ok
Github API Calls Remaining: 5000
Installed Version: 1.15.1
Stage: running
Available Repositories: 949
Installed Repositories: 31
logged_in: true
subscription_expiration: September 16, 2021, 8:00 PM
relayer_connected: true
remote_enabled: false
remote_connected: false
alexa_enabled: true
google_enabled: false
can_reach_cert_server: ok
can_reach_cloud_auth: ok
can_reach_cloud: ok
host_os: Debian GNU/Linux 11 (bullseye)
update_channel: stable
supervisor_version: supervisor-2021.06.8
docker_version: 20.10.8
disk_total: 101.9 GB
disk_used: 32.6 GB
healthy: true
supported: failed to load: Unsupported
supervisor_api: ok
version_api: ok
installed_addons: Dasshio (0.3.8), Duck DNS (1.13.0), ESPHome (dev) (dev), FTP (4.2.1), Mosquitto broker (6.0.1), Node-RED (10.0.0), Portainer (2.0.0), Terminal & SSH (9.1.3), WireGuard (0.5.1), ZeroTier One (0.11.1), Samba share (9.5.1), Z-Wave JS to MQTT (0.24.1), DOODS-amd64 (2), motionEye (0.15.1), Caddy 2 (1.0.4)
dashboards: 3
resources: 18
views: 32
mode: yaml
Anyone had issues with your addon/docker and route53 credentials?
Unless it's something I have done I'm guess your addon is not passing credentials on to route53 plugin correctly.
I have many other installs of route53 with caddy (including my own caddy docker) that work fine with the same aws credentials I am using here
- name: ACCESS_KEY
value: redacted
- name: SECRET_KEY
value: redacted
operation error Route 53: ListHostedZonesByName, https response error StatusCode: 403, RequestID: 278d1598-46eb-46a7-a47d-87c209f26733, api error InvalidClientTokenId: The security token included in the request is invalid.
`
log looks good until that line. loads custom caddy binary loads credentials correctly
(r53) {
tls {
dns route53 {
max_retries 10
access_key_id (env.ACCESS_KEY)
secret_access_key (env.SECRET_KEY)
}
}
}
# HA server Server
https://home.redacted.net {
import r53
reverse_proxy http://ha.redacted.net:8123
}
it uses this caddy plugin.
https://github.com/caddy-dns/route53
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service base-addon-banner: starting
-----------------------------------------------------------
Add-on: Caddy 2
Open source web and proxy server with automatic HTTPS
-----------------------------------------------------------
Add-on version: 1.5.4
You are running the latest version of this add-on.
System: Home Assistant OS 11.2 (amd64 / generic-x86-64)
Home Assistant Core: 2023.12.3
Home Assistant Supervisor: 2023.12.0
-----------------------------------------------------------
Please, share the above information when looking for help
or support in, e.g., GitHub, forums or the Discord chat.
-----------------------------------------------------------
s6-rc: info: service base-addon-banner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service base-addon-log-level: starting
s6-rc: info: service fix-attrs successfully started
Log level is set to DEBUG
s6-rc: info: service base-addon-log-level successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service caddy: starting
s6-rc: info: service caddy successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
INFO: Setting ACCESS_KEY to redacted
INFO: Setting SECRET_KEY to redacted
INFO: Setting REGION to us-west-2
INFO: Prepare Caddy...
INFO: Found custom Caddy at /share/caddy/caddy
v2.7.6 h1:w0NymbG2m9PcvKWsrXO6EEkY9Ru4FJK8uQbYcev1p3A=
INFO: Prepare Caddyfile...
INFO: Caddyfile found at /share/caddy/Caddyfile
INFO: Run Caddy...
DEBUG: '/share/caddy/caddy' run --config '/share/caddy/Caddyfile' ''
{"level":"info","ts":1703549352.5024166,"msg":"using provided configuration","config_file":"/share/caddy/Caddyfile","config_adapter":""}
{"level":"warn","ts":1703549352.5065053,"msg":"Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies","adapter":"caddyfile","file":"/share/caddy/Caddyfile","line":3}
{"level":"info","ts":1703549352.508861,"logger":"admin","msg":"admin endpoint started","address":"localhost:2019","enforce_origin":false,"origins":["//localhost:2019","//[::1]:2019","//127.0.0.1:2019"]}
{"level":"info","ts":1703549352.5092607,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc0004b2400"}
{"level":"info","ts":1703549352.5094357,"logger":"http.auto_https","msg":"server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS","server_name":"srv0","https_port":443}
{"level":"info","ts":1703549352.5094538,"logger":"http.auto_https","msg":"enabling automatic HTTP->HTTPS redirects","server_name":"srv0"}
{"level":"info","ts":1703549352.5105596,"logger":"http","msg":"enabling HTTP/3 listener","addr":":443"}
{"level":"info","ts":1703549352.5107925,"logger":"http.log","msg":"server running","name":"srv0","protocols":["h1","h2","h3"]}
{"level":"info","ts":1703549352.51085,"logger":"http.log","msg":"server running","name":"remaining_auto_https_redirects","protocols":["h1","h2","h3"]}
{"level":"info","ts":1703549352.510859,"logger":"http","msg":"enabling automatic TLS certificate management","domains":["home.redacted.net"]}
{"level":"info","ts":1703549352.511308,"msg":"autosaved config (load with --resume flag)","file":"/data/caddy/autosave.json"}
{"level":"info","ts":1703549352.51132,"msg":"serving initial configuration"}
{"level":"info","ts":1703549352.511707,"logger":"tls.obtain","msg":"acquiring lock","identifier":"home.kebler.net"}
{"level":"warn","ts":1703549352.5121927,"logger":"tls","msg":"storage cleaning happened too recently; skipping for now","storage":"FileStorage:/ssl/caddy","instance":"27bf782a-8edc-42ba-8f72-22c0c1700db8","try_again":1703635752.5121899,"try_again_in":86399.99999906}
{"level":"info","ts":1703549352.5122516,"logger":"tls","msg":"finished cleaning storage units"}
{"level":"info","ts":1703549352.5135922,"logger":"tls.obtain","msg":"lock acquired","identifier":"home.redacted.net"}
{"level":"info","ts":1703549352.5137959,"logger":"tls.obtain","msg":"obtaining certificate","identifier":"home.redacted.net"}
{"level":"info","ts":1703549352.514787,"logger":"tls.issuance.acme","msg":"waiting on internal rate limiter","identifiers":["home.redacted.net"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}
{"level":"info","ts":1703549352.5148005,"logger":"tls.issuance.acme","msg":"done waiting on internal rate limiter","identifiers":["home.redacted.net"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}
{"level":"info","ts":1703549353.1835563,"logger":"tls.issuance.acme.acme_client","msg":"trying to solve challenge","identifier":"home.kebler.net","challenge_type":"dns-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}
{"level":"error","ts":1703549353.6961763,"logger":"tls.issuance.acme.acme_client","msg":"cleaning up solver","identifier":"home.redacted.net","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.home.kebler.net\" (usually OK if presenting also failed)"}
{"level":"error","ts":1703549353.901954,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"home.redacted.net","issuer":"acme-v02.api.letsencrypt.org-directory","error":"[home.redacted.net] solving challenges: presenting for challenge: adding temporary record for zone \"redacted.net.\": operation error Route 53: ListHostedZonesByName, https response error StatusCode: 403, RequestID: dd176b84-7c5d-4147-9f4b-424662a0d891, api error InvalidClientTokenId: The security token included in the request is invalid. (order=https://acme-v02.api.letsencrypt.org/acme/order/1483719416/231882985226) (ca=https://acme-v02.api.letsencrypt.org/directory)"}
There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.
Location: .github/renovate.json
Error type: The renovate configuration file contains some invalid settings
Message: Invalid regExp for customManagers: ARG CADDY_VERSION=["']?(?<=v)(?<currentValue>.+?)["']?\s+
First of all: thanks for this addon!
I use a custom Caddyfile
and caddy
binary (with DNS provider) stored in /share/caddy
with the following addon config:
args: []
env_vars: []
log_level: info
caddy_upgrade: true
caddy_fmt: true
Caddy is working great with this setup. However it seems that caddy_fmt doesn't actually overwrite the prettified Caddyfile, even though the log says INFO: Overwrite Caddyfile
and then prints the Caddyfile and /share/caddy/Caddyfile
should be writable.
Also I'm wondering about caddy_upgrade
. It seems that the binary is updated on every start, even if it's already the latest version, which seems like a problem with Caddy itself as there is no way to prevent this with the caddy upgrade
command. I like the idea of having an up-to-date Caddy, even if @einschmidt doesn't update the Home Assistant addon itself, but it seems wasteful to download the binary on every start. Would there be a way around this, e.g. by checking the version first?
Also I would like to make a feature suggestion if you don't mind. I think it could be useful to add support for add-package
so we can add the packages we want straight to the addon yaml config and we wouldn't have to manually download the binary, which would also reduce the chance of picking the wrong architecture for example. However, one issue with this might be that packages we remove from the yaml config aren't removed automatically from the binary.
Hi,
just wanted to drop in and notify that 2.7.2 leads to frequent crashes for me and it seems others as well caddyserver/caddy#5680. There are some proposed fixes in caddyserver/caddy#5680 (comment) and I have switched to a custom caddy binary for the moment to see if they fully resolve the issue.
Hopefully this will soon be merged and a new version released.
I'm using a custom binary with version 2.1.2 due a bug I went ahead and built the new version using xcaddy.
More information about this here
Whenn the Addon starts it says:
INFO: Found custom Caddy v2.1.2-0.20200803164242-68529e2f9ecb
But when I run sudo docker exec addon_2974f5cf_caddy2 caddy version
, it says v2.1.1
.
If you need more information, I can provide it!
Many thanks in advance.
There seems to be inconsistency with how Caddy interprets localhost. On a previous installation on older hardware it was working as expected.
However, on a new pi 4 with the same full backup restored it was interpreted as ::1, resulting in "bad request".
Since home assistant is not dual-stack and by default serves ipv4, making it default to destination: 127.0.0.1
is much more sensible.
I don't really think that anyone runs home assistant on ipv6 natively because it breaks many addons, but including destination: ::1
in the documentation shouldn't hurt.
Hi,
Since I have enabled SSL and accessing Mealie via https I am being asked to log in every 5 mins or so. Nothing seems to be out of the norm in the logs.
Been receiving multiple firewall blocked requests for pulls after installing add-on in Home Assistant, My firewall lists Home Assistant as trying to post GET requests to:
Messages stopped after stopping Caddy-2 add-on.
Hello i've been trying all day to get this working for me and im still having a lot of problems figuring out what i need to do. I hope its okay to ask for support here.
I installed the caddy 2 addon into home assistant and created the file /share/caddy/Caddyfile inside of that i added this where AAAA.com is the name of the domain name i purchased.
{
email MyEmailAddress.com
}
homeassistant.AAAA.com {
reverse_proxy localhost:8123 #HomeAssistant
}
plex.AAAA.com {
reverse_proxy 192.168.0.38:32400 #Plex
}
overseerr.AAAA.com {
reverse_proxy 192.168.0.38:5055 #Overseerr
}
sonarr.AAAA.com {
reverse_proxy 192.168.0.38:8989 #Sonarr
}
radarr.AAAA.com {
reverse_proxy 192.168.0.38:7878 #Radarr
}
lidarr.AAAA.com {
reverse_proxy 192.168.0.38:8686 #Lidarr
}
After that though i'm kinda confused on what to do there's the plugin configuration that i don't know what is supposed to go there. Does this even matter since i'm using the Caddyfile?
non_caddyfile_config:
email: MyEmailAddress.com
domain: AAAA.com
destination: localhost
port: 8123
args: []
env_vars: []
log_level: info
Next is my configuration.yaml for home assistant and im not sure what all needs to go here. With external_url do i need to put my duckdns url or my AAAA.com URL?
homeassistant:
customize: !include customize.yaml
external_url: https://AAAA.com
internal_url: http://192.168.0.15:8123
packages: !include_dir_named packages
media_dirs:
media: "/media"
http:
use_x_forwarded_for: true
trusted_proxies: 127.0.0.1
After all of that what kind of changes need to be done with my domain provider? I purchased a cheap $1 domain through ionos.com. Do i need to do something with CNAME or subdomains?
I'm trying to setup the addon with Home Assistant but my host already has services using port 80/443 - in the configuration panel for the addon (within HA) I have updated the 'Network' section to change port 80 to 2080 and 443 to 2443 respectively.
However when I try to start the addon it fails after a few seconds - the logs show:
run: loading initial config: loading new config: http app module: start: tcp: listening on :80: listen tcp :80: bind: address already in use [cont-finish.d] executing container finish scripts... [cont-finish.d] 99-message.sh: executing... [cont-finish.d] 99-message.sh: exited 0. [cont-finish.d] done. [s6-finish] waiting for services. [s6-finish] sending all processes the TERM signal.
It appears that port 80 is still being used.. if I use docker to directly manipulate the container to map the ports and start it directly then everything works as expected.
However as soon as I try to use Home Assistant / Supervisor to control the addon, it removes my changes and fails to start again.
addons.json shows the port numbers were saved correctly.. any idea why it isn't using them?
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.