{"id":13988896,"url":"https://github.com/fgeller/rad","last_synced_at":"2025-06-12T10:11:50.853Z","repository":{"id":36481408,"uuid":"40786977","full_name":"fgeller/rad","owner":"fgeller","description":"Open source app to read API docs offline","archived":false,"fork":false,"pushed_at":"2016-04-15T21:19:07.000Z","size":6542,"stargazers_count":19,"open_issues_count":7,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-29T07:37:05.228Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fgeller.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}},"created_at":"2015-08-15T21:46:01.000Z","updated_at":"2022-01-12T15:09:42.000Z","dependencies_parsed_at":"2022-07-11T09:52:18.192Z","dependency_job_id":null,"html_url":"https://github.com/fgeller/rad","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/fgeller/rad","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fgeller%2Frad","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fgeller%2Frad/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fgeller%2Frad/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fgeller%2Frad/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fgeller","download_url":"https://codeload.github.com/fgeller/rad/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fgeller%2Frad/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259444983,"owners_count":22858553,"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","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":[],"created_at":"2024-08-09T13:01:25.587Z","updated_at":"2025-06-12T10:11:50.835Z","avatar_url":"https://github.com/fgeller.png","language":"HTML","funding_links":[],"categories":["HTML"],"sub_categories":[],"readme":"# rad - read api docs\n\nOpen source app to read API docs offline.\n\n## Quick start:\n\nDownload a release from the [release section](https://github.com/fgeller/rad/releases), unpack it and start it. Or as a one-liner (for linux replace `darwin` with `linux`):\n\n    curl http://geller.io/rad/sad-1.0.0-darwin-amd64.xz | tar Jx \u003e sad \u0026\u0026 ./sad\n\nThen move the binary to a location that's on your `PATH` and make it executable. For example, to add it to `~/bin`:\n\n    mv sad ~/bin/ \u0026\u0026 chmod +x ~/bin/sad\n\nJust make sure you download packs before you go offline :)\n\nAll releases including snapshots are available [here](http://geller.io/rad/).\n\nAlternatively, if you just want to give it a try there is a sample instance\nrunning [here](http://geller.io:3024). Keep in mind though that the latency to\nthat instance probably slows down the app's responsiveness. For example in my\ncase, I have a latency of about 500ms to the sample instance while most requests\nrender successfully in 40-100ms for an instance running on my tiny laptop.\n\nContents:\n\n* [Pictures!](https://github.com/fgeller/rad#pictures)\n* [Available packs](https://github.com/fgeller/rad#available-packs)\n* [Integrations](https://github.com/fgeller/rad#integrations)\n  * [Browser](https://github.com/fgeller/rad#browser)\n  * [Alfred](https://github.com/fgeller/rad#alfred)\n  * [HUBOT + Slack](https://github.com/fgeller/rad#hubot--slack)\n* [Why?](https://github.com/fgeller/rad#why)\n* [How?](https://github.com/fgeller/rad#how)\n* [More packs and contributions](https://github.com/fgeller/rad#more-packs-and-contributions)\n* [Others](https://github.com/fgeller/rad#others)\n\n## Pictures!\n\nStart screen:\n\n![Blank](https://raw.githubusercontent.com/fgeller/rad/master/screenshots/blank.png)\n\nSearching Go's stdlib:\n\n![Go](https://raw.githubusercontent.com/fgeller/rad/master/screenshots/go.png)\n\nSearching Scala's stdlib using regular expressions:\n\n![Scala](https://raw.githubusercontent.com/fgeller/rad/master/screenshots/scala.png)\n\nDisplaying installed and available packs:\n\n![Packs](https://raw.githubusercontent.com/fgeller/rad/master/screenshots/packs.png)\n\n## Available packs\n\n* [Clojure](https://clojuredocs.org)\n* [D3.js](https://d3js.org)\n* [Django](https://clojuredocs.org)\n* [Go](https://golang.org)\n  * [Standard packages](https://godoc.org/-/go)\n  * [github.com/gorilla/websocket](https://github.com/gorilla/websocket)\n  * [github.com/pborman/uuid](https://github.com/pborman/uuid)\n  * [golang.org/x/net/html](https://godoc.org/golang.org/x/net/html)\n* [Java](http://www.oracle.com/technetwork/java/javase/overview/index.html)\n* [jQuery](http://jquery.com)\n* [lodash](http://lodash.com)\n* [Man pages](http://man7.org/linux/man-pages/index.html)\n* [MDN Javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)\n* [node.js](http://nodejs.org)\n* [PHP](https://www.php.net)\n* [Python](https://www.python.org)\n* [react.js](https://facebook.github.io/react/)\n* [Scala](http://www.scala-lang.org)\n  * [Standard library (split into compiler, library and reflect)](http://www.scala-lang.org/api/current/)\n  * [akka](http://www.scala-lang.org)\n  * [Gremlin-Scala](https://github.com/mpollmeier/gremlin-scala)\n  * [Kafka](http://kafka.apache.org)\n  * [Shapeless](https://github.com/milessabin/shapeless)\n  * [Spray](http://spray.io)\n\n## Integrations\n\nWhile `sad` includes a UI, it might be faster or more convenient to query\nthrough one of the following integrations:\n\n### Browser\n\nYou can save some key strokes by assigning a custom search engine keyword to\n`rad`. For example in Chrome:\n\n![Chrome Search Engine](https://raw.githubusercontent.com/fgeller/rad/master/screenshots/chrome-search-engine.png)\n\nThis will allow you to search for documentation by using a custom keyword\ndirectly from the location bar. To speed things up even more, you can enable\nlive loading of documentation in `rad` settings:\n\n![Live updates](https://raw.githubusercontent.com/fgeller/rad/master/screenshots/live-updates.png)\n\nThis will allow you to jump directly to the first result after you've entered a\nquery in the location bar (`shift + →` and `shift + ←` will cycle through the\nsearch results if the query wasn't unique).\n\n### Alfred\n\nYou can query a running `rad` instance from [Alfred](https://www.alfredapp.com/)\nif you install the included [workflow](https://raw.githubusercontent.com/fgeller/rad/master/integrations/alfred/rad.alfredworkflow).\nThen you can start a query with the configured keyword (the default is simply `r`):\n\n![Alfred](https://raw.githubusercontent.com/fgeller/rad/master/screenshots/alfred.png)\n\nSelecting a result will open the documention in your default browser via `rad`.\n\n### HUBOT + Slack\n\n[rad.coffee](https://github.com/fgeller/rad/blob/master/integrations/rad.coffee)\nis a small [HUBOT](https://hubot.github.com) script that works with the Slack\nadapter:\n\n![HUBOT + Slack](https://raw.githubusercontent.com/fgeller/rad/master/screenshots/hubot-slack.png)\n\nYou start a query with the keyword `rad` and the results are links to a running\n`sad` instance.\n\n## Why?\n\nI enjoy open source software and hacking on my projects while on the go or in\ncafes. And this project gave me an excuse to learn more about\n[Go](https://golang.org) and [react.js](https://facebook.github.io/react/) :)\n\n![https://golang.org/doc/faq#Whats_the_origin_of_the_mascot](https://golang.org/doc/gopher/pencil/gopherswrench.jpg)\n\n## How?\n\nrad is split into multiple components:\n\n* `sad`: web app to serve API docs including a UI.\n* `pad`: app to package API docs.\n* `sap`: web app to serve documentation packs.\n\nAll three apps are written in Go and the `sad` front-end uses react.js and plain\nold HTML/Javascript. `sad` uses web-sockets and Go's channels for streaming\nresults immediately to the UI.\n\n### Pack format\n\nPacks are zip archives with the following structure:\n\n    pack-name\n     |\n     |-- pack.json\n     |-- data.json\n     `-- html-contents\n       |\n       |-- first.html\n       `-- second.html\n\nThey contain a top-level directory that has the same name as the pack. The pack\nname is used to identify the pack for searching, in the above example the name\nis `pack-name`. The top-level directory contains two data files that include\nmeta-data about the pack `pack.json` and the documentation entries `data.json`.\n\nA `pack.json` file has at least the following information: Name, Type, Version, Created, Description. Consider the following example:\n\n    {\n      \"Name\": \"pack-name\",\n      \"Type\": \"go\",\n      \"Version\": \"3.1.4\",\n      \"Created\": \"2015-10-25T15:42:01.936261923+13:00\",\n      \"Description\": \"This is an \u003ci\u003eHTML\u003c/i\u003e string containing source and copyright information.\"\n    }\n\nThe `data.json` file contains the entries that `sad` will index and search. An\nentry is grouped under a path and contains member entries that are defined by a\nname and a relative link to their location within the pack archive. Consider the\nfollowing example:\n\n    [\n      {\n        \"Path\": \"com.example.super\",\n        \"Members\": [\n          {\n            \"Name\": \"Driver\",\n            \"Target\": \"html-contents/first.html#Driver\"\n          }\n        ]\n      },\n      {\n        \"Path\": \"com.example.super\",\n        \"Members\": [\n          {\n            \"Name\": \"Runner\",\n            \"Target\": \"html-contents/second.html#Runner\"\n          }\n        ]\n      }\n    ]\n\n\n## More packs and contributions\n\n![Moar!](http://memeorama.com/wp-content/uploads/2012/01/MOAR.jpg)\n\nThe currently included packs are driven by my use and what friends are\ninterested in -- if you'd like to see another pack included please create an\n[issue](https://github.com/fgeller/rad/issues/new) or even send me a wrapped\npack :)\n\n## Others\n\n* [Dash](https://kapeli.com) - Very mature OSX app with lots of packs available.\n* [DevDocs](http://devdocs.io) - Web app that supports offline mode with lots of packs especially for front-end tech.\n\n\u003cbr /\u003e\u003cbr /\u003e\n\u003cp align=\"center\"\u003e\u003csup\u003eMade with ❤ in Piha.\u003c/sup\u003e\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffgeller%2Frad","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffgeller%2Frad","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffgeller%2Frad/lists"}