GithubHelp home page GithubHelp logo

lowlighter / metrics Goto Github PK

View Code? Open in Web Editor NEW
12.6K 93.0 1.6K 162.42 MB

๐Ÿ“Š An infographics generator with 30+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!

Home Page: https://metrics.lecoq.io

License: MIT License

JavaScript 73.30% CSS 1.59% HTML 6.18% Dockerfile 0.11% Shell 0.21% TypeScript 18.60%
readme metrics readme-profile profile-readme profile-card profile readme-generator github-metrics github-profile svg-image

metrics's Introduction

metrics's People

Stargazers

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

Watchers

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

metrics's Issues

Workflow fails with 'Error: Invalid request. "sha" wasn't supplied.'

Bug description
The workflow consistently fails with the error "Error: Invalid request. "sha" wasn't supplied." Additional logging above that shows that this is caused by the PUT request to update the SVG in the repo. (Request fails with a '422 Unprocessable Entity' status)

Complete Logs
/usr/bin/docker run --name ce1bb4461fa94a6cb4848631ba9ce827_59973a --label 179394 --workdir /github/workspace --rm -e INPUT_TOKEN -e INPUT_COMMITTER_TOKEN -e INPUT_BASE -e INPUT_PLUGIN_ISOCALENDAR -e INPUT_PLUGIN_ISOCALENDAR_DURATION -e INPUT_PLUGIN_MUSIC -e INPUT_PLUGIN_MUSIC_PROVIDER -e INPUT_PLUGIN_MUSIC_TOKEN -e INPUT_PLUGIN_MUSIC_MODE -e INPUT_PLUGIN_MUSIC_LIMIT -e INPUT_PLUGIN_LANGUAGES -e INPUT_PLUGIN_FOLLOWUP -e INPUT_PLUGIN_TOPICS -e INPUT_PLUGIN_TOPICS_SORT -e INPUT_PLUGIN_TOPICS_LIMIT -e INPUT_PLUGIN_LINES -e INPUT_PLUGIN_HABITS -e INPUT_PLUGIN_HABITS_FROM -e INPUT_PLUGIN_PAGESPEED -e INPUT_PLUGIN_PAGESPEED_TOKEN -e INPUT_PLUGIN_PAGESPEED_DETAILED -e INPUT_USER -e INPUT_FILENAME -e INPUT_OPTIMIZE -e INPUT_REPOSITORIES -e INPUT_TEMPLATE -e INPUT_PLUGIN_TRAFFIC -e INPUT_PLUGIN_MUSIC_PLAYLIST -e INPUT_PLUGIN_POSTS -e INPUT_PLUGIN_POSTS_SOURCE -e INPUT_PLUGIN_POSTS_LIMIT -e INPUT_PLUGIN_GISTS -e INPUT_PLUGIN_PROJECTS -e INPUT_PLUGIN_PROJECTS_LIMIT -e INPUT_DEBUG -e INPUT_VERIFY -e INPUT_DRYRUN -e INPUT_PLUGINS_ERRORS_FATAL -e HOME -e GITHUB_JOB -e GITHUB_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_REPOSITORY_OWNER -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RETENTION_DAYS -e GITHUB_ACTOR -e GITHUB_WORKFLOW -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GITHUB_EVENT_NAME -e GITHUB_SERVER_URL -e GITHUB_API_URL -e GITHUB_GRAPHQL_URL -e GITHUB_WORKSPACE -e GITHUB_ACTION -e GITHUB_EVENT_PATH -e GITHUB_ACTION_REPOSITORY -e GITHUB_ACTION_REF -e GITHUB_PATH -e GITHUB_ENV -e RUNNER_OS -e RUNNER_TOOL_CACHE -e RUNNER_TEMP -e RUNNER_WORKSPACE -e ACTIONS_RUNTIME_URL -e ACTIONS_RUNTIME_TOKEN -e ACTIONS_CACHE_URL -e GITHUB_ACTIONS=true -e CI=true -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands" -v "/home/runner/work/MatievisTheKat/MatievisTheKat":"/github/workspace" 179394:ce1bb4461fa94a6cb4848631ba9ce827
GitHub metrics as SVG image
========================================================
Version             | 2.7.0
Configuration       | loaded
Template to use     | classic
Github token        | provided
Github GraphQL API  | ok
Github REST API     | ok
SVG output file     | github-metrics.svg
SVG optimization    | true
GitHub user         | MatievisTheKat
Debug mode          | false
Base parts          | header, activity, community, repositories, metadata
Plugins enabled     | lines, pagespeed, habits, languages, followup, music, isocalendar, topics
Pagespeed token     | provided
Pagespeed detailed  | true
Music provider      | spotify
Music plugin mode   | recent
Music playlist      | null
Music tracks limit  | 5
Music token         | provided
Isocalendar duration| full-year
Topics sort mode    | stars
Topics limit        | 15
Repositories to use | 100
Plugin errors       | ignore
BQCXNX9Ikh0YU2eMCac2nb_POS0ysHz45QlGm3E6kXth6sk471qXlMM_1vvHZWX9MI7tSKneG9PMO-OzpqtJhHZ9si-0CkVCLzYSR-kWCyH55lLuOSGKhhT_wUGZLBwILGc6sIVBlyi31B463GQyaJf2
Render              | complete
Verify SVG          | false
Repository          | MatievisTheKat/MatievisTheKat
Committer token     | provided
Committer REST API  | ok
Committer           | (unknown)
Previous render sha | none
s [HttpError]: Invalid request.

