{"id":50713847,"url":"https://github.com/abh80/raycast-dev-docs","last_synced_at":"2026-06-09T17:04:18.637Z","repository":{"id":353913641,"uuid":"1216020617","full_name":"abh80/raycast-dev-docs","owner":"abh80","description":"Search language and framework documentation locally. Fast fuzzy search, inline rendered pages, open in browser with Ctrl+Enter.","archived":false,"fork":false,"pushed_at":"2026-04-26T07:03:31.000Z","size":1155,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T08:38:02.686Z","etag":null,"topics":["javascript","raycast","raycast-extension"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/abh80.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-20T13:39:26.000Z","updated_at":"2026-04-26T08:00:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/abh80/raycast-dev-docs","commit_stats":null,"previous_names":["abh80/raycast-dev-docs"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/abh80/raycast-dev-docs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abh80%2Fraycast-dev-docs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abh80%2Fraycast-dev-docs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abh80%2Fraycast-dev-docs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abh80%2Fraycast-dev-docs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abh80","download_url":"https://codeload.github.com/abh80/raycast-dev-docs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abh80%2Fraycast-dev-docs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34116464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"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":["javascript","raycast","raycast-extension"],"created_at":"2026-06-09T17:04:15.567Z","updated_at":"2026-06-09T17:04:18.630Z","avatar_url":"https://github.com/abh80.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dev Docs\n\nRaycast extension for fast, offline-friendly access to developer API documentation. Fuzzy-search **Java SE**, **Scala 3**, and **MDN JavaScript** straight from Raycast, read rendered pages inline, and jump to the live source when you need more.\n\n![version](https://img.shields.io/badge/version-1.0.0-blue)\n![raycast](https://img.shields.io/badge/raycast-extension-red)\n![license](https://img.shields.io/badge/license-MIT-green)\n\n---\n\n## Screenshots\n\nScreenshots live under `metadata/`. Raycast picks these up for the Store listing.\n\n| Search | Detail View | Members Browser |\n| --- | --- | --- |\n| ![search](metadata/dev-docs-1.png) | ![detail](metadata/dev-docs-2.png) | ![members](metadata/dev-docs-3.png) |\n\n---\n\n## Features\n\n- Fuzzy search across types, members, and packages for every supported language.\n- Dotted query support — type `Map.get` to jump straight to a method on a specific type. The owner type itself is also surfaced so you can drill in from there.\n- Per-language version dropdown (Java 11/17/21/24 today; Scala and MDN follow upstream).\n- Last-used version persisted via `LocalStorage` and restored on next launch.\n- Rendered Markdown Detail view with metadata sidebar (Module, Package, Since, Deprecated, Superclass, Interfaces — populated where the source provides them).\n- \"Browse Members\" mode drills into a class/trait/object and fuzzy-searches its methods, fields, given/extension members, and nested types without reloading.\n- Language-aware code fences in the rendered Markdown — Java signatures fenced as `java`, Scala as `scala`, MDN snippets tagged from the `brush:` class.\n- One-keystroke actions: open the live page, copy the URL, copy the fully-qualified name.\n- Disk-backed index and page cache under Raycast's `environment.supportPath`, with LRU eviction bounded by a configurable MB budget.\n- Provider abstraction (`DocProvider`) — adding a new language is a new module + a new command entry.\n\n---\n\n## Commands\n\n| Name | Description | Source |\n| --- | --- | --- |\n| Search Java Docs | Fuzzy-search the Java SE API for the selected version and preview pages inline. | docs.oracle.com |\n| Search Scala Docs | Fuzzy-search Scala 3 standard library types and members. | scala-lang.org/api/current |\n| Search MDN JS Docs | Fuzzy-search the MDN JavaScript reference (built-ins, globals, statements, operators). | developer.mozilla.org |\n\n---\n\n## Supported Kinds\n\nThe extension models a unified taxonomy across providers:\n\n| Kind | Java | Scala | MDN |\n| --- | --- | --- | --- |\n| `class` | ✓ | ✓ | — |\n| `interface` | ✓ | — | — |\n| `trait` | — | ✓ | — |\n| `object` | — | ✓ (singleton + companion) | — |\n| `enum` | ✓ | ✓ | — |\n| `annotation` | ✓ | — | — |\n| `record` | ✓ | — | — |\n| `type` | — | ✓ (type alias / opaque) | — |\n| `method` | ✓ | ✓ (`def`) | ✓ |\n| `field` | ✓ | ✓ (`val`/`var`) | ✓ |\n| `given` | — | ✓ | — |\n| `extension` | — | ✓ | — |\n| `constructor` | ✓ | — | — |\n| `package` | ✓ | ✓ | — |\n| `module` | ✓ | — | — |\n\nEach kind has a distinct icon in the search list and is grouped into Types / Members / Packages sections.\n\n---\n\n## Preferences\n\nConfigure these under Raycast Settings → Extensions → Dev Docs.\n\n| Preference | Type | Default | Description |\n| --- | --- | --- | --- |\n| Default Java Version | Dropdown | `24` | Version used when no previous selection has been stored. Options: `11`, `17`, `21`, `24`. |\n| Page Cache Limit (MB) | Number | `100` | Max disk space for cached rendered pages across **all** providers. LRU eviction. |\n\n---\n\n## Keyboard Shortcuts\n\n| Shortcut | Action | Context |\n| --- | --- | --- |\n| Enter | Show Docs (rendered Detail view) | Search list |\n| Ctrl + Enter | Open in Browser (live source page) | Search list / Detail |\n| Ctrl + M | Browse Members (methods / fields / given / nested types) | Search list (container entries) |\n| Cmd + Shift + . | Copy URL / Copy FQN | Action Panel |\n\n---\n\n## Search Tips\n\n- **Plain query** — matches against the simple name first, then the FQN. Containers get a small ranking boost.\n- **Dotted query** — `Owner.member` splits at the last dot. The `member` part is matched against names, and the `Owner` part is matched against the owning type/package. Type owners themselves are surfaced near the top so you can pivot to the class.\n  - Example (Scala): `map.get` → `scala.collection.{immutable,mutable,concurrent}.Map` traits and their `get` methods, plus `HashMap`, `ListMap`, `TreeMap`, `IntMap`, etc.\n  - Example (Java): `Map.get` → `java.util.Map.get(Object)` and `java.util.Map.getOrDefault(Object, V)` first, then `Keymap.getAction(...)` and friends.\n- **CamelHump / subsequence** — last-resort match for typo tolerance.\n\n---\n\n## How It Works\n\nThe extension is split into three layers per provider: index, parser, cache — sharing a single Raycast UI.\n\n1. **Index.** On first launch the provider fetches the upstream search index (`type-search-index.js` + friends for Java, `searchData.js` for Scala, MDN's index JSON), normalises it into a compact in-memory structure, and writes a serialised snapshot to disk. Subsequent launches load the snapshot directly.\n2. **Scorer.** A small fuzzy matcher ranks entries against the query — exact / prefix / substring / subsequence on the name, plus FQN scoring. Dotted queries split into owner + member with a separate scoring path.\n3. **HTML parser.** When the user opens a page, the raw HTML is fetched, stripped of nav/sidebar chrome, and converted to Markdown via Turndown. Signatures are extracted and re-fenced with the correct language tag. Anchor lookup tolerates Scaladoc/Javadoc IDs containing `:`, `[`, `]`, `(`, `)`.\n4. **Disk cache.** Indexes and rendered pages live under `environment.supportPath`. Pages are tracked in an LRU manifest; when total size exceeds the configured budget, the least-recently-accessed entries drop.\n5. **Provider abstraction.** Every doc source implements the `DocProvider` contract, so adding a new language is a new module + a command entry — no UI duplication.\n\n### Folder Layout\n\n```\nsrc/\n  search-java.tsx              # Entry: Search Java Docs command\n  search-scala.tsx             # Entry: Search Scala Docs command\n  search-mdn-js.tsx            # Entry: Search MDN JS Docs command\n  providers/\n    types.ts                   # DocProvider contract + ItemKind taxonomy\n    java/\n      provider.ts              # Java provider\n      index-loader.ts          # Oracle index fetch + compaction\n      search.ts                # Scoring + dotted-query handler\n      parser.ts                # HTML → Markdown for type / member / package pages\n      versions.ts              # URL builders, version list\n    scala/\n      provider.ts              # Scala 3 provider\n      index-loader.ts          # searchData.js fetch + compaction\n      search.ts                # Scoring + dotted-query handler\n      parser.ts                # Scaladoc → Markdown, signature extraction\n      versions.ts              # URL builders, version list\n    mdn/\n      provider.ts              # MDN JavaScript provider\n      index-loader.ts          # MDN index fetch\n      search.ts                # Scoring\n      parser.ts                # MDN article → Markdown, brush-detected fences\n      versions.ts              # URL builders\n  components/\n    DocSearchList.tsx          # Shared fuzzy-search list view\n    DocDetail.tsx              # Shared Markdown detail view with sidebar\n    MembersList.tsx            # Shared members browser\n  lib/\n    http.ts                    # Fetch helpers\n    storage.ts                 # LocalStorage + indexPath helpers\n    page-cache.ts              # LRU page cache with MB budget\n    titles.ts                  # Title shortening + match highlighting\npackage.json                   # Raycast manifest: commands, preferences\nmetadata/                      # Store screenshots\n```\n\n---\n\n## Adding a New Provider\n\nThe provider abstraction makes new doc sources cheap to add. Walkthrough lives at `docs/ADD_MDN_PROVIDER.md`. Short version:\n\n1. **Implement `DocProvider`** — `src/providers/\u003cname\u003e/provider.ts` exporting `id`, `label`, `listVersions`, `defaultVersion`, `prefetch`, `search`, `loadPage`, `externalUrl`, optional `childrenOf`.\n2. **Index + scorer** — `index-loader.ts` for the upstream search index, `search.ts` for ranking. Reuse the `scoreLabel` / `scoreFqn` / dotted-query shape from `java/search.ts` or `scala/search.ts`.\n3. **Parser** — `parser.ts` returning `DocPage { title, markdown, meta, externalUrl }`. Fence signatures with the correct language tag.\n4. **Command entry** — `src/search-\u003cname\u003e.tsx` mounting `\u003cDocSearchList provider={...} /\u003e`.\n5. **Manifest** — append to `commands` in `package.json` (name, title, description, icon, mode `view`, keywords).\n\nNo changes needed to the search list, scorer scaffolding, Detail view, or cache.\n\n---\n\n## Development\n\nPrerequisites: Node.js 18+, Raycast, Raycast developer account.\n\n```bash\ngit clone https://github.com/abh80/raycast-extension-java-doc.git\ncd raycast-extension-java-doc\nnpm install\n```\n\nRun in dev mode (hot-reloads on save, registers commands in your local Raycast):\n\n```bash\nnpm run dev\n```\n\nLint:\n\n```bash\nnpm run lint\n```\n\nProduction build (type-check + bundle):\n\n```bash\nnpm run build\n```\n\nThe local support path (where indexes and pages cache) prints to the console on first run. Delete that directory to force a full re-index.\n\n---\n\n## Publishing\n\n```bash\nnpm run publish\n```\n\nBump `version` in `package.json` and refresh `metadata/` screenshots before publishing.\n\n---\n\n## Credits and Disclaimer\n\n- **Java SE** documentation © Oracle Corporation.\n- **Scala 3** documentation © EPFL / Lightbend / Scala Center, licensed Apache 2.0.\n- **MDN Web Docs** content © Mozilla and contributors, licensed CC-BY-SA 2.5.\n\nThis extension does not redistribute upstream documentation. It fetches publicly available pages on demand and caches them locally for personal, interactive use only. All trademarks are the property of their respective owners. This project is not affiliated with, endorsed by, or sponsored by Oracle Corporation, EPFL, Lightbend, Mozilla, or Raycast Technologies Ltd.\n\nIf you are an IP holder and would like the extension adjusted, please open an issue.\n\n---\n\n## License\n\nMIT. See `LICENSE` for the full text.\n\nCopyright (c) 2026 abh80.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabh80%2Fraycast-dev-docs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabh80%2Fraycast-dev-docs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabh80%2Fraycast-dev-docs/lists"}