{"id":15020363,"url":"https://github.com/sthysel/rakali","last_synced_at":"2025-08-15T22:43:33.409Z","repository":{"id":46588033,"uuid":"170613568","full_name":"sthysel/rakali","owner":"sthysel","description":"Rakali is a imaging library and video camera tool-set","archived":false,"fork":false,"pushed_at":"2025-08-11T18:50:52.000Z","size":7109,"stargazers_count":9,"open_issues_count":2,"forks_count":4,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-08-11T20:37:50.584Z","etag":null,"topics":["opencv","python","python-library","stereo-calibration","stereo-camera","stereo-vision"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sthysel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-02-14T02:28:24.000Z","updated_at":"2024-12-15T00:54:35.000Z","dependencies_parsed_at":"2024-07-30T01:26:28.553Z","dependency_job_id":"f3f78b43-f12d-406b-9d2b-d900aa21d1e5","html_url":"https://github.com/sthysel/rakali","commit_stats":{"total_commits":155,"total_committers":3,"mean_commits":"51.666666666666664","dds":"0.10967741935483866","last_synced_commit":"d641b8f75e7bbbd4ab973060658f5b30d24e99ff"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/sthysel/rakali","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sthysel%2Frakali","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sthysel%2Frakali/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sthysel%2Frakali/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sthysel%2Frakali/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sthysel","download_url":"https://codeload.github.com/sthysel/rakali/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sthysel%2Frakali/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270155457,"owners_count":24536678,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["opencv","python","python-library","stereo-calibration","stereo-camera","stereo-vision"],"created_at":"2024-09-24T19:54:58.049Z","updated_at":"2025-08-15T22:43:33.355Z","avatar_url":"https://github.com/sthysel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rakali (Version 0.0.10)\n\nRakali is a imaging library and video camera tool-set. It provides a number of\ncamera primitives to help with calibrating mono and stereo camera rigs, image\nprocessing and object detection. It also includes a number of pre-built tools to\nhelp with that.\n\nRakali makes use of many other imaging libraries and frameworks and is also intended\nto be used as a pedagogical resource for those.\n\n![Rakali by Pia Ravenari](https://raw.githubusercontent.com/sthysel/rakali/master/docs/pics/rakali.jpg)\n\n[Pia Ravenari](https://www.deviantart.com/ravenari)\n\nNamed after Hydromys chrysogaster, the Australian Otter\n\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/sthysel/rakali/master.svg)](https://results.pre-commit.ci/latest/github/sthysel/rakali/master)\n\n# Provided tools\n\nRakali ships with a number of tools that assists working with mono and stereo\nvideo cameras.\n\n\n| Tool                            | Purpose                                                        |\n| ---                             | ---                                                            |\n| rakali-find-ipcameras           | Discover IP cameras on the local LAN                           |\n| rakali-view                     | View live video stream                                         |\n| rakali-view-stereo              | View live stereo video stream                                  |\n| rakali-find-chessboards         | Find calibration images in live video feed                     |\n| rakali-find-chessboards-stereo  | Find calibration images in live stereo video feed              |\n| rakali-calibrate-pinhole        | Calibrate a standard lens camera                               |\n| rakali-calibrate-fisheye        | Calibrate a fish-eyed lens camera                              |\n| rakali-calibrate-fisheye-stereo | Calibrate a fish-eyed stereo rig                               |\n| rakali-undistort-pinhole        | Correct standard lens camera live video feed                   |\n| rakali-undistort-fisheye        | Correct fish-eye camera live video feed                        |\n| rakali-undistort-fisheye-image  | Correct image provided by calibrated fish-eye camera           |\n| rakali-split-stereo-feed        | Split recorded stereo view feeds into left and right eye views |\n| rakali                          | Image processing library examplar                              |\n\n\n## rakali-find-ipcameras\n\nScan local LAN for IP cameras by vendor and service.\n\n`$ rakali-find-ipcameras cams`\n\n```\nUsage: rakali-find-ipcameras [OPTIONS] COMMAND [ARGS]...\n\n  Discover IP cameras on local LAN\n\nOptions:\n  --version  Show the version and exit.\n  --help     Show this message and exit.\n\nCommands:\n  cams     Discover local IP cameras using vendor name\n  service  Scanning for video feed services\n```\n\nTo scan for cameras, do: `$ rakali-find-ipcameras cams`, the default is to search for axis models.\n\nWhich provides a list of discovered NVR's or cameras like so:\n\n```\nScanning 10.41.212.0/24 for axis cameras or NVRs\n['10.41.212.135', '10.41.212.147']\n```\n\n\n## rakali-view\n\nView live video feed from IP and USB cameras. IP cameras and NVR's that\nbroadcast their services over mDNS can be discovered using\n`rakali-find-ipcameras`.\n\n`$ rakali-view --help`\n\n```\nUsage: rakali-view [OPTIONS]\n\nOptions:\n  --version          Show the version and exit.\n  -s, --source TEXT  Video source, can be local USB cam (0|1|2..) or IP cam rtsp URL or file  [default: http://axis-\n                     lab/axis-cgi/mjpg/video.cgi?\u0026camera=2]\n  --help             Show this message and exit.\n```\n\nA simple single stream video player.\n\n![View](docs/pics/rakali-view.jpg)\n\n## rakali-find-chessboards\n\n![View](docs/pics/chessboard.jpg)\n\nFind checkerboard images in video feed for calibration purposes.\n\n`rakali-find-chessboards` will look for a chessboard patterns in the frame flow\nand save each frame containing a chessboard for batch processing during camera\ncalibration.\n\n`$ rakali-find-chessboards --help`\n\n```zsh\n\nUsage: rakali-find-chessboards [OPTIONS]\n\n  Test each frame in the stream for the presence of a chess-board pattern. If found, save to the output folder\n\nOptions:\n  --version                     Show the version and exit.\n  -s, --source TEXT             Video source, can be local USB cam (0|1|2..) or IP cam rtsp URL or file  [default:\n                                http://axis-lab/axis-cgi/mjpg/video.cgi?\u0026camera=1]\n  -o, --output-folder TEXT      Output folder for images containing a chessboard  [default: ~/rakali/chessboards/]\n  --chessboard-rows INTEGER     Chessboard rows  [default: 9]\n  --chessboard-columns INTEGER  Chessboard columns  [default: 6]\n  --help                        Show this message and exit.\n\n```\n\nThe process will drop calibration frames in the target folder like these:\n\n```\n$ tree ~/rakali/chessboards\n/home/thys/rakali/chessboards\n├── 00000.jpg\n├── 00001.jpg\n├── 00002.jpg\n├── 00003.jpg\n```\n\n\n## rakali-find-chessboards-stereo\n\n\nFind checkerboard images in stereo video feed for calibration purposes. It\noperates in the same way as `rakali-find-chessboards` but produces pairs of\nframes.\n\n`rakali-find-chessboards-stereo --help`\n\n```\nUsage: rakali-find-chessboards-stereo [OPTIONS]\n\n  Find chessboard calibration images in both frames of the stereo pair\n\nOptions:\n  --version                     Show the version and exit.\n  -l, --left-eye TEXT           Left eye, can be local USB cam (0|1|2..) or IP cam rtsp URL or file  [default:\n                                http://axis-lab/axis-cgi/mjpg/video.cgi?\u0026camera=1]\n  -r, --right-eye TEXT          Right eye, can be local USB cam (0|1|2..) or IP cam rtsp URL or file  [default:\n                                http://axis-lab/axis-cgi/mjpg/video.cgi?\u0026camera=2]\n  -o, --output-folder TEXT      Fetch image from URL  [default: ~/rakali/stereo/chessboards/]\n  --chessboard-rows INTEGER     Chessboard rows  [default: 9]\n  --chessboard-columns INTEGER  Chessboard columns  [default: 6]\n  --help                        Show this message and exit.\n```\n\n![View](docs/pics/stereo-chessboard.jpg)\n\n\n``` zsh\n$ tree ~/rakali/stereo/chessboards\n/home/thys/rakali/stereo/chessboards\n├── left_00000.jpg\n├── left_00001.jpg\n├── left_00002.jpg\n├── right_00000.jpg\n├── right_00001.jpg\n├── right_00002.jpg\n\n```\n\n\n## rakali-calibrate-pinhole\n\nCalibrate a video camera with a pinhole lens\n\n`$ rakali-calibrate-pinhole --help `\n\n```\nUsage: rakali-calibrate-pinhole [OPTIONS]\n\n  Calibrate pinhole camera using chessboard frames captured earlier.\n\nOptions:\n  --version                     Show the version and exit.\n  -i, --input-folder TEXT       Folder where chessboard images are stored  [default: ~/rakali/chessboards/]\n  --image-points-file TEXT      Corner points data  [default: image_points.npz]\n  --calibration-file TEXT       Camera calibration data  [default: pinhole_calibration.npz]\n  --chessboard-rows INTEGER     Chessboard rows  [default: 9]\n  --chessboard-columns INTEGER  Chessboard columns  [default: 6]\n  --square-size FLOAT           Chessboard square size in m  [default: 0.023]\n  --salt INTEGER                Seed value for random picking of calibration images from a large set  [default: 888]\n  --pick-size INTEGER           Size of image set to use for calibration, picked from available set  [default: 50]\n  --help                        Show this message and exit.\n```\n\n\n## rakali-calibrate-fisheye\n\nCalibrate a video camera with a fish-eye lens using chessboard calibration\nimages captured using `rakali-find-chessboards`.\n\n`$ rakali-calibrate-fisheye --help`\n\n```\nUsage: rakali-calibrate-fisheye [OPTIONS]\n\n  Calibrate fish-eye camera using chessboard frames captured earlier.\n\nOptions:\n  --version                     Show the version and exit.\n  -i, --input-folder TEXT       Folder where chessboard images are stored  [default: ~/rakali/chessboards/]\n  --image-points-file TEXT      Corner points data  [default: image_points.npz]\n  --calibration-file TEXT       Camera calibration data  [default: fisheye_calibration.npz]\n  --chessboard-rows INTEGER     Chessboard rows  [default: 9]\n  --chessboard-columns INTEGER  Chessboard columns  [default: 6]\n  --square-size FLOAT           Chessboard square size in m  [default: 0.023]\n  --salt INTEGER                Seed value for random picking of calibration images from a large set  [default: 888]\n  --pick-size INTEGER           Size of image set to use for calibration, picked from available set  [default: 50]\n  --cid TEXT                    Calibration ID to associate a calibration file with a device  [default: fisheye]\n  --help                        Show this message and exit.\n\n```\n\n\nExecuting `$ rakali-calibrate-fisheye` results:\n\n```\n$ rakali-calibrate-fisheye\nLoading previously computed image points from image_points.npz\nCalibrating on 50 objects...\nINFO:rakali.camera.fisheye:Saving fisheye calibration data to fisheye_calibration.npz\nDIM=(1920, 1080)\nK=np.array([[558.6421513930135, 0.0, 977.0871045041308], [0.0, 559.5579191046008, 493.7827965652395], [0.0, 0.0, 1.0]])\nD=np.array([[-0.018316232894576033], [0.002931049514785237], [-0.0022823146847841804], [0.00014813140230995043]])\nCalibration error: 0.8771782112164381\n```\n\nThe resulting calibration file contains the K and D matrixes and some metadata\n\n```json\n{\n    \"D\": [\n        [\n            -0.018316232894576033\n        ],\n        [\n            0.002931049514785237\n        ],\n        [\n            -0.0022823146847841804\n        ],\n        [\n            0.00014813140230995043\n        ]\n    ],\n    \"K\": [\n        [\n            558.6421513930135,\n            0.0,\n            977.0871045041308\n        ],\n        [\n            0.0,\n            559.5579191046008,\n            493.7827965652395\n        ],\n        [\n            0.0,\n            0.0,\n            1.0\n        ]\n    ],\n    \"cid\": \"fisheye\",\n    \"error\": 0.8771782112164381,\n    \"image_size\": [\n        1920,\n        1080\n    ],\n    \"pick_size\": 50,\n    \"salt\": 888,\n    \"time\": 1553647761.7596939\n}\n```\n\n## rakali-calibrate-fisheye-stereo\n\n`rakali-calibrate-fisheye-stereo` uses a fixed set of previously captured chessboard images to calibrate a\nfisheye stereo camera rig. The calculated parameters are saved in a calibration file for use in image\nrectification.\n\n`$ rakali-calibrate-fisheye-stereo --help`\n\n``` zsh\nUsage: rakali-calibrate-fisheye-stereo [OPTIONS]\n\n  Calibrate fish-eye stereo camera rig using chessboard frames captured earlier.\n\nOptions:\n  --version                       Show the version and exit.\n  -i, --input-folder TEXT         Folder where chessboard images are stored  [default: ~/rakali/stereo/chessboards/]\n  --left-image-points-file TEXT   Left Corner points data  [default: left_image_points.json]\n  --right-image-points-file TEXT  Right Corner points data  [default: right_image_points.json]\n  --calibration-file TEXT         Stereo Camera calibration data  [default: fisheye_stereo_calibration.json]\n  --chessboard-rows INTEGER       Chessboard rows  [default: 9]\n  --chessboard-columns INTEGER    Chessboard columns  [default: 6]\n  --square-size FLOAT             Chessboard square size in m  [default: 0.023]\n  --salt INTEGER                  Seed value for random picking of calibration images from a large set  [default: 888]\n  --pick-size INTEGER             Size of image set to use for calibration, picked from available set  [default: 50]\n  --cid TEXT                      Calibration ID to associate a calibration file with a device  [default: fisheye]\n  --prefilter / --no-prefilter    Prefilter images  [default: True]\n  --help                          Show this message and exit.\n```\n\n```zsh\n....\nImage /home/thys/rakali/stereo/chessboards/left_00088.jpg OK\nImage /home/thys/rakali/stereo/chessboards/left_00058.jpg OK\nImage /home/thys/rakali/stereo/chessboards/right_00238.jpg OK\nImage /home/thys/rakali/stereo/chessboards/left_00122.jpg OK\nLoading previously computed image points from left_image_points.json\nCalibrating on 50 objects...\nLoading previously computed image points from right_image_points.json\nCalibrating on 50 objects...\nCalibrate Fisheye Stereo camera using pre-calibrated values\nDIM=(1920, 1080)\nleft calibration\nK=np.array([[552.7233750094179, 0.0, 948.2959591699556], [0.0, 554.6925141069631, 548.3575557665413], [0.0, 0.0, 1.0]])\nD=np.array([[-0.05136306776237411], [0.0959513318929465], [-0.09081590588179426], [0.028414418435600244]])\nCalibration error: 0.5128009096414867\nright calibration\nK=np.array([[552.7233750094177, 0.0, 948.2959591699567], [0.0, 554.6925141069636, 548.3575557665405], [0.0, 0.0, 1.0]])\nD=np.array([[-0.051363067762376646], [0.09595133189294996], [-0.09081590588179408], [0.028414418435599085]])\nCalibration error: 0.46991635076102695\n\n```\n\n\n## rakali-undistort-pinhole\n\nCorrect video feed from calibrated standard pinhole camera\n\n`$ rakali-undistort-pinhole --help`\n\n```\nUsage: rakali-undistort-pinhole [OPTIONS]\n\n  Undistort live feed from pinhole model type camera\n\nOptions:\n  --version                Show the version and exit.\n  -s, --source TEXT        Video source, can be local USB cam (0|1|2..) or IP cam rtsp URL or file  [default:\n                           http://axis-lab/axis-cgi/mjpg/video.cgi?\u0026camera=1]\n  --calibration-file TEXT  Camera calibration data  [default: pinhole_calibration.npz]\n  --help                   Show this message and exit.\n```\n\n## rakali-undistort-fisheye\n\nCorrect video feed from calibrated fisheye-lens camera\n\n`$ rakali-undistort-fisheye --help`\n\n```\nUsage: rakali-undistort-fisheye [OPTIONS]\n\n  Undistort live video feed from fish-eye lens camera\n\nOptions:\n  --version                Show the version and exit.\n  -s, --source TEXT        Video source, can be local USB cam (0|1|2..) or IP cam rtsp URL or file  [default:\n                           http://axis-lab/axis-cgi/mjpg/video.cgi?\u0026camera=1]\n  --calibration-file PATH  Camera calibration data  [default: fisheye_calibration.npz]\n  -b, --balance FLOAT      Balance value 0.0 ~30% pixel loss, 1.0 no loss  [default: 1.0]\n  --help                   Show this message and exit.\n\n```\n\n`$ rakali-undistort-fisheye`\n\n![View](docs/pics/fisheye-undistort-balance1.jpg)\n\n`$ rakali-undistort-fisheye -b 0.5`\n\n![View](docs/pics/fisheye-undistort-balance0.5.jpg)\n\n\n`$ rakali-undistort-fisheye -b 0`\n\n![View](docs/pics/fisheye-undistort-balance0.0.jpg)\n\n\n## rakali-undistort-fisheye-image\n\n`$ rakali-undistort-fisheye-image --help`\n\n``` zsh\nUsage: rakali-undistort-fisheye-image [OPTIONS] IMAGE_PATH\n\n  Rectify a image taken with a fish-eye lens camera using calibration parameters\n\nOptions:\n  --version                Show the version and exit.\n  --calibration-file PATH  Camera calibration data  [default: fisheye_calibration.json; required]\n  -b, --balance FLOAT      Balance value 0.0 ~30% pixel loss, 1.0 no loss  [default: 1.0]\n  -s, --scale FLOAT        Scale image  [default: 0.5]\n  --help                   Show this message and exit.\n```\n\n`$ rakali-undistort-fisheye-image ~/rakali/chessboards/00000.jpg`\n\n![View](docs/pics/fisheye-undistort-file.jpg)\n\n\n## rakali-view-stereo\n\nView live feed from stereo camera rig\n\n`$ rakali-view-stereo --help `\n\n```\nUsage: rakali-view-stereo [OPTIONS]\n\nOptions:\n  --version             Show the version and exit.\n  -l, --left-eye TEXT   Left eye, can be local USB cam (0|1|2..) or IP cam rtsp URL or file  [default: http://axis-\n                        lab/axis-cgi/mjpg/video.cgi?\u0026camera=1]\n  -r, --right-eye TEXT  Right eye, can be local USB cam (0|1|2..) or IP cam rtsp URL or file  [default: http://axis-\n                        lab/axis-cgi/mjpg/video.cgi?\u0026camera=2]\n  --help                Show this message and exit.\n\n```\n\n![Stereo View](docs/pics/stereo-view.jpg)\n\n## rakali-split-stereo-feed\n\nSplit source stereo recording into left and right camera views\n\n`$ rakali-split-stereo-feed --help`\n\n```\nUsage: rakali-split-stereo-feed [OPTIONS]\n\n  Split source stereo recording into left and right camera views\n\nOptions:\n  --version              Show the version and exit.\n  -s, --source TEXT      Stereo video source file to split  [default: in.avi]\n  -l, --left-name TEXT   Left camera video name  [default: left_eye_out.avi]\n  -r, --right-name TEXT  Right camera video name  [default: right_eye_out.avi]\n  --fps FLOAT            Frames per second rate for output file  [default: 12.5]\n  --help                 Show this message and exit.\n```\n\n\n## rakali\n\nRakali ships with a small demo app that exercises the library image processing\nfunctionality.\n\n```zsh\n$ rakali --help\nUsage: rakali [OPTIONS] COMMAND [ARGS]...\n\n  Rakali image tools\n\n  Provide either a input file or a input URL for image source\n\nOptions:\n  --version               Show the version and exit.\n  -i, --input-file PATH   Use file\n  -u, --input-url TEXT    Fetch image from URL\n  -o, --output-file PATH  Output file  [default: out.jpg]\n  --help                  Show this message and exit.\n\nCommands:\n  resize          Resize the input image preserving aspect ratio, favoring width\n  rotate          Rotate the input image\n  rotate-bounded  Rotate the input image, keeping bound in place\n  skeletonize     Skeletonize the input image\n\n```\n\n# Library usage\n\nLibrary documentation generation is a work in progress...\n\n## Load and show image from file\n\n```zsh\nfrom rakali import Image\nImage.from_file('rakali.jpg').show()\n```\n\n## Load, annotate, and show image\n\n```zsh\n#! /usr/bin/env python\n\nfrom rakali import Image\nimg: Image = Image.from_file('rakali.jpg')\nimg.add_text(labels=['Rakali', 'Hydromys chrysogaster'])\nimg.show()\nimg.write('rakali-text.jpg')\n\n```\n\n![Text](https://raw.githubusercontent.com/sthysel/rakali/master/docs/pics/rakali-text.jpg)\n\n## Canny\n\n```zsh\n\n#! /usr/bin/env python\n\"\"\"\nCannyfy Live USB video stream\n\"\"\"\n\nfrom rakali import VideoPlayer, VideoStream, VideoWriter\nfrom rakali.video.fps import cost\nfrom rakali.video import go\nfrom rakali.annotate import add_frame_labels, colors\nimport imutils\nimport logging\n\nlogging.basicConfig(level=logging.DEBUG)\n\n\n@cost\ndef canny(mat):\n    img = imutils.auto_canny(image=mat, sigma=0.3)\n    img = add_frame_labels(\n        frame=img,\n        labels=[f'canny cost: {canny.cost:6.3f}ms'],\n        color=colors.get('WHITE'),\n    )\n    return img\n\n\nstream = VideoStream(src=0)\nplayer = VideoPlayer()\nwriter = VideoWriter(size=stream.get_wh_size(), file_name='canny.avi')\n\nwith stream, player, writer:\n    while go():\n        frame = canny(stream.read())\n        writer.write(frame)\n        player.show(frame)\n```\n\n![canny](docs/pics/canny.jpg)\n\n\n\n# Install\n\nRakali is essentially a OpenCV shim. Because some parts of Rakali depends on OpenCV CUDA being available. The\n'python-opencv' lib on PyPi is not marked as a dependency. You need to install either that yourself, or use\nyour own pre-compiled OpenCV CUDA. Arch Linux has opencv-cuda in AUR, so install that:\n\n```\n$ yay -S opencv-cuda\n```\n\nWhile you are at it also install `tensorflow-opt-cuda`:\n\n```\n# pacman -S tensorflow-opt-cuda\n```\n\n\n## pypi\n\nRakali is in pypi:\n\n```\n$ pip install rakali\n```\n\n## Manual install\n\nClone or download this repo and in your virtualenv do:\n```\n$ pip install .\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsthysel%2Frakali","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsthysel%2Frakali","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsthysel%2Frakali/lists"}