"sha" wasn't supplied.
    at /index.js:66:81955
    at processTicksAndRejections (node:internal/process/task_queues:93:5)
    at async /index.js:66:8738 {
  status: 422,
  headers: {
    'access-control-allow-origin': '*',
    'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset',
    connection: 'close',
    'content-length': '156',
    'content-security-policy': "default-src 'none'",
    'content-type': 'application/json; charset=utf-8',
    date: 'Tue, 15 Dec 2020 14:22:27 GMT',
    'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
    server: 'GitHub.com',
    status: '422 Unprocessable Entity',
    'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
    vary: 'Accept-Encoding, Accept, X-Requested-With',
    'x-content-type-options': 'nosniff',
    'x-frame-options': 'deny',
    'x-github-media-type': 'github.v3; format=json',
    'x-github-request-id': '07C4:7DA0:D6C507:2238722:5FD8C6A3',
    'x-ratelimit-limit': '1000',
    'x-ratelimit-remaining': '967',
    'x-ratelimit-reset': '1608043777',
    'x-ratelimit-used': '33',
    'x-xss-protection': '1; mode=block'
  },
  request: {
    method: 'PUT',
    url: 'https://api.github.com/repos/MatievisTheKat/MatievisTheKat/contents/github-metrics.svg',
    headers: {
      accept: 'application/vnd.github.v3+json',
      'user-agent': 'octokit-core.js/3.2.1 Node.js/15.4.0 (linux; x64)',
      authorization: 'token [REDACTED]',
      'content-type': 'application/json; charset=utf-8'
    },
    body: '{"message":"Update github-metrics.svg - [Skip GitHub Action]","content":"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0ODAiIGhlaWdodD0iMTU3MCI+PGRlZnM+PHN0eWxlLz48L2RlZnM+PHN0eWxlPi8qIFNWRyBnbG9iYWwgY29udGV4dCAqLyBzdmcgeyBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiwgQXBwbGUgQ29sb3IgRW1vamksIFNlZ29lIFVJIEVtb2ppOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAjNzc3Nzc3OyB9IC8qIEhlYWRlcnMgKi8gaDEsIGgyLCBoMyB7IG1hcmdpbjogOHB4IDAgMnB4OyBwYWRkaW5nOiAwOyBjb2xvcjogIzAzNjZkNjsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfSBoMSBzdmcsIGgyIHN2ZywgaDMgc3ZnIHsgZmlsbDogY3VycmVudENvbG9yOyB9IGgxIHsgZm9udC1zaXplOiAyMHB4OyBmb250LXdlaWdodDogYm9sZDsgfSBoMiB7IGZvbnQtc2l6ZTogMTZweDsgfSBoMyB7IGZvbnQtc2l6ZTogMTRweDsgfSAvKiBGaWVsZHMgKi8gc2VjdGlvbiAmZ3Q7IC5maWVsZCB7IG1hcmdpbi1sZWZ0OiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyB9IC5maWVsZCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDJweDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfSAuZmllbGQgc3ZnIHsgbWFyZ2luOiAwIDhweDsgZmlsbDogIzk1OWRhNTsgZmxleC1zaHJpbms6IDA7IH0gLmZpZWxkLmVycm9yIHsgY29sb3I6ICNjYjI0MzE7IH0gLmZpZWxkLmVycm9yIHN2ZyB7IGZpbGw6ICNjYjI0MzE7IH0gLyogRGlzcGxheXMgKi8gLnJvdyB7IGRpc3BsYXk6IGZsZXg7IH0gLnJvdyBzZWN0aW9uIHsgZmxleDogMSAxIDA7IH0gLmNvbHVtbiB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0gLmNlbnRlciB7IGp1c3RpZnktY29udGVudDogY2VudGVyOyB9IC5ob3Jpem9udGFsIHsganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7IH0gLmhvcml6b250YWwtd3JhcCB7IGZsZXgtd3JhcDogd3JhcDsgfSAuaG9yaXpvbnRhbCAuZmllbGQgeyBmbGV4OiAxIDEgMDsgfSAubm8td3JhcCB7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0gLmZpbGwtd2lkdGggeyB3aWR0aDogMTAwJTsgfSAvKiBVc2VyIGF2YXRhciAqLyAuYXZhdGFyIHsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgYm9yZGVyLXJhZGl1czogNTAlOyBtYXJnaW46IDAgNnB4OyB9IC8qIENvbW1pdCBjYWxlbmRhciAqLyAuY2FsZW5kYXIuZmllbGQgeyBtYXJnaW46IDRweCAwOyBtYXJnaW4tbGVmdDogN3B4OyB9IC5jYWxlbmRhciAuZGF5IHsgb3V0bGluZTogMXB4IHNvbGlkIHJnYmEoMjcsMzEsMzUsLjA0KTsgb3V0bGluZS1vZmZzZXQ6IC0xcHg7IH0gLyogUHJvZ3Jlc3MgYmFycyAqLyBzdmcuYmFyIHsgbWFyZ2luOiA0cHggMDsgfSAvKiBMYW5ndWFnZSAqLyAuZmllbGQubGFuZ3VhZ2UgeyBtYXJnaW46IDAgOHB4OyBmbGV4LWdyb3c6IDA7IH0gLmZpZWxkLmxhbmd1YWdlIHNtYWxsIHsgbWFyZ2luLWxlZnQ6IDRweDsgb3BhY2l0eTogLjc7IH0gLyogTGFiZWxzICovIC5sYWJlbCB7IGJhY2tncm91bmQtY29sb3I6ICNGMUY4RkY7IGNvbG9yOiAjMDM2NkQ2OyBwYWRkaW5nOiAwIDEwcHg7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAyMnB4OyBtYXJnaW46IDJweCA1cHg7IHdoaXRlLXNwYWNlOiBub3dyYXA7IGJvcmRlci1yYWRpdXM6IDMycHg7IGZvbnQtc2l6ZTogMTJweDsgfSAubGFiZWw6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRERFRUZGOyBjdXJzb3I6IHBvaW50ZXI7IH0gLyogSGFiaXRzICovIC5oYWJpdHMgeyBtYXJnaW46IDA7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsgcGFkZGluZy1sZWZ0OiAzN3B4OyB9IC8qIEZvb3RlciAqLyBmb290ZXIgeyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMTBweDsgZm9udC1zdHlsZTogaXRhbGljOyBvcGFjaXR5OiAwLjU7IHRleHQtYWxpZ246IHJpZ2h0OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOyB9IC8qIFNwZWVkIHRlc3QgY2F0ZWdvcmllcyAqLyAuY2F0ZWdvcmllcyB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOyBtYXJnaW4tdG9wOiA0cHg7IH0gLmNhdGVnb3JpZSB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXg6IDEgMSAwOyB9IC8qIEdhdWdlcyAqLyAuZ2F1Z2UgeyBzdHJva2UtbGluZWNhcDogcm91bmQ7IGZpbGw6IG5vbmU7IH0gLmdhdWdlLmhpZ2ggeyBjb2xvcjogIzE4YjY2MzsgfSAuZ2F1Z2UuYXZlcmFnZSB7IGNvbG9yOiAjZmI4YzAwOyB9IC5nYXVnZS5sb3cgeyBjb2xvcjogI2U1MzkzNTsgfSAuZ2F1Z2UtYmFzZSwgLmdhdWdlLWFyYyB7IHN0cm9rZTogY3VycmVudENvbG9yOyBzdHJva2Utd2lkdGg6IDEwOyB9IC5nYXVnZS1iYXNlIHsgc3Ryb2tlLW9wYWNpdHk6IC4yOyB9IC5nYXVnZS1hcmMgeyBmaWxsOiBub25lOyBzdHJva2UtZGFzaG9mZnNldDogMDsgYW5pbWF0aW9uLWRlbGF5OiAyNTBtczsgYW5pbWF0aW9uOiBhbmltYXRpb24tZ2F1Z2UgMXMgZWFzZSBmb3J3YXJkcyB9IC5nYXVnZSB0ZXh0IHsgZmlsbDogY3VycmVudENvbG9yOyBmb250LXNpemU6IDQwcHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IHRleHQtYW5jaG9yOiBtaWRkbGU7IGZvbnQtd2VpZ2h0OiA2MDA7IH0gLmdhdWdlIC50aXRsZSB7IGZvbnQtc2l6ZTogMThweDsgY29sb3I6ICM3Nzc3Nzc7IH0gQGtleWZyYW1lcyBhbmltYXRpb24tZ2F1Z2UgeyBmcm9tIHsgc3Ryb2tlLWRhc2hhcnJheTogMCAzMjk7IH0gfSAuYXVkaXRzIHsgbWFyZ2luLXRvcDogOHB4OyB9IC5hdWRpdC50ZXh0IHsgbWluLXdpZHRoOiA0MnB4OyB9IC5hdWRpdCBzdmcgeyBtYXJnaW46IDA7IH0gLmF1ZGl0LmhpZ2ggeyBmaWxsOiAjMThiNjYzOyB9IC5hdWRpdC5hdmVyYWdlIHsgZmlsbDogI2ZiOGMwMDsgfSAuYXVkaXQubG93IHsgZmlsbDogI2U1MzkzNTsgfSAvKiBNdXNpYyBwbHVnaW4gKi8gLnRyYWNrbGlzdCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBtYXJnaW4tbGVmdDogMjhweDsgbWFyZ2luLXRvcDogNHB4OyB3aWR0aDogMTAwJTsgfSAudHJhY2sgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogNHB4OyB9IC50cmFjayBpbWcgeyBtYXJnaW46IDAgMTBweDsgYm9yZGVyLXJhZGl1czogN3B4OyB9IC50cmFjayAubmFtZSB7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE0cHg7IH0gLnRyYWNrIC5hcnRpc3QgeyBmb250LXNpemU6IDEycHg7IG9wYWNpdHk6IC43OyB9IC8qIFBvc3RzIHBsdWdpbiAqLyAucG9zdCB7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9IC5wb3N0IC5pbmZvcyB7IGRpc3BsYXk6IGZsZXg7IG1hcmdpbi1ib3R0b206IDRweDsgfSAucG9zdCAuaW5mb3MgLnRpdGxlIHsgZm9udC1zaXplOiAxNHB4OyB3aWR0aDogNDAwcHg7IHdoaXRlLXNwYWNlOiBub3JtYWw7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBtYXgtaGVpZ2h0OiA0MHB4OzsgfSAucG9zdCAuaW5mb3MgLmRhdGUgeyBmbGV4LXNocmluazogMDsgZm9udC1zaXplOiAxMnB4OyBvcGFjaXR5OiAuNzsgd2lkdGg6IDQwcHg7IHBhZGRpbmctdG9wOiAxcHg7IH0gLyogVG9waWNzICovIC50b3BpY3MgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IH0gLyogRmFkZSBhbmltYXRpb24gKi8gLmFmIHsgb3BhY2l0eTogMDsgYW5pbWF0aW9uOiBhbmltYXRpb24tZmFkZSAxcyBlYXNlIGZvcndhcmRzOyB9IEBrZXlmcmFtZXMgYW5pbWF0aW9uLWZhZGUgeyBmcm9tIHsgb3BhY2l0eTogMDsgfSB0byB7IG9wYWNpdHk6IDE7IH0gfSAvKiBDYWxlbmRhciAqLyA6cm9vdCB7IC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LWJnOiAjZWJlZGYwOyAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1ib3JkZXI6IHJnYmEoMjcsMzEsMzUsMC4wNik7IC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUwxLWJnOiAjOWJlOWE4OyAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MMi1iZzogIzQwYzQ2MzsgLS1jb2xvci1jYWxlbmRhci1ncmFwaC1kYXktTDMtYmc6ICMzMGExNGU7IC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUw0LWJnOiAjMjE2ZTM5OyAtLWNvbG9yLWNhbGVuZGFyLWhhbGxvd2Vlbi1ncmFwaC1kYXktTDEtYmc6ICNmZmVlNGE7IC0tY29sb3ItY2FsZW5kYXItaGFsbG93ZWVuLWdyYXBoLWRheS1MMi1iZzogI2ZmYzUwMTsgLS1jb2xvci1jYWxlbmRhci1oYWxsb3dlZW4tZ3JhcGgtZGF5LUwzLWJnOiAjZmU5NjAwOyAtLWNvbG9yLWNhbGVuZGFyLWhhbGxvd2Vlbi1ncmFwaC1kYXktTDQtYmc6ICMwMzAwMWM7IC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUw0LWJvcmRlcjogcmdiYSgyNywzMSwzNSwwLjA2KTsgLS1jb2xvci1jYWxlbmRhci1ncmFwaC1kYXktTDMtYm9yZGVyOiByZ2JhKDI3LDMxLDM1LDAuMDYpOyAtLWNvbG9yLWNhbGVuZGFyLWdyYXBoLWRheS1MMi1ib3JkZXI6IHJnYmEoMjcsMzEsMzUsMC4wNik7IC0tY29sb3ItY2FsZW5kYXItZ3JhcGgtZGF5LUwxLWJvcmRlcjogcmdiYSgyNywzMSwzNSwwLjA2KTsgfTwvc3R5bGU+PGZvcmVpZ25PYmplY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxzZWN0aW9uPjxoMSBjbGFzcz0iZmllbGQiPjxpbWcgY2xhc3M9ImF2YXRhciIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsLzlqLzJ3Q0VBQWdHQmdjR0JRZ0hCd2NKQ1FnS0RCUU5EQXNMREJrU0V3OFVIUm9mSGgwYUhCd2dKQzRuSUNJc0l4d2NLRGNwTERBeE5EUTBIeWM1UFRneVBDNHpORElCQ1FrSkRBc01HQTBOR0RJaEhDRXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TXYvQUFCRUlBY3dCekFNQklnQUNFUUVERVFIL3hBR2lBQUFCQlFFQkFRRUJBUUFBQUFBQUFBQUFBUUlEQkFVR0J3Z0pDZ3NRQUFJQkF3TUNCQU1GQlFRRUFBQUJmUUVDQXdBRUVRVVNJVEZCQmhOUllRY2ljUlF5Z1pHaENDTkNzY0VWVXRId0pETmljb0lKQ2hZWEdCa2FKU1luS0NrcU5EVTJOemc1T2tORVJVWkhTRWxLVTFSVlZsZFlXVnBqWkdWbVoyaHBhbk4wZFhaM2VIbDZnNFNGaG9lSWlZcVNrNVNWbHBlWW1acWlvNlNscHFlb3FhcXlzN1MxdHJlNHVickN3OFRGeHNmSXljclMwOVRWMXRmWTJkcmg0dVBrNWVibjZPbnE4Zkx6OVBYMjkvajUrZ0VBQXdFQkFRRUJBUUVCQVFBQUFBQUFBQUVDQXdRRkJnY0lDUW9MRVFBQ0FRSUVCQU1FQndVRUJBQUJBbmNBQVFJREVRUUZJVEVHRWtGUkIyRnhFeUl5Z1FnVVFwR2hzY0VKSXpOUzhCVmljdEVLRmlRMDRTWHhGeGdaR2lZbktDa3FOVFkzT0RrNlEwUkZSa2RJU1VwVFZGVldWMWhaV21Oa1pXWm5hR2xxYzNSMWRuZDRlWHFDZzRTRmhvZUlpWXFTazVTVmxwZVltWnFpbzZTbHBxZW9xYXF5czdTMXRyZTR1YnJDdzhURnhzZkl5Y3JTMDlUVjF0ZlkyZHJpNCtUbDV1Zm82ZXJ5OC9UMTl2ZjQrZnIvMmdBTUF3RUFBaEVERVFBL0FPTGV5UllJWTdXZWN5eTRMSnUzQmV2VDBxRFU3eSswQzZqdEk1M3VQTUJKRW5PUHBYUzZpOXRGY0NXMkpsTWcrZmN2Q0RuQUdPMVljdHFkWTFaYmdYQ3BERVFESTZrWVh2OEExcno0MmU1NlVuZU40czB0Sm5lL0JDWGMxbklrWVlSREd4dHd5U1FmOGlvZFJ1RlMyRmpjeHVOdUdhVU1yNVBmUHB5VHhUZFlzSWhIOXIwZWFWMUhCK1hJL1NxdGpvMm9hakZMNW9WcmFGaXJOT3Z6bGlPRlU5U2ZhcWpaTXo1bTFabHNTcGYyWWlSenRFV1kwOHJIQXdlY242MWFndDNiVEdsbGxrbE14QVZXYnFGOUIzeFMvd0JuK1JwNkNlWUxPb3lpcWR2QzQ0SS9IQnE1WWFkYjNadEVVT3NzZVZqNnFwSHVjVTIwWEJKTTBiL1NyVnRNdEFzdXd0RUhSdDJOdnIxcUxRSllyRzAreHdMR3Ztdm56R0c1bUE3ZXVLcXphMWV5Mjg5dExCRmdPRWlYY0NUanNQcldjMDgybFhDektyeDc4SC9ybm4xN1ZDZDJaVkhENFdkdEd0amZSWE1FN3I5bmlsS2xpZHZmR2VmVG1xZXJlQVpmSWoxVFE3cDJsVUVzcnNEbjFLbjg2NFN4MCtiVjlKMWNtUnBSRUJJeGtreGtaSEpQWC84QVZYWCtIUEgxaG9maFpMSzlXNDgyRUh5RkM1M3FPb3owNFBGWHNSQ050RG1iZXpNOXdSZW9TMXMrV1UvTHZicHo5VDJyb0xpT0NlMGthOFZFVUQ5Mk00eHhqajg2TE9hR1pMNjh1b0Z0NFFOeWJtM0VzeEpKUHR4aXNQVUlkVXY0VGVXMERTV3lrTU1MbG94MkJIcDdpc21uSm5STjhzYkk2YlI0TFVlZE5OY3lKSEhFSGZ6SEJCNStWQUIwSFhqclVaMG1YVVh1cmExWlk3ZThBWmtNaE93anB0K282ajJxZTlTS0x3K3NnamtpTWtZbE9WNnR0QUpCcWhZYXhMQkl6eVdmekVaU1FaQUh1UlZ4aW10REZMa3N6bFVFMWw0bW1obW1rKzAyMHJCNUZsSytaZ2NEK1dSNlZ1MjNpSzlra1lTc2pXMGtYNzFYazJnRUFENWMrdy9HckhpSzYwblVOUHVMenlndDZjTSt3Z2I4Y2ZnY1lybDBlSzIyUlh6TDVFaTdnQ29QeS9Xb2NiN21rWUozYlpwUXhRWE13TXNya1JCbzBNTEFaejcrdUNhazFPMDA0d21OTHFSU1dCL2VEZmtET0JXVGNhY3pTdkhvNW4reStXQ2ozQi9Nai84QVdhUzVoZlR0UUhsdTdQYngrV001eDBBWTQ3NUp6VFVDbnkvRGE1MW1sVzE1cW1rUlJYQmViN0t5MjZDTndHa3lPTjJlbkdPZnJXL3BQZ1hRTFNlWmJpeURYS25hcEZ3emdqaGdlZ3hqL0htdUF1OUUxQjlNaGxzbmtkcmxVYzdKZ3NoQzl4MDV5ZW50WFlhSnFlcXl3UjJJall6MjlxTXRMOHJPK1RuUFVqdHpTbGRhM0xWcjh0alI4VmFIcDBPbU0rbnd4eDNTakNONWpEYWNmV3ZOYis0aVM5SzM3dUVPMGgwR1RnNHovV3R5NnVOVXU0eGY2aEE2a3liWTRjbjZjblBYTlkycnlRVzkrSko3Ykx4QUZnajdnRzlDRHhRcnJjeWxmbTJPcDBuUm9MUzRsZ3RKU1lWaGFUZElSOTQ0d3VjWjlhMXRCdXJrM2theVNNNmdoY2RFT0IzejE2Vmc2UnJjK29XVGVWcDh5ekllUjVlVTY4RUhINTFUdnZFbXBYRU9ObjltMzFvd01zSkFPVnprWTlxVUkzbGRrTk42STlDbXNKcDBOMXA5MFlycDNZcVNnMmhTUmxPbkl5UHI3MXhyYWJkeU5meDM1dUI1RGdvUys0U1o1UFVaQS9IRkxhZVBwYm0wbU5rTjkwa2dFa0VoNkwwSitnOWZldERUUEVkdnJYbjJFMG9lODh2YktBbXdmaDlLMGxaTzZGQ2Jpck04NXVkSmtqaFp4YVJ3ZVd4ZmlZdWVjWUl6NjRyZXNaWnA5UTBlOWRjcmp5SndCbk9Ca0g4dUt1WGVnMitqSTF3Wm5hSm0yK1c3Nzl5blBmSCtjVkJwK3F'... 2315867 more characters,
    request: { agent: [Agent], hook: [Function: bound bound t] }
  },
  documentation_url: 'https://docs.github.com/rest/reference/repos#create-or-update-file-contents'
}
Error: Invalid request.

