zachleat / speedlify Goto Github PK
View Code? Open in Web Editor NEWBenchmark the web performance and accessibility of sites over time.
Home Page: https://www.speedlify.dev/
License: MIT License
Benchmark the web performance and accessibility of sites over time.
Home Page: https://www.speedlify.dev/
License: MIT License
me again @zachleat ππΎ
just wondering if you had any thoughts on this...
I added a new page and now build process freezes for unlimited time during the "axe scan" step for this page.
If I remove this certain page from urls
array, then everything is fine.
I tried to make a new fresh fork, but I still have the issue.
How can I debug it to figure out what is the problem with my page?
My speedlify fork: https://github.com/kirillunlimited/speedlify
The page that interfere the build: https://kirillunlimited.com/blog/join-the-dark-side/
"Deploy to Netlify" seems broken.
The Netlify Deploy fails run-tests
with a SyntaxError because NodeJS 12 does not support the ?.
Optional chaining operator:
There are many warnings before this, specifically:
npm WARN notsup Unsupported engine for [email protected]: wanted: {"node":">=14.15"} (current: {"node":"12.22.7","npm":"6.14.15"})
It seems the latest "performance-leaderboard": "^9.0.0"
requires lighthouse ^9.0.0 which, in turn, requires NodeJS >= 14.15 but Netlify is running NodeJS 12.
I cannot see where we can/should update the NodeJS version Netlify Deploy should be using...
Looking at the Eleventy Leaderboards page, it seems as the scores have not been updated since April 14.
I'm not sure if scoring is triggered by running a deploy, but it looks like it, the latest being on April 14 as well:
889d8fb
Happy to assist if that's of any help.
I've managed to get my own fork published! So cool. How do I tell Netlify to build it every day?
Hello,
After adding 2 websites pages to reach 5
I have Timeout issue on netlify build, before that all was good..
Any idea to avoid this issue ?
An extract of the log
Logged an error with https://website-702.eventmaker.io/: LighthouseError [LHError]: PROTOCOL_TIMEOUT 10:33:43 PM: at /opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:341:50 10:33:43 PM: at new Promise (<anonymous>) 10:33:43 PM: at Driver.sendCommandToSession (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:339:28) 10:33:43 PM: at Driver.sendCommand (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:362:17) 10:33:43 PM: at ExecutionContext._evaluateInContext (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver/execution-context.js:109:42) 10:33:43 PM: at ExecutionContext.evaluateAsync (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver/execution-context.js:146:25) 10:33:43 PM: at async Function.afterPass (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/gather-runner.js:341:7)
Someone have an idea ?
Can I deploy using Vercel?
I'm running Node 14.0.0. I cloned the repo, ran npm install
and then when I run npm run testpages
I get the following error:
β npm run test-pages
> [email protected] test-pages /Users/myusername/Desktop/speedlify
> node run-tests
There are no known last run timestamps
First tests for netlify.
Testing 9 sites:
events.js:292
throw er; // Unhandled 'error' event
^
Error: spawn /Users/myusername/Desktop/speedlify/node_modules/puppeteer/.local-chromium/mac-756035/chrome-mac/Chromium.app/Contents/MacOS/Chromium ENOENT
at Process.ChildProcess._handle.onexit (internal/child_process.js:268:19)
at onErrorNT (internal/child_process.js:468:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (internal/child_process.js:274:12)
at onErrorNT (internal/child_process.js:468:16)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: -2,
code: 'ENOENT',
syscall: 'spawn /Users/myusername/Desktop/speedlify/node_modules/puppeteer/.local-chromium/mac-756035/chrome-mac/Chromium.app/Contents/MacOS/Chromium',
path: '/Users/myusername/Desktop/speedlify/node_modules/puppeteer/.local-chromium/mac-756035/chrome-mac/Chromium.app/Contents/MacOS/Chromium',
spawnargs: [
'--disable-features=TranslateUI',
'--disable-extensions',
'--disable-component-extensions-with-background-pages',
'--disable-background-networking',
'--disable-sync',
'--metrics-recording-only',
'--disable-default-apps',
'--mute-audio',
'--no-default-browser-check',
'--no-first-run',
'--disable-backgrounding-occluded-windows',
'--disable-renderer-backgrounding',
'--disable-background-timer-throttling',
'--force-fieldtrials=*BackgroundTracing/default/',
'--remote-debugging-port=64870',
'--user-data-dir=/var/folders/mg/0w3s95hd5dxdm7wdzq3bs8rw0000gn/T/lighthouse.XXXXXXX.X48A6iwi',
'--headless',
'about:blank'
]
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] test-pages: `node run-tests`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] test-pages 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! /Users/myusername/.npm/_logs/2020-07-03T14_11_34_994Z-debug.log
Known issue or am I doing something wrong?
Looking at these two ranking details side-by-side leaves me a bit curious as to the real methodology behind these rankings.
Ranked #2 |
Ranked #71 |
---|---|
![]() |
![]() |
As you can see, the statistics for the website ranked #71
match or beat the rankings for the #2
site in all displayed categories. Intuitively, I would think that #71
would be considered a higher performing site than #2
.
However, I'm aware that the #71
site uses Zeit/Vercel rather than Netlify, so I'm hypothesizing that there may be some internal artificial preference for sites hosted on Netlify?
This isn't an urgent question/issue, but it's got me curious. I'd love to get any insight.
hello beautiful humans
thank you
On my Mac on one of my sites tarasis.net the Axe component of the test doesn't run which leads to an empty results page. Doesn't matter how many times I re-run the command.
However, when run via netlify, it does appear to work
The output during npm run test-pages
for the site
First tests for tarasisdotnet.
Testing 1 site:
(Site 1 of 1, run 1 of 3): https://tarasis.net/
(Site 1 of 1, run 2 of 3): https://tarasis.net/
(Site 1 of 1, run 3 of 3): https://tarasis.net/
Writing ./_data/results/8f148085/date-1706963769478.json.
Finished testing "tarasisdotnet".
Last runs after "tarasisdotnet": {"galshaw":{"timestamp":1706963790553},"rmcg":{"timestamp":1706963828368},"tarasisdotnet":{"timestamp":1706963926536}}
For the other sites I checked I can see an additional line
Axe scan (1 of 1) for https://rmcg.dev/
Nor is the a file in .log
for axe being run on that site
β― find . | grep tarasis
./lighthouse-https-tarasis.net-2-of-3.json
./lighthouse-https-tarasis.net-3-of-3.json
./lighthouse-https-tarasis.net-1-of-3.json
β― find . | grep rmcg
./lighthouse-https-rmcg.dev-1-of-3.json
./lighthouse-https-rmcg.dev-3-of-3.json
./axe-https-rmcg.dev.json
./lighthouse-https-rmcg.dev-2-of-3.json
Using the chrome extension I see the site has 5 issues (result on Netlify agrees)
I can understand why you prefer redirect to a specific vertical, but I guess most user would prefer to list all verticals to decide where to go.
That's what I did on my own instance:
https://webperf-monitoring.netlify.app/
I renamed index.njk
to verticals.njk
and added a new index.njk
:
https://github.com/nhoizey/speedlify
I can make a PR to add this feature, with an option to chose between a redirect or a list of verticals.
Hello! Thanks for creating such a great tool. I've been playing around with speedlify for a bit to monitor some of my projects, and it would be very helpful if there was a way to see which lighthouse or axe tests were failing so I can try to fix them, at least for the latest run.
Right now, I'm checking the scores in speedlify, then running the tests again to see what's failing, and I think it would be helpful if that info could be shown. Would this be possible?
Thanks!
Debug log_
11:23:45 AM: Netlify Build
11:23:45 AM: ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
11:23:45 AM: β
11:23:45 AM: β― Version
11:23:45 AM: @netlify/build 29.21.1
11:23:45 AM: β
11:23:45 AM: β― Flags
11:23:45 AM: baseRelDir: true
11:23:45 AM: buildId: 651263bfcbf1430edabef215
11:23:45 AM: deployId: 651263bfcbf1430edabef217
11:23:45 AM: β
11:23:45 AM: β― Current directory
11:23:45 AM: /opt/build/repo
11:23:45 AM: β
11:23:45 AM: β― Config file
11:23:45 AM: /opt/build/repo/netlify.toml
11:23:45 AM: β
11:23:45 AM: β― Context
11:23:45 AM: production
11:23:45 AM: β
11:23:45 AM: β― Installing plugins
11:23:45 AM: - @netlify/[email protected]
11:23:52 AM: β
11:23:52 AM: β― Loading plugins
11:23:52 AM: - @netlify/[email protected] from Netlify app
11:23:52 AM: - ./plugins/[email protected] from netlify.toml
11:23:54 AM: β
11:23:54 AM: ./plugins/keep-data-cache (onPreBuild event)
11:23:54 AM: ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
11:23:54 AM: β
11:23:54 AM: β
11:23:54 AM: (./plugins/keep-data-cache onPreBuild completed in 7ms)
11:23:54 AM: β
11:23:54 AM: build.command from netlify.toml
11:23:54 AM: ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
11:23:54 AM: β
11:23:54 AM: $ npm run build-production
11:23:54 AM: > [email protected] build-production
11:23:54 AM: > npm run test-pages && npm run build && npm run zip-results
11:23:54 AM: > [email protected] test-pages
11:23:54 AM: > node run-tests
11:23:55 AM: There are no known last run timestamps
11:23:55 AM: Skipping ksvblog (you told me to in your site config)
11:23:55 AM: > [email protected] build
11:23:55 AM: > npx @11ty/eleventy --quiet
11:23:56 AM: [11ty] Copied 2 files / Wrote 5 files in 0.11 seconds (v2.0.1)
11:23:56 AM: > [email protected] zip-results
11:23:56 AM: > node zip-results.js
11:23:56 AM: node:child_process:929
11:23:56 AM: throw err;
11:23:56 AM: ^
11:23:56 AM: Error: Command failed: zip -r -y /opt/build/repo/_site/results.zip results
11:23:56 AM: at checkExecSyncError (node:child_process:890:11)
11:23:56 AM: at Object.execFileSync (node:child_process:926:15)
11:23:56 AM: at Object.zipSync (/opt/build/repo/node_modules/cross-zip/index.js:81:6)
11:23:56 AM: at Object.<anonymous> (/opt/build/repo/zip-results.js:7:5)
11:23:56 AM: at Module._compile (node:internal/modules/cjs/loader:1256:14)
11:23:56 AM: at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
11:23:56 AM: at Module.load (node:internal/modules/cjs/loader:1119:32)
11:23:56 AM: at Module._load (node:internal/modules/cjs/loader:960:12)
11:23:56 AM: at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:86:12) {
11:23:56 AM: status: 12,
11:23:56 AM: signal: null,
11:23:56 AM: output: [
11:23:56 AM: null,
11:23:56 AM: Buffer(131) [Uint8Array] [
11:23:56 AM: 9, 122, 105, 112, 32, 119, 97, 114, 110, 105, 110, 103,
11:23:56 AM: 58, 32, 110, 97, 109, 101, 32, 110, 111, 116, 32, 109,
11:23:56 AM: 97, 116, 99, 104, 101, 100, 58, 32, 114, 101, 115, 117,
11:23:56 AM: 108, 116, 115, 10, 10, 122, 105, 112, 32, 101, 114, 114,
11:23:56 AM: 111, 114, 58, 32, 78, 111, 116, 104, 105, 110, 103, 32,
11:23:56 AM: 116, 111, 32, 100, 111, 33, 32, 40, 116, 114, 121, 58,
11:23:56 AM: 32, 122, 105, 112, 32, 45, 114, 32, 45, 121, 32, 47,
11:23:56 AM: 111, 112, 116, 47, 98, 117, 105, 108, 100, 47, 114, 101,
11:23:56 AM: 112, 111, 47, 95,
11:23:56 AM: ... 31 more items
11:23:56 AM: ],
11:23:56 AM: Buffer(0) [Uint8Array] []
11:23:56 AM: ],
11:23:56 AM: pid: 4195,
11:23:56 AM: stdout: Buffer(131) [Uint8Array] [
11:23:56 AM: 9, 122, 105, 112, 32, 119, 97, 114, 110, 105, 110, 103,
11:23:56 AM: 58, 32, 110, 97, 109, 101, 32, 110, 111, 116, 32, 109,
11:23:56 AM: 97, 116, 99, 104, 101, 100, 58, 32, 114, 101, 115, 117,
11:23:56 AM: 108, 116, 115, 10, 10, 122, 105, 112, 32, 101, 114, 114,
11:23:56 AM: 111, 114, 58, 32, 78, 111, 116, 104, 105, 110, 103, 32,
11:23:56 AM: 116, 111, 32, 100, 111, 33, 32, 40, 116, 114, 121, 58,
11:23:56 AM: 32, 122, 105, 112, 32, 45, 114, 32, 45, 121, 32, 47,
11:23:56 AM: 111, 112, 116, 47, 98, 117, 105, 108, 100, 47, 114, 101,
11:23:56 AM: 112, 111, 47, 95,
11:23:56 AM: ... 31 more items
11:23:56 AM: ],
11:23:56 AM: stderr: Buffer(0) [Uint8Array] []
11:23:56 AM: }
11:23:56 AM: Node.js v18.18.0
11:23:56 AM: β
11:23:56 AM: "build.command" failed
11:23:56 AM: ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
11:23:56 AM: β
11:23:56 AM: Error message
11:23:56 AM: Command failed with exit code 1: npm run build-production (https://ntl.fyi/exit-code-1)
11:23:56 AM: β
11:23:56 AM: Error location
11:23:56 AM: In build.command from netlify.toml:
11:23:56 AM: npm run build-production
11:23:56 AM: β
11:23:56 AM: Resolved config
11:23:56 AM: build:
11:23:56 AM: command: npm run build-production
11:23:56 AM: commandOrigin: config
11:23:56 AM: environment:
11:23:56 AM: - PUPPETEER_CACHE_DIR
11:23:56 AM: publish: /opt/build/repo/_site
11:23:56 AM: publishOrigin: config
11:23:56 AM: headers:
11:23:57 AM: Build failed due to a user error: Build script returned non-zero exit code: 2
11:23:57 AM: Failing build: Failed to build site
11:23:58 AM: Finished processing build request in 36.886s
11:23:57 AM: Failed during stage "building site": Build script returned non-zero exit code: 2
Lighthouse CI allows for uploading reports to a temporary public storage.
It'd be great to have a link to those reports (best here?), so we can see not only the scores, but full reports with their recommendations/diagnostics for improving our sites.
Thanks for such a great tool!
Separate question: since our own instances of Speedlify are not forks of the original repo, is there a way to keep our instances in sync with yours, in case there are updates?
Couldn't run tests locally on a Linux virtual machine.
β― npm run test-pages
> [email protected] test-pages /home/d2s/[... directory path ...]/speedlify
> node run-tests
There are no known last run timestamps
First tests for netlify.
Testing 9 sites:
(node:12367) UnhandledPromiseRejectionWarning: Error: connect ECONNREFUSED 127.0.0.1:40217
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
(node:12367) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:12367) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Dependencies installed properly with npm install
but for some reason Chromium doesn't seem to work properly.
β― node --version
v12.18.0
This bug report is related to the latest Git commit cd322fe5f111ca59894b0c9f9497c57725fee087
of the speedlify
repository.
I tried installing lighthouse 7.4.0 and it's there inside the node_modules but the reports still list the version as 6.4.0 making me think theres probably more to change than just the JSON files.
I tried to find how the actual lists are sorted (ie. how the scores are weighted and compared against each other) and didn't really find it mentioned anywhere and I couldn't figure it out just by reading the code either. Any clarification possible?
via @toddparker
Every time I try to update my fork, I get back the _data/sites/*.js
from this repository, and most of the times, I forgot to remove them and have (at least) one big build on Netlify. π
It would be easier if these files where in a _data/sites-sample/
folder, and speedlify would alert if there is no _data/sites/*.js
yet.
You @zachleat could then copy _data/sites-sample/
to _data/sites/
in your own fork running on Netlify.
It would be much easier for anyone else using speedlify for their own needs, but I agree it would be less easy for you @zachleat to manage both this and a fork, though. π€·ββοΈ
Hi Zach!
I'm trying to get the basic Deploy to Netlify
button working but the build times out at the 15min limit. I'm running into the following error:
(node:1514) UnhandledPromiseRejectionWarning: TypeError: Cannot set property 'hundos' of undefined
12:31:58 PM: at /opt/build/repo/node_modules/performance-leaderboard/src/ResultLogger.js:209:28
12:31:58 PM: at Array.map (<anonymous>)
12:31:58 PM: at ResultLogger.getFinalSortedResults (/opt/build/repo/node_modules/performance-leaderboard/src/ResultLogger.js:207:38)
12:31:58 PM: at runLighthouse (/opt/build/repo/node_modules/performance-leaderboard/performance-leaderboard.js:87:26)
12:31:58 PM: at async /opt/build/repo/run-tests.js:106:17
View the full deploy logs below:
12:21:48 PM: (Site 6 of 12, run 1 of 3): https://gridsome.org/
12:23:05 PM: Logged an error with https://gridsome.org/: LighthouseError [LHError]: PROTOCOL_TIMEOUT
12:23:05 PM: at Timeout._onTimeout (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:352:21)
12:23:05 PM: at listOnTimeout (internal/timers.js:549:17)
12:23:05 PM: at processTimers (internal/timers.js:492:7) {
12:23:05 PM: code: 'PROTOCOL_TIMEOUT',
12:23:05 PM: friendlyMessage: 'Waiting for DevTools protocol response has exceeded the allotted time. (Method: Emulation.setScriptExecutionDisabled)',
12:23:05 PM: lhrRuntimeError: true,
12:23:05 PM: protocolMethod: 'Emulation.setScriptExecutionDisabled'
12:23:05 PM: }
12:23:05 PM: (Site 7 of 12, run 1 of 3): https://vuepress.vuejs.org/
12:24:21 PM: Logged an error with https://vuepress.vuejs.org/: LighthouseError [LHError]: PROTOCOL_TIMEOUT
12:24:21 PM: at Timeout._onTimeout (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:352:21)
12:24:21 PM: at listOnTimeout (internal/timers.js:549:17)
12:24:21 PM: at processTimers (internal/timers.js:492:7) {
12:24:21 PM: code: 'PROTOCOL_TIMEOUT',
12:24:21 PM: friendlyMessage: 'Waiting for DevTools protocol response has exceeded the allotted time. (Method: Emulation.setScriptExecutionDisabled)',
12:24:21 PM: lhrRuntimeError: true,
12:24:21 PM: protocolMethod: 'Emulation.setScriptExecutionDisabled'
12:24:21 PM: }
12:24:21 PM: (Site 8 of 12, run 1 of 3): https://v2.docusaurus.io/
12:24:37 PM: (Site 9 of 12, run 1 of 3): https://docsify.js.org/
12:24:43 PM: (Site 10 of 12, run 1 of 3): https://jekyllrb.com/
12:24:46 PM: (Site 11 of 12, run 1 of 3): https://hexo.io/
12:24:56 PM: (Site 12 of 12, run 1 of 3): https://sapper.svelte.dev/
12:25:00 PM: (Site 1 of 12, run 2 of 3): https://www.11ty.dev/
12:25:04 PM: (Site 2 of 12, run 2 of 3): https://www.gatsbyjs.org/
12:25:14 PM: (Site 3 of 12, run 2 of 3): https://gohugo.io/
12:25:22 PM: (Site 4 of 12, run 2 of 3): https://nextjs.org/
12:25:30 PM: (Site 5 of 12, run 2 of 3): https://nuxtjs.org/
12:25:38 PM: (Site 6 of 12, run 2 of 3): https://gridsome.org/
12:26:55 PM: Logged an error with https://gridsome.org/: LighthouseError [LHError]: PROTOCOL_TIMEOUT
12:26:55 PM: at Timeout._onTimeout (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:352:21)
12:26:55 PM: at listOnTimeout (internal/timers.js:549:17)
12:26:55 PM: at processTimers (internal/timers.js:492:7) {
12:26:55 PM: code: 'PROTOCOL_TIMEOUT',
12:26:55 PM: friendlyMessage: 'Waiting for DevTools protocol response has exceeded the allotted time. (Method: Emulation.setScriptExecutionDisabled)',
12:26:55 PM: lhrRuntimeError: true,
12:26:55 PM: protocolMethod: 'Emulation.setScriptExecutionDisabled'
12:26:55 PM: }
12:26:55 PM: (Site 7 of 12, run 2 of 3): https://vuepress.vuejs.org/
12:27:56 PM: Logged an error with https://vuepress.vuejs.org/: LighthouseError [LHError]: PROTOCOL_TIMEOUT
12:27:56 PM: at Timeout._onTimeout (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:352:21)
12:27:56 PM: at listOnTimeout (internal/timers.js:549:17)
12:27:56 PM: at processTimers (internal/timers.js:492:7) {
12:27:56 PM: code: 'PROTOCOL_TIMEOUT',
12:27:56 PM: friendlyMessage: 'Waiting for DevTools protocol response has exceeded the allotted time. (Method: Network.emulateNetworkConditions)',
12:27:56 PM: lhrRuntimeError: true,
12:27:56 PM: protocolMethod: 'Network.emulateNetworkConditions'
12:27:56 PM: }
12:27:56 PM: (Site 8 of 12, run 2 of 3): https://v2.docusaurus.io/
12:28:05 PM: (Site 9 of 12, run 2 of 3): https://docsify.js.org/
12:28:11 PM: (Site 10 of 12, run 2 of 3): https://jekyllrb.com/
12:28:15 PM: (Site 11 of 12, run 2 of 3): https://hexo.io/
12:28:24 PM: (Site 12 of 12, run 2 of 3): https://sapper.svelte.dev/
12:28:28 PM: (Site 1 of 12, run 3 of 3): https://www.11ty.dev/
12:28:32 PM: (Site 2 of 12, run 3 of 3): https://www.gatsbyjs.org/
12:28:41 PM: (Site 3 of 12, run 3 of 3): https://gohugo.io/
12:28:49 PM: (Site 4 of 12, run 3 of 3): https://nextjs.org/
12:28:57 PM: (Site 5 of 12, run 3 of 3): https://nuxtjs.org/
12:29:05 PM: (Site 6 of 12, run 3 of 3): https://gridsome.org/
12:30:22 PM: Logged an error with https://gridsome.org/: LighthouseError [LHError]: PROTOCOL_TIMEOUT
12:30:22 PM: at Timeout._onTimeout (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:352:21)
12:30:22 PM: at listOnTimeout (internal/timers.js:549:17)
12:30:22 PM: at processTimers (internal/timers.js:492:7) {
12:30:22 PM: code: 'PROTOCOL_TIMEOUT',
12:30:22 PM: friendlyMessage: 'Waiting for DevTools protocol response has exceeded the allotted time. (Method: Emulation.setScriptExecutionDisabled)',
12:30:22 PM: lhrRuntimeError: true,
12:30:22 PM: protocolMethod: 'Emulation.setScriptExecutionDisabled'
12:30:22 PM: }
12:30:22 PM: (Site 7 of 12, run 3 of 3): https://vuepress.vuejs.org/
12:31:23 PM: Logged an error with https://vuepress.vuejs.org/: LighthouseError [LHError]: PROTOCOL_TIMEOUT
12:31:23 PM: at Timeout._onTimeout (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:352:21)
12:31:23 PM: at listOnTimeout (internal/timers.js:549:17)
12:31:23 PM: at processTimers (internal/timers.js:492:7) {
12:31:23 PM: code: 'PROTOCOL_TIMEOUT',
12:31:23 PM: friendlyMessage: 'Waiting for DevTools protocol response has exceeded the allotted time. (Method: Network.emulateNetworkConditions)',
12:31:23 PM: lhrRuntimeError: true,
12:31:23 PM: protocolMethod: 'Network.emulateNetworkConditions'
12:31:23 PM: }
12:31:23 PM: (Site 8 of 12, run 3 of 3): https://v2.docusaurus.io/
12:31:33 PM: (Site 9 of 12, run 3 of 3): https://docsify.js.org/
12:31:39 PM: (Site 10 of 12, run 3 of 3): https://jekyllrb.com/
12:31:43 PM: (Site 11 of 12, run 3 of 3): https://hexo.io/
12:31:54 PM: (Site 12 of 12, run 3 of 3): https://sapper.svelte.dev/
12:31:58 PM: (node:1514) UnhandledPromiseRejectionWarning: TypeError: Cannot set property 'hundos' of undefined
12:31:58 PM: at /opt/build/repo/node_modules/performance-leaderboard/src/ResultLogger.js:209:28
12:31:58 PM: at Array.map (<anonymous>)
12:31:58 PM: at ResultLogger.getFinalSortedResults (/opt/build/repo/node_modules/performance-leaderboard/src/ResultLogger.js:207:38)
12:31:58 PM: at runLighthouse (/opt/build/repo/node_modules/performance-leaderboard/performance-leaderboard.js:87:26)
12:31:58 PM: at async /opt/build/repo/run-tests.js:106:17
12:31:58 PM: (node:1514) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 83)
12:31:58 PM: (node:1514) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
12:32:00 PM: > [email protected] build /opt/build/repo
12:32:00 PM: > npx @11ty/eleventy --quiet
12:32:01 PM: Copied 4 files / Wrote 37 files in 0.34 seconds (9.2ms each, v0.11.0)
12:32:01 PM: > [email protected] zip-results /opt/build/repo
12:32:01 PM: > node zip-results.js
Following the instructions for the local install - I :
Looking at the folder, there is no file named 'results-last-runs.json'
This is always going to throw an error on the first run if the file is missing and doesn't seem to create it on first run
itsupport@oit-lt02 MINGW64 ~/Dropbox/Dev/2-speedlify (live)
$ npm run test-pages
[email protected] test-pages C:\Users\itsupport\Dropbox\Dev\2-speedlify
node run-tests
There are no known last run timestamps
Skipping test-runners (you told me to in your site config)
itsupport@oit-lt02 MINGW64 ~/Dropbox/Dev/2-speedlify (live)
$ npm run start
[email protected] start C:\Users\itsupport\Dropbox\Dev\2-speedlify
npx @11ty/eleventy --quiet --serve
Cannot find module './results-last-runs.json'
Require stack:
Error
was thrown:
Error: Cannot find module './results-last-runs.json'
Require stack:
- C:\Users\itsupport\Dropbox\Dev\2-speedlify_data\lastruns.js
- C:\Users\itsupport\Dropbox\Dev\2-speedlify\node_modules@11ty\eleventy\src\TemplateData.js
- C:\Users\itsupport\Dropbox\Dev\2-speedlify\node_modules@11ty\eleventy\src\Eleventy.js
- C:\Users\itsupport\Dropbox\Dev\2-speedlify\node_modules@11ty\eleventy\cmd.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:966:15)
at Function.Module._load (internal/modules/cjs/loader.js:842:27)
at Module.require (internal/modules/cjs/loader.js:1026:19)
Is it possible to place to monitor on private websites? For example, a development environment that has a password.
Otherwise, do you find it interesting to add a resource for this?
Oops
I see at least two different use cases for Speedlify:
Sorting the URLs based on performance results makes sense for comparative benchmarks.
But sorting URLs by alpha would IMHO make more sense for monitoring, to always keep the same order.
I see three possible solutions:
leaderboard
attributesort
attribute with multiple possibles values, url
and score
to start withtype
attribute with multiple possible values, leaderboard
and monitoring
to start withThe later allows for more personalization of reports, if the order is not the only thing to adapt.
Speedlify has been deploying monthly until October, and it's suddenly stopped :(
I tried to fork this repo and run it locally and while it did run and I got some results my own website resulted in an unknown error:
{
"url": "https://www.blog.davidmoll.net/",
"error": "Unknown error.",
"sidequests": {
"-weight.total": 3,
"+weight.total": 3,
"-weight.document": 3,
"+weight.document": 3,
"-weight.script": 3,
"+weight.script": 3,
"-weight.image": 3,
"+weight.image": 3,
"-weight.font": 3,
"+weight.font": 3,
"+weight.fontCount": 3,
"-timeToFirstByte": 3,
"-totalBlockingTime": 3,
"-largestContentfulPaint": 3
}
}
ssg.js
looks like this:
module.exports = {
name: "SSG",
description: "Static Site Generator web sites",
options: {
frequency: 60 * 23,
freshChrome: "run"
},
urls: [
"https://www.blog.davidmoll.net",
"https://www.11ty.dev/",
"https://www.gatsbyjs.com/",
]
};
Other websites in the ssg.js
-file ran fine. I am selfhosting my website using cloudflare tunnel on a Raspberry Pi. Any idea what could cause this?
cc @alexcroox via #3 (comment)
Remove that default netlify redirect too
For example, with 30 second effort using shields.io I created this
They support json endpoints, which shouldn't be too hard to create within this project. Want to check there's interest before effort is made though!
Also known as "server-response-time" in the lighthouse logs. Will require a change to performance-leaderboard
Related https://web.dev/time-to-first-byte/ https://ismyhostfastyet.com/
I basically hit the 'push to Netlify' button and get this error:
12:37:30 AM: Problem writing Eleventy templates: (more in DEBUG output)
12:37:30 AM: > Having trouble rendering 11ty.js template ./api.11ty.js
12:37:30 AM: `TemplateContentRenderError` was thrown
12:37:30 AM: > Cannot read property '5fbe07d5' of undefined
12:37:30 AM: `TypeError` was thrown:
12:37:30 AM: TypeError: Cannot read property '5fbe07d5' of undefined
12:37:30 AM: at ApiEntry.render (/opt/build/repo/api.11ty.js:19:31)
12:37:30 AM: at JavaScript.<anonymous> (/opt/build/repo/node_modules/@11ty/eleventy/src/Engines/JavaScript.js:129:43)
12:37:30 AM: at Template.render (/opt/build/repo/node_modules/@11ty/eleventy/src/TemplateContent.js:199:28)
12:37:30 AM: at processTicksAndRejections (internal/process/task_queues.js:97:5)
12:37:30 AM: at async Template._getContent (/opt/build/repo/node_modules/@11ty/eleventy/src/Template.js:547:12)
12:37:30 AM: at async Template.getTemplateMapContent (/opt/build/repo/node_modules/@11ty/eleventy/src/Template.js:732:19)
12:37:30 AM: at async TemplateMap.populateContentDataInMap (/opt/build/repo/node_modules/@11ty/eleventy/src/TemplateMap.js:359:39)
12:37:30 AM: at async TemplateMap.cache (/opt/build/repo/node_modules/@11ty/eleventy/src/TemplateMap.js:303:5)
12:37:30 AM: at async TemplateWriter._createTemplateMap (/opt/build/repo/node_modules/@11ty/eleventy/src/TemplateWriter.js:170:5)
12:37:30 AM: at async TemplateWriter.writeTemplates (/opt/build/repo/node_modules/@11ty/eleventy/src/TemplateWriter.js:203:5)
12:37:30 AM: Copied 2 files / Wrote 0 files in 0.13 seconds (v0.11.0)
12:37:30 AM: npm ERR! code ELIFECYCLE
12:37:30 AM: npm ERR! errno 1
12:37:30 AM: npm ERR! [email protected] build: `npx @11ty/eleventy --quiet`
12:37:30 AM: npm ERR! Exit status 1
12:37:30 AM: npm ERR!
Can anyone try deploying to Netlify and confirm if it works for them?
Hello,
Sorry for this message, i use speedlify for more than one year, 2 weeks ago builds become to failed with this errors :
4:03:36 PM: Using Ruby version 2.7.2
4:03:37 PM: Using PHP version 8.0
4:03:37 PM: Started restoring cached corepack dependencies
4:03:37 PM: mv: cannot move '/opt/build/cache/.node/corepack' to '/opt/buildhome/.node/corepack': No such file or directory
4:03:37 PM: Finished restoring cached corepack dependencies
4:03:37 PM: No npm workspaces detected
4:03:37 PM: Started restoring cached node modules
4:03:37 PM: Finished restoring cached node modules
4:03:37 PM: Bypassing sha validation. Running pre & post install scripts
4:03:37 PM: Installing npm packages using npm version 8.19.3
4:03:40 PM: added 20 packages, changed 3 packages, and audited 392 packages in 3s
4:03:40 PM: 63 packages are looking for funding
4:03:40 PM: run npm fund
for details
4:03:40 PM: found 0 vulnerabilities
4:03:40 PM: npm packages installed
4:03:40 PM: Started restoring cached go cache
4:03:40 PM: Finished restoring cached go cache
4:03:40 PM: Installing Go version 1.16.5 (requested 1.16.5)
4:03:45 PM: unset GOOS;
4:03:45 PM: unset GOARCH;
4:03:45 PM: export GOROOT='/opt/buildhome/.gimme/versions/go1.16.5.linux.amd64';
4:03:45 PM: export PATH="/opt/buildhome/.gimme/versions/go1.16.5.linux.amd64/bin:${PATH}";
4:03:45 PM: go version >&2;
4:03:45 PM: export GIMME_ENV="/opt/buildhome/.gimme/env/go1.16.5.linux.amd64.env"
4:03:45 PM: go version go1.16.5 linux/amd64
4:03:46 PM: Detected 1 framework(s)
4:03:46 PM: "eleventy" at version "2.0.0-beta.2"
4:03:46 PM: Installing missing commands
4:03:46 PM: Verify run directory
4:03:46 PM: Section completed: initializing
4:03:47 PM: β
4:03:47 PM: Netlify Build
4:03:47 PM: ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
4:03:47 PM: β
4:03:47 PM: β― Version
4:03:47 PM: @netlify/build 29.5.1
4:03:47 PM: β
4:03:47 PM: β― Flags
4:03:47 PM: baseRelDir: true
4:03:47 PM: buildId: 63da7f3eb0cf91000a3b905d
4:03:47 PM: deployId: 63da7f3eb0cf91000a3b9060
4:03:47 PM: β
4:03:47 PM: β― Current directory
4:03:47 PM: /opt/build/repo
4:03:47 PM: β
4:03:47 PM: β― Config file
4:03:47 PM: /opt/build/repo/netlify.toml
4:03:47 PM: β
4:03:47 PM: β― Context
4:03:47 PM: deploy-preview
4:03:47 PM: β
4:03:47 PM: β― Loading plugins
4:03:47 PM: - ./plugins/[email protected] from netlify.toml
4:03:48 PM: β
4:03:48 PM: 1. ./plugins/keep-data-cache (onPreBuild event)
4:03:48 PM: ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
4:03:48 PM: β
4:03:49 PM: β
4:03:49 PM: (./plugins/keep-data-cache onPreBuild completed in 295ms)
4:03:49 PM: β
4:03:49 PM: 2. build.command from netlify.toml
4:03:49 PM: ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
4:03:49 PM: β
4:03:49 PM: $ npm run build-production
4:03:49 PM: > [email protected] build-production
4:03:49 PM: > npm run test-pages && npm run build && npm run zip-results
4:03:49 PM: > [email protected] test-pages
4:03:49 PM: > node run-tests
4:03:50 PM: /opt/build/repo/node_modules/performance-leaderboard/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:127
4:03:50 PM: throw new Error(Could not find Chromium (rev. ${this.puppeteer.browserRevision}). This can occur if either\n
+
4:03:50 PM: ^
4:03:50 PM: Error: Could not find Chromium (rev. 1083080). This can occur if either
4:03:50 PM: 1. you did not perform an installation before running the script (e.g. npm install
) or
4:03:50 PM: 2. your cache path is incorrectly configured (which is: /opt/buildhome/.cache/puppeteer).
4:03:50 PM: For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.
4:03:50 PM: at ChromeLauncher.resolveExecutablePath (/opt/build/repo/node_modules/performance-leaderboard/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:127:27)
4:03:50 PM: at ChromeLauncher.executablePath (/opt/build/repo/node_modules/performance-leaderboard/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ChromeLauncher.js:205:25)
4:03:50 PM: at PuppeteerNode.executablePath (/opt/build/repo/node_modules/performance-leaderboard/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PuppeteerNode.js:162:105)
4:03:50 PM: at Object. (/opt/build/repo/node_modules/performance-leaderboard/performance-leaderboard.js:7:50)
4:03:50 PM: at Module._compile (node:internal/modules/cjs/loader:1165:14)
4:03:50 PM: at Object.Module._extensions..js (node:internal/modules/cjs/loader:1219:10)
4:03:50 PM: at Module.load (node:internal/modules/cjs/loader:1043:32)
4:03:50 PM: at Function.Module._load (node:internal/modules/cjs/loader:878:12)
4:03:50 PM: at Module.require (node:internal/modules/cjs/loader:1067:19)
4:03:50 PM: Failed during stage 'building site': Build script returned non-zero exit code: 2 (https://ntl.fyi/exit-code-2)
4:03:50 PM: at require (node:internal/modules/cjs/helpers:103:18)
4:03:50 PM: β
4:03:50 PM: "build.command" failed
I read that the website of this repo run fine ... thx to https://www.speedlify.dev/
But on my side without any changes excepted a "click on retry to build without cache" it not work anymore.
Someone have an idea about this new issue ?
The lighthouse scores are set to the same 0-400 scale, which makes them visually comparable. I.e. as you scroll down, the far end of the graphs go lower, as it is sorted by score.
The page weight graphs, however, do not share the same scale. This means they all tend to be at the "top" despite being of very different sizes. I suppose there is a benefit to "zooming in" to the relatively change of a given website, but with the kilobyte number as small as it is, the difference is perhaps easier to appreciate if the graphs also shared the same scale. E.g. the top of the page weight scales would be determined by the largest data point within the range of time and sites shown on the current page.
Example from https://www.speedlify.dev/test-runners/:
I'm running on my local virtual server on Proxmox with Ubuntu 22.04 LTS, Node.js v18.16.1. Everytime npm run test-pages
give me this error.
> [email protected] test-pages
> node run-tests
There are no known last run timestamps
Skipping fakultas (you told me to in your site config)
First tests for sample.
Testing 6 sites:
node:internal/process/promises:288
triggerUncaughtException(err, true /* fromPromise */);
^
Error: connect ECONNREFUSED 127.0.0.1:41941
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 41941
}
Node.js v18.16.1
any clue to make it run?
Screenshot: https://imgur.com/bIZDTte
Given that keys in the JSON file lead to both links in the interface and slugs in URLs, I think it would be valuable to add a comment in that file for customization.
I realized that after the first deploy: davidbgk@9fed714
By the way, great tool! π
I've created a test instance of Speedify here: https://github.com/budparr/speedlify
Problem
When building the site from generated results, the following (in _data/sites) breaks the build
urls: ["https://www.11ty.dev/", "https://www.11ty.dev/docs/getting-started"],
Uncaught exception: (more in DEBUG output)
> The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received type boolean (false)
`TypeError` was thrown:
TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received type boolean (false)
at writeFile (fs.js:1385:5)
at go$writeFile (/Users/budparr/Code/prs/speedlify/node_modules/graceful-fs/graceful-fs.js:139:14)
at Object.writeFile (/Users/budparr/Code/prs/speedlify/node_modules/graceful-fs/graceful-fs.js:136:12)
at /Users/budparr/Code/prs/speedlify/node_modules/fs-extra/lib/output/index.js:23:10
at /Users/budparr/Code/prs/speedlify/node_modules/fs-extra/lib/mkdirs/mkdirs.js:56:16
at callback (/Users/budparr/Code/prs/speedlify/node_modules/graceful-fs/polyfills.js:295:20)
at FSReqCallback.oncomplete (fs.js:177:5)
Immediate Fix
Changing the URLs to have a trailing slash creates no error:
urls: ["https://www.11ty.dev/", "https://www.11ty.dev/docs/getting-started/"],
note the change is adding a trailing slash to the end of the URL
Expected Behavior
I would expect that Speedlify would not care if a user put trailing slashes in their URL
Potential Solution
I suspect this is because of a site hash mismatch from api.11ty.js, but I haven't figured out how to fix it yet, so reporting in case this is an easy fix for someone else.
[deleted]
At https://www.speedlify.dev/test-runners/, I notice a new host column, powered by https://v1.builtwith.11ty.dev. That's neat!
While I recognise the GitHub icon, I didn't recognise the logo in the column for ESLint's website. I considered for a moment that it was loading it lazily, but it's the actual icon. I quite often find inaccessible form fields, images, or other elements and sometimes the HTML can reveal information in the (otherwise, invisible) alt text, or URL, or HTML icon class name etc. But didn't find anything like that in this case. Digging a bit deeper, I found that the ESLint image in question has the following response header:
x-11ty-host: netlify
And likewise, the QUnit image, for example has the following:
x-11ty-host: github
I imagine this may add some cost to the build, but including this information in some way would I think help make this information more accessible and understandable.
Today
<img alt="Hosting avatar for qunitjs.com/">
Some ideas:
<img alt="Hosted with {{host}}" title="qunitjs.com/ is hosted with {{host}}">
<img alt="{{host}}" title="qunitjs.com/ is hosted with {{host}}">
<img alt=""> {{host}}
I forked, adjusted the sites and the initial build on Netlify failed with this in the "Building" phase:
Error: Command failed: zip -r -y /opt/build/repo/_site/results.zip results
Simply adding _data/results/.gitkeep
to the repo fixed it.
Not sure if that's just happening to meβ¦ π€·ββοΈ
I was trying to self host speedlify on a VPS I have rather than netlify.
When I run it on the VPS (x86_64), and also on my Rapsberry PI running Raspbian Bookworm I get the following error
VPS Results
rob@kvm-ams:~/speedlify$ npm run test-pages
> [email protected] test-pages
> node run-tests
There are no known last run timestamps
First tests for galshaw.
Testing 1 site:
node:internal/process/promises:288
triggerUncaughtException(err, true /* fromPromise */);
^
Error: connect ECONNREFUSED 127.0.0.1:39819
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 39819
}
Node.js v18.17.1
rob@kvm-ams:~/speedlify$
----
PI Results
tarasis@rp4b:~/git-repos/speedlify $ npm run test-pages
> [email protected] test-pages
> node run-tests
There are no known last run timestamps
First tests for galshaw.
Testing 1 site:
node:internal/process/promises:289
triggerUncaughtException(err, true /* fromPromise */);
^
Error: connect ECONNREFUSED 127.0.0.1:40835
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1602:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 40835
}
Node.js v21.6.1
However on my Mac* & Netlify it runs perfectly.
Last runs at start: {}
First tests for galshaw.
Testing 1 site:
(Site 1 of 1, run 1 of 3): https://galshaw.it
(Site 1 of 1, run 2 of 3): https://galshaw.it
(Site 1 of 1, run 3 of 3): https://galshaw.it
Axe scan (1 of 1) for https://galshaw.it
Writing ./_data/results/e8b5024f/date-1706963769478.json.
Finished testing "galshaw".
Last runs after "galshaw": {"galshaw":{"timestamp":1706963790553}}
Build was slow so I looked aty the netilify log
"friendlyMessage: 'Waiting for DevTools protocol response has exceeded the allotted time. (Method: Emulation.setScriptExecutionDisabled)"
then thought must be instramenting all your sites so I cancelled the deply and went to my speedlify repo on GitHub to edit- it is empty?
Surely the repo should be there even if I stopped the deploy?
I attempted to run a test on a set of approximately 1,700 unique homepages. The process failed before completing the first run (running locally).
Thanks
hello
When updating a fork, _data/sites.js
should be the only file with legitimate changes to keep, so renaming it to _data/sites-sample.js
in the source repository would allow easier forks updates.
Speedlify could look for sites-sample
data if there is no sites
data, and add a big notification in the UI (like Eleventy's documentation buttonβ¦ π
) to invite people to create their own sites.js
file.
I couldn't build this for first time because this returns the following error every time. I tried few times re-running. Any other way?
7:49:56 PM: Logged an error with https://web3canvas.com/: LighthouseError [LHError]: PROTOCOL_TIMEOUT
7:49:56 PM: at Timeout._onTimeout (/opt/build/repo/node_modules/lighthouse/lighthouse-core/gather/driver.js:341:21)
7:49:56 PM: at listOnTimeout (internal/timers.js:554:17)
7:49:56 PM: at processTimers (internal/timers.js:497:7) {
7:49:56 PM: code: 'PROTOCOL_TIMEOUT',
7:49:56 PM: friendlyMessage: 'Waiting for DevTools protocol response has exceeded the allotted time. (Method: Runtime.evaluate)',
7:49:56 PM: lhrRuntimeError: true,
7:49:56 PM: protocolMethod: 'Runtime.evaluate'
7:49:56 PM: }
Hello, I have been playing around with Speedlify for the last couple of days (I love it! β€οΈ)
One thing I noticed is that I have to manually add the URLs to the site's config file in _data/sites
and I decided to add this NPM package to the dependencies to automatically retrieve URLs from a sitemap that I added as a config parameter.
Is this something that could be useful or do you see any downside in doing this?
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.