{"id":18487088,"url":"https://github.com/cm45t3r/candlestick","last_synced_at":"2026-04-01T19:18:32.926Z","repository":{"id":41818597,"uuid":"71615619","full_name":"cm45t3r/candlestick","owner":"cm45t3r","description":"Candlestick patterns detection.","archived":false,"fork":false,"pushed_at":"2026-03-21T10:29:03.000Z","size":534,"stargazers_count":466,"open_issues_count":9,"forks_count":81,"subscribers_count":18,"default_branch":"main","last_synced_at":"2026-03-28T00:58:06.348Z","etag":null,"topics":["candlestick","candlestick-data","candlestick-pattern","candlestick-pattern-detection","candlestick-patterns","candlestick-patterns-detection","candlesticks","candlesticks-pattern","javascript","javascript-library","ohlc","technical-analysis","technical-analysis-indicators","technical-analysis-library","technical-analysis-methods","technical-indicators"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/cm45t3r.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"cm45t3r"}},"created_at":"2016-10-22T03:59:45.000Z","updated_at":"2026-03-27T06:59:13.000Z","dependencies_parsed_at":"2024-04-11T04:37:02.270Z","dependency_job_id":"8454d5de-e905-4cc1-a3bf-9de0bb4a7cdf","html_url":"https://github.com/cm45t3r/candlestick","commit_stats":{"total_commits":42,"total_committers":5,"mean_commits":8.4,"dds":"0.11904761904761907","last_synced_commit":"4fee63a817d86a784aeae7a6ae08f6675b0c4a2d"},"previous_names":["trendz/candlestick"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/cm45t3r/candlestick","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cm45t3r%2Fcandlestick","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cm45t3r%2Fcandlestick/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cm45t3r%2Fcandlestick/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cm45t3r%2Fcandlestick/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cm45t3r","download_url":"https://codeload.github.com/cm45t3r/candlestick/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cm45t3r%2Fcandlestick/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291117,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["candlestick","candlestick-data","candlestick-pattern","candlestick-pattern-detection","candlestick-patterns","candlestick-patterns-detection","candlesticks","candlesticks-pattern","javascript","javascript-library","ohlc","technical-analysis","technical-analysis-indicators","technical-analysis-library","technical-analysis-methods","technical-indicators"],"created_at":"2024-11-06T12:50:12.420Z","updated_at":"2026-04-01T19:18:32.880Z","avatar_url":"https://github.com/cm45t3r.png","language":"JavaScript","readme":"# Candlestick\n\n[![Node.js CI workflow](https://github.com/cm45t3r/candlestick/actions/workflows/node.js.yml/badge.svg)](https://github.com/cm45t3r/candlestick/actions/workflows/node.js.yml)\n[![npm](https://img.shields.io/npm/v/candlestick.svg)](https://www.npmjs.com/package/candlestick)\n[![npm downloads](https://img.shields.io/npm/dm/candlestick.svg)](https://www.npmjs.com/package/candlestick)\n[![Bundle Size](https://img.shields.io/bundlephobia/minzip/candlestick)](https://bundlephobia.com/package/candlestick)\n[![Coverage Status](https://coveralls.io/repos/github/cm45t3r/candlestick/badge.svg?branch=main)](https://coveralls.io/github/cm45t3r/candlestick?branch=main)\n[![Known Vulnerabilities](https://snyk.io/test/github/cm45t3r/candlestick/badge.svg)](https://snyk.io/test/github/cm45t3r/candlestick)\n[![ESLint](https://img.shields.io/badge/code%20style-eslint-brightgreen.svg)](https://eslint.org/)\n[![code style: prettier](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg?style=flat)](https://prettier.io/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/cm45t3r/candlestick/pulls)\n[![Contributors](https://img.shields.io/github/contributors/cm45t3r/candlestick.svg)](https://github.com/cm45t3r/candlestick/graphs/contributors)\n[![Last Commit](https://img.shields.io/github/last-commit/cm45t3r/candlestick)](https://github.com/cm45t3r/candlestick/commits/main)\n\nA modern, modular JavaScript library for candlestick pattern detection. Detects classic reversal and continuation patterns in OHLC data, with a clean API and no native dependencies.\n\n**✨ New in this version (v1.2.0):**\n\n- 🎯 19 candlestick patterns, 29 variants (was 16 patterns, +18.75%)\n- 📦 ESM \u0026 CommonJS support (dual export)\n- 🔷 Full TypeScript definitions\n- ✅ 306 tests with 99.75% coverage (97.63% branches, 100% functions)\n- 🚀 Streaming API for massive datasets (70% memory reduction)\n- 🔬 Property-based testing with fast-check\n- 🔌 Plugin system for custom patterns\n- ✅ Data validation system\n- 📊 Pattern metadata (confidence, type, strength)\n- 💻 CLI tool for CSV/JSON analysis\n\n---\n\n## Table of Contents\n\n- [Why Candlestick?](#why-candlestick)\n- [Features](#features)\n- [Quick Start](#quick-start)\n- [Usage](#usage)\n- [Pattern Detection Functions](#pattern-detection-functions)\n- [High-Level Pattern Chaining](#high-level-pattern-chaining)\n- [Pattern Descriptions](#pattern-descriptions)\n- [Examples](#examples)\n- [Full Example Files](#full-example-files)\n- [Linting \u0026 Formatting](#linting--formatting)\n- [Running Tests](#running-tests)\n- [Contributing](#contributing)\n- [Changelog](#changelog)\n- [Roadmap](#roadmap)\n- [Code of Conduct](#code-of-conduct)\n- [License](#license)\n\n---\n\n## Why Candlestick?\n\n- **No native dependencies**: 100% JavaScript, works everywhere Node.js runs.\n- **Modular**: Each pattern is its own module, easy to extend or customize.\n- **Consistent API**: All pattern functions use a standard interface.\n- **Pattern Chaining**: Scan for multiple patterns in a single pass.\n- **Comprehensive Test Suite**: Each pattern and utility is unit tested.\n- **Modern Tooling**: Uses ESLint (flat config) and Prettier for code quality and formatting.\n- **Actively Maintained**: See [ROADMAP.md](./ROADMAP.md) and [CHANGELOG.md](./CHANGELOG.md).\n\n---\n\n## Features\n\n- **19 Candlestick Patterns** (29 variants): Comprehensive pattern detection library\n- **Streaming API**: Process massive datasets with 70% memory reduction\n- **Property-Based Testing**: Validated with 1000+ generated test cases\n- **Dual Module Support**: CommonJS and ESM exports\n- **TypeScript**: Complete type definitions with IntelliSense\n- **Data Validation**: Robust OHLC validation system\n- **Plugin System**: Register custom patterns\n- **Pattern Chaining**: Multi-pattern detection in single pass\n- **Zero Dependencies**: Pure JavaScript, works everywhere\n- **Excellent Test Coverage**: 306 tests with 99.75% coverage (97.63% branches, 100% functions)\n- **High Performance**: 59K+ candles/sec throughput\n- **Well Documented**: Architecture guides, examples, and API docs\n\n---\n\n## Quick Start\n\n### Installation\n\n```bash\nnpm install candlestick\n```\n\n### CommonJS (Node.js)\n\n```js\nconst { isHammer, hammer, patternChain, allPatterns } = require(\"candlestick\");\n\n// Check single candle\nconst candle = { open: 10, high: 15, low: 8, close: 14 };\nconsole.log(isHammer(candle)); // true or false\n\n// Find patterns in series\nconst candles = [\n  /* array of OHLC objects */\n];\nconsole.log(hammer(candles)); // [indices where pattern found]\n\n// Detect all patterns at once\nconst results = patternChain(candles, allPatterns);\nconsole.log(results); // [{ index, pattern, match }]\n```\n\n### ESM (Modern JavaScript)\n\n```js\nimport { isHammer, hammer, patternChain, allPatterns } from \"candlestick\";\n\nconst candles = [\n  /* array of OHLC objects */\n];\nconst results = patternChain(candles, allPatterns);\nconsole.log(results);\n```\n\n### TypeScript\n\n```typescript\nimport { OHLC, PatternMatch, patternChain, allPatterns } from \"candlestick\";\n\nconst candles: OHLC[] = [\n  { open: 10, high: 15, low: 8, close: 12 },\n  { open: 12, high: 16, low: 11, close: 14 },\n];\n\nconst results: PatternMatch[] = patternChain(candles, allPatterns);\n// Full IntelliSense support ✓\n```\n\n---\n\n## Usage\n\n### Importing\n\n**CommonJS (Node.js):**\n\n```js\n// Import all patterns\nconst candlestick = require(\"candlestick\");\n\n// Or import only what you need\nconst { isHammer, hammer, patternChain } = require(\"candlestick\");\n```\n\n**ESM (Modern JavaScript):**\n\n```js\n// Import all patterns\nimport candlestick from \"candlestick\";\n\n// Or import only what you need (recommended for tree-shaking)\nimport { isHammer, hammer, patternChain } from \"candlestick\";\n```\n\n### OHLC Format\n\nAll functions expect objects with at least:\n\n```js\n{\n  open: Number,\n  high: Number,\n  low: Number,\n  close: Number\n}\n```\n\n---\n\n## Pattern Detection Functions\n\n### Boolean (Single/Pair) Detection\n\n- `isHammer(candle)`\n- `isBullishHammer(candle)` / `isBearishHammer(candle)`\n- `isInvertedHammer(candle)`\n- `isBullishInvertedHammer(candle)` / `isBearishInvertedHammer(candle)`\n- `isDoji(candle)`\n- `isBullishEngulfing(prev, curr)` / `isBearishEngulfing(prev, curr)`\n- `isBullishHarami(prev, curr)` / `isBearishHarami(prev, curr)`\n- `isBullishKicker(prev, curr)` / `isBearishKicker(prev, curr)`\n- `isHangingMan(prev, curr)`\n- `isShootingStar(prev, curr)`\n\n### Array (Series) Detection\n\n- `hammer(dataArray)` / `bullishHammer(dataArray)` / `bearishHammer(dataArray)`\n- `invertedHammer(dataArray)` / `bullishInvertedHammer(dataArray)` / `bearishInvertedHammer(dataArray)`\n- `doji(dataArray)`\n- `bullishEngulfing(dataArray)` / `bearishEngulfing(dataArray)`\n- `bullishHarami(dataArray)` / `bearishHarami(dataArray)`\n- `bullishKicker(dataArray)` / `bearishKicker(dataArray)`\n- `hangingMan(dataArray)` / `shootingStar(dataArray)`\n\nAll array functions return an array of indices where the pattern occurs.\n\n---\n\n## High-Level Pattern Chaining\n\nScan a series for multiple patterns in one pass:\n\n```js\nconst { patternChain, allPatterns } = require(\"candlestick\");\n\nconst matches = patternChain(dataArray, allPatterns);\n// matches: [\n//   { index: 3, pattern: 'hammer', match: [candleObj] },\n//   { index: 7, pattern: 'bullishEngulfing', match: [candleObj, candleObj] },\n//   ...\n// ]\n```\n\nYou can also pass a custom list of patterns:\n\n```js\nconst matches = patternChain(dataArray, [\n  { name: \"doji\", fn: candlestick.doji },\n  { name: \"bullishEngulfing\", fn: candlestick.bullishEngulfing, paramCount: 2 },\n]);\n```\n\n\u003e **Multi-candle patterns:** Patterns like Engulfing, Harami, Kicker, Hanging Man, and Shooting Star span two candles. The `match` array in the result will contain both candles (length 2), thanks to the `paramCount` property. Single-candle patterns return a single-element array.\n\n---\n\n## Pattern Descriptions\n\n### Single Candle Patterns\n\n- **Hammer**: Small body near the top (body \u003c 1/3 of range), long lower shadow (tail ≥ 2× body), small upper shadow. Signals possible bullish reversal.\n- **Inverted Hammer**: Small body near the bottom, long upper shadow (wick ≥ 2× body), small lower shadow. Bullish reversal signal.\n- **Doji**: Very small body (body \u003c 10% of range), open ≈ close. Indicates indecision. Candle must have range (high \u003e low).\n- **Marubozu**: Long body (≥ 70% of range) with minimal shadows (\u003c 10% of body). Strong directional move. Bullish Marubozu shows strong buying, Bearish shows strong selling.\n- **Spinning Top**: Small body (\u003c 30% of range) with long upper and lower shadows (each \u003e 20% of range). Indicates market indecision or potential reversal.\n\n### Two Candle Patterns\n\n- **Engulfing**: Second candle's body fully engulfs the previous (body range covers previous body). Bullish or bearish.\n- **Harami**: Second candle's body is inside the previous (body range within previous body). Bullish or bearish.\n- **Kicker**: Strong reversal with a gap and opposite color. Bullish or bearish.\n- **Hanging Man**: Bullish candle followed by a bearish hammer with a gap up. Bearish reversal.\n- **Shooting Star**: Bullish candle followed by a bearish inverted hammer with a gap up. Bearish reversal.\n- **Piercing Line**: Bullish reversal. Bearish candle followed by bullish candle that opens below first's low and closes above its midpoint.\n- **Dark Cloud Cover**: Bearish reversal. Bullish candle followed by bearish candle that opens above first's high and closes below its midpoint.\n- **Tweezers Top**: Bearish reversal. Bullish candle followed by bearish candle with matching highs (within 1% tolerance). Indicates resistance level.\n- **Tweezers Bottom**: Bullish reversal. Bearish candle followed by bullish candle with matching lows (within 1% tolerance). Indicates support level.\n\n### Three Candle Patterns\n\n- **Morning Star**: Bullish reversal. Long bearish candle, small-bodied star that gaps down, long bullish candle closing well into first candle's body.\n- **Evening Star**: Bearish reversal. Long bullish candle, small-bodied star that gaps up, long bearish candle closing well into first candle's body.\n- **Three White Soldiers**: Three consecutive bullish candles, each opening within previous body and closing higher. Limited upper shadows. Signals strong bullish continuation/reversal.\n- **Three Black Crows**: Three consecutive bearish candles, each opening within previous body and closing lower. Limited lower shadows. Signals strong bearish continuation/reversal.\n\n\u003e **Note:** The library does not mutate your input data. All pattern functions return new objects with precomputed properties (e.g., `bodyLen`, `wickLen`, etc.) as needed. If you plan to run many pattern detectors on the same data, you can precompute properties once using `precomputeCandleProps` from the utilities for better performance.\n\n---\n\n## Examples\n\n### Boolean Detection\n\n```js\nconst { isBullishKicker, isBearishKicker } = require(\"candlestick\");\n\nconst prev = { open: 40.18, high: 41.03, low: 40.09, close: 40.86 };\nconst curr = { open: 39.61, high: 39.35, low: 38.71, close: 38.92 };\n\nconsole.log(isBullishKicker(prev, curr)); // false\nconsole.log(isBearishKicker(prev, curr)); // true\n```\n\n### Finding Patterns in Series\n\n```js\nconst { shootingStar } = require(\"candlestick\");\n\nconst data = [\n  { open: 29.01, high: 29.03, low: 28.56, close: 28.64 },\n  // ...\n];\n\nconsole.log(shootingStar(data)); // [index, ...]\n```\n\n### Pattern Chaining\n\n```js\nconst { patternChain, allPatterns } = require(\"candlestick\");\nconst matches = patternChain(data, allPatterns);\nconsole.log(matches);\n// [ { index: 3, pattern: 'hammer', match: [Object] }, ... ]\n```\n\n### Streaming API (v1.2.0+)\n\nFor processing very large datasets efficiently with reduced memory usage:\n\n```js\nconst { streaming } = require(\"candlestick\");\n\n// Option 1: Using createStream with callbacks\nconst stream = streaming.createStream({\n  patterns: [\"hammer\", \"doji\", \"marubozu\"],\n  chunkSize: 1000,\n  onMatch: (match) =\u003e console.log(match),\n  enrichMetadata: true,\n});\n\n// Process data in chunks\nfor (const chunk of dataChunks) {\n  stream.process(chunk);\n}\nstream.end();\n\n// Option 2: Simple helper for large datasets\nconst results = streaming.processLargeDataset(largeData, {\n  patterns: null, // all patterns\n  chunkSize: 1000,\n  enrichMetadata: true,\n});\n```\n\n**Benefits:** Reduces memory usage by ~70% for datasets \u003e 100K candles\n\n### Data Validation (New!)\n\n```js\nconst { validateOHLC, validateOHLCArray } = require(\"candlestick\").utils;\n\n// Validate single candle\ntry {\n  validateOHLC({ open: 10, high: 15, low: 8, close: 12 });\n  console.log(\"Valid candle ✓\");\n} catch (error) {\n  console.error(\"Invalid:\", error.message);\n}\n\n// Validate array of candles\nvalidateOHLCArray(candles); // throws on invalid data\n```\n\n### Plugin System (New!)\n\n```js\nconst { plugins, patternChain } = require('candlestick');\n\n// Register custom pattern\nplugins.registerPattern({\n  name: 'myCustomPattern',\n  fn: (dataArray) =\u003e {\n    // Your detection logic\n    return dataArray\n      .map((c, i) =\u003e /* condition */ ? i : -1)\n      .filter(idx =\u003e idx !== -1);\n  },\n  paramCount: 1,\n  metadata: { type: 'reversal', confidence: 0.85 }\n});\n\n// Use with patternChain\nconst customPattern = plugins.getPattern('myCustomPattern');\nconst results = patternChain(data, [customPattern]);\n```\n\nFor more details on the plugin system, see [docs/PLUGIN_API.md](./docs/PLUGIN_API.md).\n\n### CLI Tool (New!)\n\nDetect patterns from command line:\n\n```bash\n# Install globally\nnpm install -g candlestick\n\n# Detect patterns in JSON file\ncandlestick -i data.json --output table --metadata\n\n# Filter by confidence\ncandlestick -i data.csv --confidence 0.85 --output csv\n\n# Bullish reversals only\ncandlestick -i data.json --type reversal --direction bullish\n\n# Use with pipes\ncat data.json | candlestick --output table\n```\n\nFor complete CLI documentation, see [docs/CLI_GUIDE.md](./docs/CLI_GUIDE.md).\n\n---\n\n## Full Example Files\n\nSee the [`examples/`](./examples/) directory for runnable, copy-pasteable usage of every pattern and utility:\n\n**Single Candle Patterns:**\n\n- [`examples/hammer.js`](./examples/hammer.js) — Hammer pattern detection\n- [`examples/invertedHammer.js`](./examples/invertedHammer.js) — Inverted Hammer pattern detection\n- [`examples/doji.js`](./examples/doji.js) — Doji pattern detection\n\n**Two Candle Patterns:**\n\n- [`examples/engulfing.js`](./examples/engulfing.js) — Engulfing pattern detection\n- [`examples/harami.js`](./examples/harami.js) — Harami pattern detection\n- [`examples/kicker.js`](./examples/kicker.js) — Kicker pattern detection\n- [`examples/reversal.js`](./examples/reversal.js) — Hanging Man and Shooting Star\n\n**Multi-Pattern Detection:**\n\n- [`examples/patternChain.js`](./examples/patternChain.js) — Multi-pattern detection with patternChain\n- [`examples/newPatterns.js`](./examples/newPatterns.js) — 3-candle patterns (Morning/Evening Star, Three Soldiers/Crows)\n- [`examples/newPatternsV2.js`](./examples/newPatternsV2.js) — v1.2.0 patterns (Marubozu, Spinning Top, Tweezers)\n- [`examples/streaming.js`](./examples/streaming.js) — Streaming API for large datasets\n- [`examples/esm-example.mjs`](./examples/esm-example.mjs) — ESM module syntax example\n- [`examples/metadata.js`](./examples/metadata.js) — Pattern metadata, filtering, and sorting\n\n**Utilities:**\n\n- [`examples/utils.js`](./examples/utils.js) — Utility functions: bodyLen, wickLen, tailLen, isBullish, isBearish, hasGapUp, hasGapDown, findPattern\n\nSee [`examples/README.md`](./examples/README.md) for more details and instructions.\n\n---\n\n## Linting \u0026 Formatting\n\n- **ESLint**: Modern flat config (`eslint.config.js`)\n- **Prettier**: For code formatting\n- Run `npm run lint` and `npm run format` (if configured)\n\n---\n\n## Running Tests\n\n```bash\nnpm test\n```\n\n---\n\n## Contributing\n\n- Please open [issues](https://github.com/cm45t3r/candlestick/issues) or [pull requests](https://github.com/cm45t3r/candlestick/pulls) for bugs, features, or questions.\n- Add tests for new patterns or utilities.\n- Follow the code style enforced by ESLint and Prettier.\n- See [CONTRIBUTING.md](./CONTRIBUTING.md) for full guidelines.\n\n---\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md) for release history and major changes.\n\n**Latest (v1.2.0):**\n\n- 3 new candlestick patterns (Marubozu, Spinning Top, Tweezers)\n- Streaming API for large datasets (70% memory reduction)\n- Property-based testing with fast-check\n- 306 tests with 99.75% coverage\n- Quality badges (Bundle Size, Snyk, Last Commit)\n\n**Previous (v1.1.0):**\n\n- 6 new candlestick patterns (3-candle patterns, Piercing Line, Dark Cloud Cover)\n- ESM support (dual CommonJS/ESM)\n- TypeScript definitions\n- Plugin system, Data validation, Pattern metadata system, CLI tool\n\n---\n\n## FAQ\n\n**Q: Why is my pattern not detected?**\n\n- Ensure your candle objects have all required fields (`open`, `high`, `low`, `close`).\n- Check that the pattern’s technical thresholds are met (see Pattern Descriptions above).\n- The library does not check for trend context (e.g., uptrend/downtrend) — it only looks at candle shapes.\n\n**Q: Does this library mutate my data?**\n\n- No. All computations are done on copies; your input data is never changed.\n\n**Q: Can I use this with TypeScript?**\n\n- Yes! The library now includes complete TypeScript definitions in `types/index.d.ts`. Full type safety and IntelliSense support available.\n\n**Q: Are there visual examples of patterns?**\n\n- Not yet, but this is planned (see ROADMAP.md). For now, see the pattern descriptions and links to external resources.\n\n---\n\n## Roadmap\n\nSee [ROADMAP.md](./ROADMAP.md) for planned features and future directions.\n\n---\n\n## Code of Conduct\n\nSee [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md) for community standards and enforcement.\n\n---\n\n## License\n\nMIT. See [LICENSE](./LICENSE).\n","funding_links":["https://github.com/sponsors/cm45t3r"],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcm45t3r%2Fcandlestick","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcm45t3r%2Fcandlestick","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcm45t3r%2Fcandlestick/lists"}