"sha" wasn't supplied.
My metrics.yml
name: GitHub metrics
on:
  # Schedule updates
  schedule: [{cron: "0 * * * *"}]
  push: {branches: "master"}
jobs:
  github-metrics:
    runs-on: ubuntu-latest
    steps:
      # See action.yml for all options
      - uses: lowlighter/metrics@latest
        with:
          # Your GitHub token
          token: ${{ secrets.METRICS_TOKEN }}
          # GITHUB_TOKEN is a special auto-generated token restricted to current repository, which is used to push files in it
          committer_token: ${{ secrets.GITHUB_TOKEN }}
          base: header, activity, community, repositories, metadata
          plugin_isocalendar: yes
          plugin_isocalendar_duration: full-year
          plugin_music: yes
          plugin_music_provider: spotify
          plugin_music_token: "${{ secrets.SPOTIFY_CLIENT_ID }}, ${{ secrets.SPOTIFY_CLIENT_SECRET }}, ${{ secrets.SPOTIFY_REFRESH_TOKEN }}"
          plugin_music_mode: recent
          plugin_music_limit: 5
          plugin_languages: yes
          plugin_followup: yes
          plugin_topics: yes
          plugin_topics_sort: stars
          plugin_topics_limit: 15
          plugin_lines: yes
          plugin_habits: yes
          plugin_habits_from: 100
          plugin_pagespeed: yes
          plugin_pagespeed_token: ${{ secrets.PAGESPEED_TOKEN }}
          plugin_pagespeed_detailed: yes

Expected behavior
The workflow runs and updates the SVG

To Reproduce
Create a repo and use the configuration above

Release v3.4

๐Ÿ“ฆ New features

  • ๐Ÿ“œ Licenses plugin (repository plugin) โœจ new!
    • #118 Display permissions, limitations and conditions from your repository license along with inherited rules from used dependencies!
    • #118 plugin_licenses_ratio and plugin_licenses_legal lets you custom plugin output
  • ๐Ÿ… Contributors plugin (repository plugin) โœจ new!
    • #126 Display contributors from between a range of commit or a single branch with plugin_contributors_base and plugin_contributors_head
    • #146 Display number of contributions per contributors with plugin_contributors_contributions and ignore bot users with plugin_contributors_ignored
  • ๐Ÿ™‹ Introduction plugin โœจ new!
    • #127 Display organization/repository description or user biography!
  • ๐ŸŒ‡ GitHub Skyline 3D calendar โœจ new!
    • #147 Display your animated 3D commits calendar from skyline.github.com
      • โš ๏ธ This plugin should be used as standalone because resulting image may be a few maga-bytes
      • โ„น๏ธ Actual image is animated
  • โฐ WakaTime plugin โœจ new!
    • #90 Display your WakaTime statistics!
    • #90 plugin_wakatime_sections supports projects, languages, code editors and operating systems. Each categorie can be either displayed as a single entry, with graphs or both
  • ๐Ÿ’‰ Nightscout โœจ new!
    • #108 Add new plugin which lets you display blood sugar values from Nightscout website!
  • ๐Ÿ—ƒ๏ธ Base content
    • #124 Organization metrics now display location and "verified" status
  • ๐ŸŒธ Anilist
    • eb89bc3 Add plugin_anilist_limit_characters to limit displayed characters
    • #92 Add handling when rate limit is reached
  • ๐Ÿˆท๏ธ Most used languages
    • eb89bc3 Add plugin_languages_threshold to automatically hide languages used less than a certain threshold
    • a202469 Add plugin_languages_details support for repository template
    • #124 plugin_languages_skipped now supports non-owned repositories (prefix them with owner name)
  • ๐ŸŽผ Music plugin
    • #104 Add plugin_music_played_at to display when recently music was last played (Spotify only)
  • ๐Ÿ“ฐ Activity plugin
    • #119 Add plugin_activity_visibility to limit visibility to public events when using a repo scope token
    • #119 Add plugin_activity_timestamps to display events dates
    • #119 Add support for repository template now supports activity plugin
    • #119 Organization activity now display actor name
    • #119 Title are now ellipsed (...) instead of being cropped
  • ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ People plugin
    • #124 Add members type for plugin_people_types to display organization members
    • #124 Add plugin_people_shuffle for varied output
  • ๐Ÿ—‚๏ธ Active projects plugin
    • #124 plugin_projects_repositories now support mixed repositories owner (i.e. using organization-owned repositories project with an user account and vice-versa)
  • ๐ŸŒ Web instances
    • #107 Improve placeholders for web instance inputs
    • #149 Compatible options for base and core are now displayed in sidebar
    • #149 Remove ratelimit-header for common resources, add footer and detailed error messages
  • ๐Ÿฆ‘ Miscelleanous
    • #88 Splitted tests in respective plugins directory for easier maintaining
    • #91 Improved mocking of REST API octokit
    • #117 Add repositories_affiliations to restrict used repositories by owner, collaborator or member organization
      • โš ๏ธ Default affiliation will be set to owner instead of "" (rollback to behavior <= v3.1) to distorting metrics due to organization memberships
    • 5eaf603 Add npm run quickstart plugin and npm run quickstart template to ease metrics customization and new features
    • #121 Add config_twemoji option to replace emoji by twemoji for consistent rendering over all platforms
    • 1dd2d15 Display logs of raw commands for easier debug
    • @latest was moved from git tag to a git branch

๐Ÿงฐ Fixes

  • 8e3ad79 Fix display issues for placeholder on web instance
  • c42b9a2 Fix plugin_projects_limit option were a zero-value would remove all displayed projects, including repositories one
  • #107 Music plugin now display recently music more accurately, and without duplicates
  • #117 Habits plugin now correctly parse github/linguist for languages with special characters (e.g. C++)
  • #117 Stargazers plugin now handle betters graphs when no ouput has been recorded
  • #124 Fix issues with people plugin for organization
  • 618d4a7 Web instance will now use correct default values for boolean inputs
  • a63842f Fix config_output input for action
  • bd8b980 Fix web instance Cache-Control header which was 1000 times higher than expected value
  • d972f45 Fix optimize input for action

What if repo is under "Organization account" and not user

I run into problem while setting up the metrics action for repo under "Organization account". I do have 2 user accounts with access to that repo (both do have all tokens setup and ready to go).
Problem is, that repo link is: SPECTADO/muj.dobryandel.cz (private repo) but SPECTADO is not user.

My config is as follows:

token: ${{ secrets.METRICS_TOKEN }}
committer_token: ${{ secrets.GITHUB_TOKEN }}
template: repository
# user: 'SPECTADO'
query: '{"repo":"muj.dobryandel.cz"}'

If I set user to "SPECTADO", link to repo will be ok, but I got an error:

An error occured, logging debug message :
metrics/compute/SPECTADO > start
{
  repo: 'muj.dobryandel.cz',
  base: false,
  'base.header': true,
  'base.activity': true,
  'base.community': true,
  'base.repositories': true,
  'base.metadata': true,
  'config.timezone': undefined,
  'config.output': 'svg',
  'config.animations': true,
  'config.padding': '6%',
  repositories: 100,
  template: 'repository'
}
metrics/compute/SPECTADO > graphql query
Error: user not found
Error: Process completed with exit code 1.

If I leave user unset (or set it to real user), I got this: (master-spectado/muj.dobryandel.cz is invalid link to repo)

An error occured, logging debug message :
metrics/compute/master-spectado > start
{
  repo: 'muj.dobryandel.cz',
  base: false,
  'base.header': true,
  'base.activity': true,
  'base.community': true,
  'base.repositories': true,
  'base.metadata': true,
  'config.timezone': undefined,
  'config.output': 'svg',
  'config.animations': true,
  'config.padding': '6%',
    at /metrics/node_modules/@octokit/request/dist-node/index.js:66:23
    at processTicksAndRejections (node:internal/process/task_queues:93:5)
    at async default (file:///metrics/source/templates/repository/template.mjs:24:24)
    at async metrics (file:///metrics/source/app/metrics.mjs:71:11)
    at async file:///metrics/source/app/action/index.mjs:255:28 {
  status: 404,
  headers: {
    'access-control-allow-origin': '*',
    'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset',
    connection: 'close',
    'content-encoding': 'gzip',
    'content-security-policy': "default-src 'none'",
    'content-type': 'application/json; charset=utf-8',
    date: 'Thu, 21 Jan 2021 10:24:32 GMT',
    'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
    server: 'GitHub.com',
    status: '404 Not Found',
    'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
    'transfer-encoding': 'chunked',
    vary: 'Accept-Encoding, Accept, X-Requested-With',
    'x-accepted-oauth-scopes': 'repo',
    'x-content-type-options': 'nosniff',
    'x-frame-options': 'deny',
    'x-github-media-type': 'github.v3; format=json',
    'x-github-request-id': '0400:4719:408E90:9B3FFA:60095660',
    'x-oauth-scopes': '',
    'x-ratelimit-limit': '5000',
    'x-ratelimit-remaining': '4998',
    'x-ratelimit-reset': '1611228272',
    'x-ratelimit-used': '2',
    'x-xss-protection': '1; mode=block'
  },
  request: {
    method: 'GET',
    url: 'https://api.github.com/repos/master-spectado/muj.dobryandel.cz/commits?per_page=100&page=0',
    headers: {
      accept: 'application/vnd.github.v3+json',
      'user-agent': 'octokit-core.js/3.2.4 Node.js/15.5.1 (linux; x64)',
      authorization: 'token [REDACTED]'
    },
    request: { agent: [Agent], hook: [Function: bound bound register] }
  },
  documentation_url: 'https://docs.github.com/rest/reference/repos#list-commits'
}
  'config.order': [],
  repositories: 100,
  'repositories.forks': false,
  template: 'repository'
}
metrics/compute/master-spectado > content order : base.header,followup,languages,projects,pagespeed,stargazers
metrics/compute/master-spectado > graphql query
metrics/compute/master-spectado > retrieving repositories after null
metrics/compute/master-spectado > keeping only 100 repositories
metrics/compute/master-spectado > loaded 0 repositories
metrics/compute/master-spectado > compute
metrics/compute/master-spectado/muj.dobryandel.cz > retrieving single repository muj.dobryandel.cz
metrics/compute/master-spectado/muj.dobryandel.cz > querying api for commits
metrics/compute/master-spectado/muj.dobryandel.cz > loading page 0
Error: Not Found
Error: Process completed with exit code 1.

Is there a way how to configure it to access repo under "Organization account"? Meaning that user account and part before repo name won't be the same?
And yes, setting query: '{"repo":"SPECTADO/muj.dobryandel.cz"}' won't work because resulting path will be master-spectado/SPECTADO/muj.dobryandel.cz

YouTube plugin

I'm happy to make a plugin that displays recently posted videos for YouTube channels, if people like this idea I'll PR it

The metrics.svg file is not getting created

I followed the steps as you specified in the repos readme.md. After I create the GitHub action workflow you said it will generate a new metrics image, but there are no images created.

error message: import app from "./instance.mjs"

Good day,
after running npm start i always get the following error messages:

npm WARN npm npm does not support Node.js v10.21.0
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9.
npm WARN npm You can find the latest version at https://nodejs.org/

> [email protected] start /root/node/metrics
> node source/app/web/index.mjs

/root/node/metrics/source/app/web/index.mjs:2
  import app from "./instance.mjs"
         ^^^

SyntaxError: Unexpected identifier
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: `node source/app/web/index.mjs`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start 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!     /root/.npm/_logs/2021-01-17T00_07_36_560Z-debug.log

/root/.npm/_logs/2021-01-17T00_07_36_560Z-debug.log

0 info it worked if it ends with ok
1 warn npm npm does not support Node.js v10.21.0
2 warn npm You should probably upgrade to a newer version of node as we
3 warn npm can't make any promises that npm will work with this version.
4 warn npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9.
5 warn npm You can find the latest version at https://nodejs.org/
6 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'start' ]
7 info using [email protected]
8 info using [email protected]
9 verbose run-script [ 'prestart', 'start', 'poststart' ]
10 info lifecycle [email protected]~prestart: [email protected]
11 info lifecycle [email protected]~start: [email protected]
12 verbose lifecycle [email protected]~start: unsafe-perm in lifecycle true
13 verbose lifecycle [email protected]~start: PATH: /usr/share/npm/node_modules/npm-lifecycle/node-gyp-bin:/root/node/metrics/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:$
14 verbose lifecycle [email protected]~start: CWD: /root/node/metrics
15 silly lifecycle [email protected]~start: Args: [ '-c', 'node source/app/web/index.mjs' ]
16 silly lifecycle [email protected]~start: Returned: code: 1  signal: null
17 info lifecycle [email protected]~start: Failed to exec start script
18 verbose stack Error: [email protected] start: `node source/app/web/index.mjs`
18 verbose stack Exit status 1
18 verbose stack     at EventEmitter.<anonymous> (/usr/share/npm/node_modules/npm-lifecycle/index.js:283:16)
18 verbose stack     at EventEmitter.emit (events.js:198:13)
18 verbose stack     at ChildProcess.<anonymous> (/usr/share/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
18 verbose stack     at ChildProcess.emit (events.js:198:13)
18 verbose stack     at maybeClose (internal/child_process.js:982:16)
18 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:259:5)
19 verbose pkgid [email protected]
20 verbose cwd /root/node/metrics
21 verbose Linux 4.19.0-13-amd64
22 verbose argv "/usr/bin/node" "/usr/bin/npm" "start"
23 verbose node v10.21.0
24 verbose npm  v5.8.0
25 error code ELIFECYCLE
26 error errno 1
27 error [email protected] start: `node source/app/web/index.mjs`
27 error Exit status 1
28 error Failed at the [email protected] start script.
28 error This is probably not a problem with npm. There is likely additional logging output above.
29 verbose exit [ 1, true ]

PageSpeed plugin causing errors in workflow runs.

Bug description
With the new metrics version (v2.25) my github workflow fails.

Expected behavior
The workflow should run normally but with the 'latest' tag set in the workflow file, now my workflow fails.

To Reproduce
I think the plugin affected is PageSpeed, because the error is related to that.
I fixed by setting the tag to v2.24 in the workflow file.

Additional context and screenshots

This is the error message:

ejs:412 410| <div class="row fill-width"> 411| <section class="categories"> >> 412| <% for (const {score, title} of computed.plugins.pagespeed.scores) { %> 413| <div class="categorie column"> 414| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" width="50" height="50" class="gauge <%= !Number.isNaN(score) ? (score >= 0.9 ? 'high' : score >= 0.5 ? 'average' : 'low') : '' %>"> 415| <circle class="gauge-base" r="53" cx="60" cy="60"></circle> computed.plugins.pagespeed.scores is not iterable

fail

Language activity converts C++ to C

I work with C++, and don't work with C. The language activity section yet drops the ++ and replaces it with nothing, yielding an incorrect language. This is specifically limited to language activity -- most used languages works fine

image

Spotify Recently Listened always returns 400

Bug description
When the Recently Listened Tracks plugin is used, a message is displayed that claims that the API request received a 400 HTTP response. I've followed the setup tutorials multiple times and nothing fixes it.

Expected behavior
Displays recently listened tracks.

To Reproduce
Follow the tutorial to setup the Recently Listened plugin.

Additional context and screenshots
Here are the last lines of the GitHub Actions output:

/usr/bin/docker run --name cc4956019579e8637340a187fb341d5012884c_b8f32e --label cc4956 --workdir /github/workspace --rm -e INPUT_TOKEN -e INPUT_COMMITTER_TOKEN -e INPUT_USER -e INPUT_TEMPLATE -e INPUT_BASE -e INPUT_PLUGIN_MUSIC -e INPUT_PLUGIN_MUSIC_PROVIDER -e INPUT_PLUGIN_MUSIC_TOKEN -e INPUT_PLUGIN_MUSIC_MODE -e INPUT_PLUGIN_MUSIC_LIMIT -e INPUT_FILENAME -e INPUT_OPTIMIZE -e INPUT_REPOSITORIES -e INPUT_PLUGIN_PAGESPEED -e INPUT_PLUGIN_PAGESPEED_DETAILED -e INPUT_PLUGIN_PAGESPEED_TOKEN -e INPUT_PLUGIN_LINES -e INPUT_PLUGIN_TRAFFIC -e INPUT_PLUGIN_HABITS -e INPUT_PLUGIN_HABITS_FROM -e INPUT_PLUGIN_LANGUAGES -e INPUT_PLUGIN_LANGUAGES_IGNORED -e INPUT_PLUGIN_LANGUAGES_SKIPPED -e INPUT_PLUGIN_FOLLOWUP -e INPUT_PLUGIN_MUSIC_PLAYLIST -e INPUT_PLUGIN_POSTS -e INPUT_PLUGIN_POSTS_SOURCE -e INPUT_PLUGIN_POSTS_LIMIT -e INPUT_PLUGIN_ISOCALENDAR -e INPUT_PLUGIN_ISOCALENDAR_DURATION -e INPUT_PLUGIN_GISTS -e INPUT_PLUGIN_TOPICS -e INPUT_PLUGIN_TOPICS_SORT -e INPUT_PLUGIN_TOPICS_LIMIT -e INPUT_PLUGIN_PROJECTS -e INPUT_PLUGIN_PROJECTS_LIMIT -e INPUT_DEBUG -e INPUT_VERIFY -e INPUT_DRYRUN -e INPUT_PLUGINS_ERRORS_FATAL -e HOME -e GITHUB_JOB -e GITHUB_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_REPOSITORY_OWNER -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RETENTION_DAYS -e GITHUB_ACTOR -e GITHUB_WORKFLOW -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GITHUB_EVENT_NAME -e GITHUB_SERVER_URL -e GITHUB_API_URL -e GITHUB_GRAPHQL_URL -e GITHUB_WORKSPACE -e GITHUB_ACTION -e GITHUB_EVENT_PATH -e GITHUB_ACTION_REPOSITORY -e GITHUB_ACTION_REF -e GITHUB_PATH -e GITHUB_ENV -e RUNNER_OS -e RUNNER_TOOL_CACHE -e RUNNER_TEMP -e RUNNER_WORKSPACE -e ACTIONS_RUNTIME_URL -e ACTIONS_RUNTIME_TOKEN -e ACTIONS_CACHE_URL -e GITHUB_ACTIONS=true -e CI=true -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands" -v "/home/runner/work/micahlt/micahlt":"/github/workspace" cc4956:019579e8637340a187fb341d5012884c
GitHub metrics
========================================================
Version                   | 2.8.0
Configuration             | loaded
Template to use           | classic
Github token              | provided
Github GraphQL API        | ok
Github REST API           | ok
SVG output file           | github-metrics.svg
SVG optimization          | true
GitHub user               | micahlt
Debug mode                | false
Base parts                | header, activity, community, repositories, metadata
Plugins enabled           | music
Music provider            | spotify
Music plugin mode         | recent
Music playlist            | null
Music tracks limit        | 4
Music token               | provided
Repositories to use       | 100
Plugin errors             | ignore
Render                    | complete
Verify SVG                | false
Repository                | micahlt/micahlt
Branch                    | master
Committer token           | provided
Committer REST API        | ok
Committer                 | (unknown)
Previous render sha       | 03e46c0bb92285b2c5783d9e48c0c1769f5ac7cc
Commit to repo            | ok
Success !

Add language percentages to classic template

It would be useful to have something like this available for use in the classic template:

The percentages are already in the terminal template and it would be good to have the percentages available in classic as well.

Only installing prod dependencies is missing faker

When I start the latest master or the latest tag I get the following error when only install prod dependencies with npm:

Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'faker' imported from /home/sandro/src/metrics/source/app/mocks.mjs
    at new NodeError (node:internal/errors:329:5)
    at packageResolve (node:internal/modules/esm/resolve:697:9)
    at moduleResolve (node:internal/modules/esm/resolve:738:18)
    at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:852:11)
    at Loader.resolve (node:internal/modules/esm/loader:86:40)
    at Loader.getModuleJob (node:internal/modules/esm/loader:230:28)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:57:40)
    at link (node:internal/modules/esm/module_job:56:36) {
  code: 'ERR_MODULE_NOT_FOUND'

The website of the project is not loading in Safari 14.0.3

Bug description
The website of the project is not loading in Safari 14.0.3. This problem goes away when I turn on responsive mode in Safari.

Expected behavior
Opening the project in Safari (14.0.3 - Big Sur Version 11.2 Beta (20D5029f)).

To Reproduce
I Don't know ๐Ÿคท๐Ÿปโ€โ™‚๏ธ

Additional context and screenshots
image

image

image

Stackoverflow stats

Show stackoverflow stats like:

  • Reputation points
  • Number of Questions and Answers
  • Top voted answer
  • Badges

๐Ÿž: Crop image where content ends

Bug description
Hi, There's a noticeable space after the content in the generated image.

Expected behavior
The image is cropped right after the content ends.

To Reproduce
Quite nothing, just make sure metrics is in the ReadMe. ๐Ÿ™‚

Additional context and screenshots

Phone Desktop
photo_2020-12-31_12-58-16 Screenshot from 2020-12-31 13-02-48

Adding organization for languages and repos by changing option

In file https://github.com/lowlighter/metrics/blob/master/source/queries/repositories.graphql we have the request for gathering repos and its related languages.

I think we remove here OwnerAffiliations as we already have isFork line as here : repositories($after first: $repositories, isFork: false, ownerAffiliations: OWNER, orderBy: {field: UPDATED_AT, direction: DESC}) .

Both of them seem redundant as if we don't fork, we can't not be owner. Those settings include then organizations and maybe even the projects in which you collaborate but that are not fork (collaborator in friend's project comes to mind).

I can't try pull request right now but I suggest exploring this area, I tried some differences in GraphiQL explorer and it seems pretty good.

What's the format of personal access token?

Hello, I ran into a problem that whatever format I entered for the access token, I still can't build the whole pic.
image
If possible, please change it here and open a pull request in that repo. Thanks!

Support emojis

Hey, countless things can't support emojis currently, for example commit messages. Using something like twemoji-parser would allow us to add emoji support. It'd be really cool.

Stargazer stats broke ~6 days ago

Good: https://github.com/LunarWatcher/LunarWatcher/blob/42bb1358fa359ba9cbe46020c33d3ff8d26984ff/github-metrics.svg

image

Bad: https://github.com/LunarWatcher/LunarWatcher/blob/1a7b98fbde6e201088d765a5b9228e6fe98d52f9/github-metrics.svg

image

It's also currently out of date. Got another star 19 hours ago (at the time of writing) that hasn't clocked in at all. Looks like it decided to blatantly ignore a repo of mine (specifically this one) out of the blue.

In the two versions included, there's also a sudden shift in language percentage clocking (Java bumped, C++ dropped) that may be related to whatever changes were made. Currently on the master branch, but this seems to have started with 3.3 (and the same applies to the other two issues I've opened)

[question] Fails with Invalid GitHub token

/.github/workflow/stats.yml

name: GitHub metrics as SVG image
on:
  # Update metrics each 15 minutes. Edit this if you want to increase/decrease frequency
  # Note that GitHub image cache (5-15 minutes) still apply so it is useless to set less than this, you're image won't be refreshed
  schedule: [{cron: "*/60 * * * *"}]
  # Add this if you want to force update each time you commit on master branch
  push: {branches: "master"}
jobs:
  github-metrics:
    runs-on: ubuntu-latest
    steps:
      - uses: joe733/metrics@latest # from my fork
        # This line will prevent this GitHub action from running when it is updated by itself if you enabled trigger on master branch
        if: "!contains(github.event.head_commit.message, '[Skip GitHub Action]')"
        with:

          # Your GitHub token ("public_repo" is required to allow this action to update the metrics SVG image)
          token: ${{ secrets.METRICS_TOKEN }}

          # Your GitHub user name
          user: joe733

          # Additional options
          # ==========================================

          # The GitHub token used to commit to your repository (defaults to the same value as "token")
          # This can be used to specify the token of a bot account if you use a personal token with advanced permissions
          # (which is needed if you want to include metrics of your private repositories, or to enable plugins like traffic)
          # committer_token: ${{ secrets.METRICS_BOT_TOKEN }}

          # Path/filename to use to store generated SVG
          filename: github-metrics.svg

          # If you own a website and you added it to your GitHub profile,
          # You can provide a PageSpeed token to add your site's performance results on the metrics SVG image
          # See https://developers.google.com/speed/docs/insights/v5/get-started to obtain a key
          plugin_pagespeed: no
          # pagespeed_token: ${{ secrets.PAGESPEED_TOKEN }}

          # Enable repositories lines added/removed count
          plugin_lines: no

          # Enable repositories traffic (pages views) count
          # The provided GitHub token will require "repo" permissions
          plugin_traffic: no

          # Enable or disable coding habits metrics
          plugin_habits: no

          # Enable debug logs
          debug: no

Cron Log

Run joe733/metrics@latest
Error: You must provide a valid GitHub token
    at /home/runner/work/_actions/joe733/metrics/latest/action/dist/index.js:598:428
    at Module.76677 (/home/runner/work/_actions/joe733/metrics/latest/action/dist/index.js:598:1943)
    at __webpack_require__ (/home/runner/work/_actions/joe733/metrics/latest/action/dist/index.js:598:1240567)
    at /home/runner/work/_actions/joe733/metrics/latest/action/dist/index.js:598:1241317
    at Object.<anonymous> (/home/runner/work/_actions/joe733/metrics/latest/action/dist/index.js:598:1241345)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
GitHub metrics as SVG image
========================================================
Version             | 1.7.0
Templates           | loaded
GitHub user         | joe733
Output file         | github-metrics.svg
Github token        | missing
Error: You must provide a valid GitHub token

But I've provided the token with public-repo access:

Screenshot from 2020-10-17 13-55-10

Where am I going wrong?

๐Ÿž: Orgnaizaion count seems incorrect

Bug description
I guess the headline speaks :)

Expected behavior
The organizations are correctly counted.

To Reproduce
Just make a successful build.

Additional context and screenshots
Screenshot from 2020-12-28 09-35-48

Shouldn't organization count be 2 here ๐Ÿค”?

Commits

Hey @lowlighter ,
I am observing these days that GitHub actions generated by metrics are not being counted to my commits although I see them in my repo but not in whole contributions.
Any Idea About It?

URL parameters do nothing

On the metrics website, changing the URL parameters of a rendered image do not affect it at all. For instance, https://metrics.lecoq.io/Nixinova always shows the same image no matter what URL params (if any) you put. The only way to change the content of the image is to go back to the homepage and re-render the image. Is this intended?

Issue when manually triggering the github workflow

Hi I'm not really sure why an error occurs within the work flow.
Seems to be the graphql query that is failing.

this is the error log

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
An error occured, logging debug message :
metrics/compute/uoojin1 > start
{
languages: true,
isocalendar: true,
stars: true,
'languages.ignored': [ 'Jupyter Notebook' ],
'languages.skipped': [],
'isocalendar.duration': 'half-year',
'stars.limit': 4,
base: false,
'base.header': true,
'base.activity': true,
'base.community': true,
'base.repositories': true,
'base.metadata': true,
'config.timezone': 'America/Toronto',
'config.output': 'svg',
'config.animations': true,
'config.padding': '6%',
repositories: 100,
template: 'classic'
}
metrics/compute/uoojin1 > graphql query
Error: Something went wrong while executing your query. Please include 0601:77AA:22CD5C0:282BEE0:5FF6B8FA when reporting this issue.
at /metrics/node_modules/@octokit/graphql/dist-node/index.js:69:13
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at async metrics (file:///metrics/source/app/metrics.mjs:46:35)
at async file:///metrics/source/app/action/index.mjs:233:28 {
errors: [
{
message: 'Something went wrong while executing your query. Please include 0601:77AA:22CD5C0:282BEE0:5FF6B8FA when reporting this issue.'
}
],
headers: {
'access-control-allow-origin': '*',
'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset',
'cache-control': 'no-cache',
connection: 'close',
'content-encoding': 'gzip',
'content-security-policy': "default-src 'none'",
'content-type': 'application/json; charset=utf-8',
date: 'Thu, 07 Jan 2021 07:32:11 GMT',
'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
server: 'GitHub.com',
status: '200 OK',
'strict-transport-security': 'max-age=31536000; includeSubdomains; preload',
'transfer-encoding': 'chunked',
vary: 'Accept-Encoding, Accept, X-Requested-With, Accept-Encoding',
'x-accepted-oauth-scopes': 'repo',
'x-content-type-options': 'nosniff',
'x-frame-options': 'deny',
'x-github-media-type': 'github.v3; format=json',
'x-github-request-id': '0601:77AA:22CD5C0:282BEE0:5FF6B8FA',
'x-oauth-scopes': '',
'x-ratelimit-limit': '5000',
'x-ratelimit-remaining': '4997',
'x-ratelimit-reset': '1610007590',
'x-ratelimit-used': '3',
'x-xss-protection': '1; mode=block'
},
request: {
query: 'query Metrics {\n' +
' user(login: "uoojin1") {\n' +
' databaseId\n' +
' name\n' +
' login\n' +
' createdAt\n' +
' avatarUrl\n' +
' websiteUrl\n' +
' isHireable\n' +
' twitterUsername\n' +
' repositories(last: 0, isFork: false, ownerAffiliations: OWNER) {\n' +
' totalCount\n' +
' totalDiskUsage\n' +
' nodes {\n' +
' name\n' +
' }\n' +
' }\n' +
' packages {\n' +
' totalCount\n' +
' }\n' +
' starredRepositories {\n' +
' totalCount\n' +
' }\n' +
' watching {\n' +
' totalCount\n' +
' }\n' +
' sponsorshipsAsSponsor {\n' +
' totalCount\n' +
' }\n' +
' sponsorshipsAsMaintainer {\n' +
' totalCount\n' +
' }\n' +
' contributionsCollection {\n' +
' totalRepositoriesWithContributedCommits\n' +
' totalCommitContributions\n' +
' restrictedContributionsCount\n' +
' totalIssueContributions\n' +
' totalPullRequestContributions\n' +
' totalPullRequestReviewContributions\n' +
' }\n' +
' calendar:contributionsCollection(from: "2020-12-24T07:32:10.474Z", to: "2021-01-07T07:32:10.474Z") {\n' +
' contributionCalendar {\n' +
' weeks {\n' +
' contributionDays {\n' +
' color\n' +
' }\n' +
' }\n' +
' }\n' +
' }\n' +
' repositoriesContributedTo {\n' +
' totalCount\n' +
' }\n' +
' followers {\n' +
' totalCount\n' +
' }\n' +
' following {\n' +
' totalCount\n' +
' }\n' +
' issueComments {\n' +
' totalCount\n' +
' }\n' +
' organizations {\n' +
' totalCount\n' +
' }\n' +
' }\n' +
'}\n'
}
}
Error: Process completed with exit code 1.

New plugins ideas

This is a memento to remember cool ideas to implement. If you want to suggest ideas, you can comment below :)

  • Interests / Topics
    Seems there are no GitHub api to retrieve starred topics, but it could be possible to make a plugin which fetch them with puppeteer from github.com/stars/username/topics. Also from this page it's possible to get stars by languages, thus deducing most followed languages by the user

  • Projects
    It's possible to retrieve projects of an user, so it would be possible to add a new section which display projects with their progress, todo/in progress/done tasks.

  • Isometric-contributions
    isometric-contributions looks pretty cool although it's a chrome extension. Maybe it's possible to generate them with actions and integrate it as plugin ?

  • Gists
    Since Gists was removed for Total disk use, these metrics are now unused. Got to add them back somewhere

  • Most productive days and Most productive hours
    Similarly to waka times

  • Twitter integration
    Something like displaying last tweet ? Plus twitter can be associated to github account si it wouldn't be difficult. Check whether twitter api is easy to integrate else use puppeteer

  • Display available for hire (in base "header")
    Use isHireable from user

  • Rss feed
    Maybe some kind of rss feed displayer for generic source ?

Nightscout Plugin

Nightscout is an open source website that people in the diabetes community use to easily keep track of Continuous Glucose Monitor glucose data in the cloud

I've already made a plugin on my fork to integrate this for my own personal use, and I'd be happy to PR it in, however:

  • It's relatively niche
  • Unsure how much this aligns with the direction you want to go in with this project

Let me know if this is something you'd be interested in. Here's my fork and a preview:
Nightscout Metrics

[Feature] Seperate commiting user from user displayed

description

I would really enjoy the ability to separately specify the bot account/token that commits the newly generated svg and the account/token from which the data is collected.

background

Currently I have the problem that I would like to collect data from all my repositories (therefore I need my personal token) and I don't wan't to commit the generated image with my personal token due to it generating fake stats.

Svg icons

I saw some svg icons being used and I was wondering where I could get them?

Site is down

Bug description
Invalid SSL certificate

Additional context and screenshots
image

Sponsored

Is sponsored people who are sponsoring you?

Error: Process completed with exit code 125 when using metrics@master

The following configuration has run wrong with throwing Error: Process completed with exit code 125.

name: Metrics
on:
  # Schedule updates
  schedule: [{cron: "0 * * * *"}]
  # Lines below let you run workflow manually and on each commit
  push: {branches: ["master", "main"]}
  workflow_dispatch:
jobs:
  github-metrics:
    runs-on: ubuntu-latest
    steps:
      # See action.yml for all options
      - uses: lowlighter/metrics@master
        with:
          # Your GitHub token
          token: ${{ secrets.METRICS_TOKEN }}
          # GITHUB_TOKEN is a special auto-generated token restricted to current repository, which is used to push files in it
          committer_token: ${{ secrets.GITHUB_TOKEN }}
          base: "" # Only show header
          plugin_isocalendar: yes
          plugin_activity: yes
          plugin_activity_limit: 5
          plugin_activity_days: 14 # Max age for events, set to 0 for unlimited:

The detailed stack:

Run lowlighter/metrics@master
Environment variable: loaded
Source: lowlighter
Version: 3.2.0-beta
Image tag: v3.2
Is released version: 0
Using released version v3.2, will pull docker image from GitHub registry
Image name: ghcr.io/lowlighter/metrics:v3.2
Unable to find image 'ghcr.io/lowlighter/metrics:v3.2' locally
docker: Error response from daemon: name unknown.
See 'docker run --help'.
Error: Process completed with exit code 125.

Different time-zones support

Feature description

As mentioned by @JayantGoel001, it would be nice to support different time-zones for metrics so they reflect the user's current time.

Additional context

Currently, the default timezone (UTC+0) is used, which makes dates incorrect except for England

Pagespeed Plugin: Wrong website domain shown in image, when using plugin_pagespeed_url

Bug description
If you use the plugin_pagespeed_url override the domain under the "pagespeed insights" text is still the users profile website.

Expected behavior
It should show the plugin_pagespeed_url domain.

To Reproduce
Generate image with plugin_pagespeed_url.

Additional context and screenshots
I want to use this as a badge for a repository, wich deploys a github pages website, not for my personal profile repository.
So i need the correct domain there, to not confuse anyone.

- uses: lowlighter/metrics@latest
        with:
          token: ${{ secrets.METRICS_TOKEN }}
          committer_token: ${{ secrets.GITHUB_TOKEN }}
          plugin_pagespeed_token: ${{ secrets.PAGESPEED_TOKEN }}

          # Options
          template: classic
          filename: pagespeed.svg
          base: ""
          config_timezone: Europe/Berlin
          plugin_pagespeed: yes
          plugin_pagespeed_detailed: yes
          plugin_pagespeed_url: https://example.com/

generates this:

image

It should show "example.com" and not "jonathan-treffler.de"

Private data is not included

Bug description
I used the repo permission in my token and passed it to the yml in the repo but the private data is not being included in the metrics. But it is showing in the metadata that this includes private data. And maybe it's not a bug and I might have done something wrong.

Expected behavior
The expected behavior was it should count my private repos and also my private commits.

To Reproduce
To reproduce just pass the token with repo permission in the secrets of the repo and then pass it in the yml file.

Additional context and screenshots
The rest of the things are working great and are awesome.

Really appreciate your work

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.