Repository files navigation

pinets-cli

Run Pine Script® indicators from the command line

npm versionLicensePowered by PineTS

Quick StartUsageOptionsExamplesAI AgentsFull Docs


What is pinets-cli?

pinets-cli is a command-line interface for PineTS, the open-source Pine Script® transpiler and runtime. It lets you execute TradingView® Pine Script® indicators directly from your terminal, with live market data or custom JSON datasets.

pinets run rsi.pine --symbol BTCUSDT --timeframe 60

No code to write. No project to set up. Just point it at a .pine file and go.

Disclaimer: pinets-cli and PineTS are independently developed open-source projects. LuxAlgo Global, LLC and the PineTS project are NOT affiliated with, sponsored by, endorsed by, or in any way officially associated with TradingView, Inc. "Pine Script®" and "TradingView®" are registered trademarks of TradingView, Inc.


Quick Start

Install

npm install -g pinets-cli

Or run directly without installing:

npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60

Run your first indicator

Create a file called sma_cross.pine:

//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)

Run it:

pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60

That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.


Usage

pinets run [options] [file]

The run command executes a Pine Script® indicator and outputs the results as JSON.

Indicator source

Provide the indicator as a file argument or via piped stdin:

# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDT

Data source

Choose between live market data or a local JSON file:

# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json

Options

Data Source

OptionShortDescriptionDefault
--symbol <ticker>-sSymbol to query (e.g., BTCUSDT, ETHUSDT.P)
--timeframe <tf>-tTimeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M60
--data <path>-dPath to a JSON data file (alternative to --symbol)

Output

OptionShortDescriptionDefault
--output <path>-oWrite output to a file instead of stdoutstdout
--format <type>-fOutput format: default or fulldefault
--prettyForce pretty-printed JSONauto
--cleanFilter out null, false, and empty values from plots
--plots <names>Comma-separated list of plot names to includeall plots

Candle Control

OptionShortDescriptionDefault
--candles <count>-nNumber of candles in the output500
--warmup <count>-wExtra candles for indicator warmup (not included in output)0

Other

OptionShortDescription
--debugShow the transpiled code (for debugging)
--quiet-qSuppress all informational messages
--version-vShow version number
--help-hShow help

Examples

Basic indicator with live data

pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100

Indicator warmup

Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:

# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200

Save output to a file

pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json

Pipe into other tools

# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'

Use custom JSON data

pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --pretty

Pipe indicator from stdin

cat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60

Full execution context

pinets run rsi.pine --symbol BTCUSDT --format full --pretty

Debug transpilation

pinets run my_indicator.pine --symbol BTCUSDT --debug

Filter signals with --clean

For indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:

# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean

Select specific plots

When you only need specific plots from an indicator:

# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'

Use with AI agents

pinets-cli is designed to be driven programmatically. Indicators go in on stdin, structured JSON comes out on stdout, and there is no interactive prompt or project scaffolding to negotiate — which makes it usable as a tool call from an agent, a script, or a CI job without a wrapper.

A SKILL.md is included in the repository root for agent frameworks that consume skill definitions.

Three flags matter when an agent is the caller:

FlagWhy it matters for automated callers
--quiet / -qSuppresses informational output so stdout is valid JSON and nothing else
--cleanDrops null, false, and empty plot values, cutting response size sharply
--plots <names>Returns only the plots you asked for instead of everything the script emits
# Generate an indicator, execute it, and return only the signal values
cat generated_strategy.pine | pinets run -s BTCUSDT -t 60 --plots "Buy,Sell" --clean -q

Because the runtime is self-contained and reads from stdin, the whole loop — write a script, execute it against real data, read the result — can run locally without a charting platform in the path.


Output Formats

default format

Contains the indicator metadata and all plot data:

{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}

full format

Everything in default, plus the raw execution result and market data:

{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}

JSON Data Format

When using --data, provide a JSON file with an array of candle objects:

[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]

Required fields: open, high, low, close, volume

Recommended fields: openTime, closeTime (millisecond timestamps)


How It Works

pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:

  1. The Pine Script® file is read and passed to the PineTS transpiler
  2. Market data is fetched from Binance (or loaded from your JSON file)
  3. The indicator is executed bar-by-bar with full time-series semantics
  4. Plot data is collected and output as structured JSON

There are no runtime dependencies. The single bundled file includes everything needed.


Supported Timeframes

ValueDescription
11 minute
33 minutes
55 minutes
1515 minutes
3030 minutes
601 hour
1202 hours
2404 hours
1D or D1 day
1W or W1 week
1M or M1 month

Related Projects

  • PineTS : The underlying transpiler and runtime engine

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.


License

AGPL-3.0-or-later - See LICENSE for details.


Built with PineTS by LuxAlgo

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

pinets-cli

Run Pine Script® indicators from the command line

npm versionLicensePowered by PineTS

Quick StartUsageOptionsExamplesAI AgentsFull Docs


What is pinets-cli?

pinets-cli is a command-line interface for PineTS, the open-source Pine Script® transpiler and runtime. It lets you execute TradingView® Pine Script® indicators directly from your terminal, with live market data or custom JSON datasets.

pinets run rsi.pine --symbol BTCUSDT --timeframe 60

No code to write. No project to set up. Just point it at a .pine file and go.

Disclaimer: pinets-cli and PineTS are independently developed open-source projects. LuxAlgo Global, LLC and the PineTS project are NOT affiliated with, sponsored by, endorsed by, or in any way officially associated with TradingView, Inc. "Pine Script®" and "TradingView®" are registered trademarks of TradingView, Inc.


Quick Start

Install

npm install -g pinets-cli

Or run directly without installing:

npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60

Run your first indicator

Create a file called sma_cross.pine:

//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)

Run it:

pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60

That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.


Usage

pinets run [options] [file]

The run command executes a Pine Script® indicator and outputs the results as JSON.

Indicator source

Provide the indicator as a file argument or via piped stdin:

# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDT

Data source

Choose between live market data or a local JSON file:

# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json

Options

Data Source

OptionShortDescriptionDefault
--symbol <ticker>-sSymbol to query (e.g., BTCUSDT, ETHUSDT.P)
--timeframe <tf>-tTimeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M60
--data <path>-dPath to a JSON data file (alternative to --symbol)

Output

OptionShortDescriptionDefault
--output <path>-oWrite output to a file instead of stdoutstdout
--format <type>-fOutput format: default or fulldefault
--prettyForce pretty-printed JSONauto
--cleanFilter out null, false, and empty values from plots
--plots <names>Comma-separated list of plot names to includeall plots

Candle Control

OptionShortDescriptionDefault
--candles <count>-nNumber of candles in the output500
--warmup <count>-wExtra candles for indicator warmup (not included in output)0

Other

OptionShortDescription
--debugShow the transpiled code (for debugging)
--quiet-qSuppress all informational messages
--version-vShow version number
--help-hShow help

Examples

Basic indicator with live data

pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100

Indicator warmup

Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:

# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200

Save output to a file

pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json

Pipe into other tools

# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'

Use custom JSON data

pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --pretty

Pipe indicator from stdin

cat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60

Full execution context

pinets run rsi.pine --symbol BTCUSDT --format full --pretty

Debug transpilation

pinets run my_indicator.pine --symbol BTCUSDT --debug

Filter signals with --clean

For indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:

# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean

Select specific plots

When you only need specific plots from an indicator:

# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'

Use with AI agents

pinets-cli is designed to be driven programmatically. Indicators go in on stdin, structured JSON comes out on stdout, and there is no interactive prompt or project scaffolding to negotiate — which makes it usable as a tool call from an agent, a script, or a CI job without a wrapper.

A SKILL.md is included in the repository root for agent frameworks that consume skill definitions.

Three flags matter when an agent is the caller:

FlagWhy it matters for automated callers
--quiet / -qSuppresses informational output so stdout is valid JSON and nothing else
--cleanDrops null, false, and empty plot values, cutting response size sharply
--plots <names>Returns only the plots you asked for instead of everything the script emits
# Generate an indicator, execute it, and return only the signal values
cat generated_strategy.pine | pinets run -s BTCUSDT -t 60 --plots "Buy,Sell" --clean -q

Because the runtime is self-contained and reads from stdin, the whole loop — write a script, execute it against real data, read the result — can run locally without a charting platform in the path.


Output Formats

default format

Contains the indicator metadata and all plot data:

{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}

full format

Everything in default, plus the raw execution result and market data:

{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}

JSON Data Format

When using --data, provide a JSON file with an array of candle objects:

[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]

Required fields: open, high, low, close, volume

Recommended fields: openTime, closeTime (millisecond timestamps)


How It Works

pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:

  1. The Pine Script® file is read and passed to the PineTS transpiler
  2. Market data is fetched from Binance (or loaded from your JSON file)
  3. The indicator is executed bar-by-bar with full time-series semantics
  4. Plot data is collected and output as structured JSON

There are no runtime dependencies. The single bundled file includes everything needed.


Supported Timeframes

ValueDescription
11 minute
33 minutes
55 minutes
1515 minutes
3030 minutes
601 hour
1202 hours
2404 hours
1D or D1 day
1W or W1 week
1M or M1 month

Related Projects

  • PineTS : The underlying transpiler and runtime engine

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.


License

AGPL-3.0-or-later - See LICENSE for details.


Built with PineTS by LuxAlgo

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pinets-cli

Run Pine Script® indicators from the command line

npm versionLicensePowered by PineTS

Quick StartUsageOptionsExamplesAI AgentsFull Docs


What is pinets-cli?

pinets-cli is a command-line interface for PineTS, the open-source Pine Script® transpiler and runtime. It lets you execute TradingView® Pine Script® indicators directly from your terminal, with live market data or custom JSON datasets.

pinets run rsi.pine --symbol BTCUSDT --timeframe 60

No code to write. No project to set up. Just point it at a .pine file and go.

Disclaimer: pinets-cli and PineTS are independently developed open-source projects. LuxAlgo Global, LLC and the PineTS project are NOT affiliated with, sponsored by, endorsed by, or in any way officially associated with TradingView, Inc. "Pine Script®" and "TradingView®" are registered trademarks of TradingView, Inc.


Quick Start

Install

npm install -g pinets-cli

Or run directly without installing:

npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60

Run your first indicator

Create a file called sma_cross.pine:

//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)

Run it:

pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60

That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.


Usage

pinets run [options] [file]

The run command executes a Pine Script® indicator and outputs the results as JSON.

Indicator source

Provide the indicator as a file argument or via piped stdin:

# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDT

Data source

Choose between live market data or a local JSON file:

# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json

Options

Data Source

OptionShortDescriptionDefault
--symbol <ticker>-sSymbol to query (e.g., BTCUSDT, ETHUSDT.P)
--timeframe <tf>-tTimeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M60
--data <path>-dPath to a JSON data file (alternative to --symbol)

Output

OptionShortDescriptionDefault
--output <path>-oWrite output to a file instead of stdoutstdout
--format <type>-fOutput format: default or fulldefault
--prettyForce pretty-printed JSONauto
--cleanFilter out null, false, and empty values from plots
--plots <names>Comma-separated list of plot names to includeall plots

Candle Control

OptionShortDescriptionDefault
--candles <count>-nNumber of candles in the output500
--warmup <count>-wExtra candles for indicator warmup (not included in output)0

Other

OptionShortDescription
--debugShow the transpiled code (for debugging)
--quiet-qSuppress all informational messages
--version-vShow version number
--help-hShow help

Examples

Basic indicator with live data

pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100

Indicator warmup

Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:

# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200

Save output to a file

pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json

Pipe into other tools

# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'

Use custom JSON data

pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --pretty

Pipe indicator from stdin

cat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60

Full execution context

pinets run rsi.pine --symbol BTCUSDT --format full --pretty

Debug transpilation

pinets run my_indicator.pine --symbol BTCUSDT --debug

Filter signals with --clean

For indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:

# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean

Select specific plots

When you only need specific plots from an indicator:

# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'

Use with AI agents

pinets-cli is designed to be driven programmatically. Indicators go in on stdin, structured JSON comes out on stdout, and there is no interactive prompt or project scaffolding to negotiate — which makes it usable as a tool call from an agent, a script, or a CI job without a wrapper.

A SKILL.md is included in the repository root for agent frameworks that consume skill definitions.

Three flags matter when an agent is the caller:

FlagWhy it matters for automated callers
--quiet / -qSuppresses informational output so stdout is valid JSON and nothing else
--cleanDrops null, false, and empty plot values, cutting response size sharply
--plots <names>Returns only the plots you asked for instead of everything the script emits
# Generate an indicator, execute it, and return only the signal values
cat generated_strategy.pine | pinets run -s BTCUSDT -t 60 --plots "Buy,Sell" --clean -q

Because the runtime is self-contained and reads from stdin, the whole loop — write a script, execute it against real data, read the result — can run locally without a charting platform in the path.


Output Formats

default format

Contains the indicator metadata and all plot data:

{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}

full format

Everything in default, plus the raw execution result and market data:

{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}

JSON Data Format

When using --data, provide a JSON file with an array of candle objects:

[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]

Required fields: open, high, low, close, volume

Recommended fields: openTime, closeTime (millisecond timestamps)


How It Works

pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:

  1. The Pine Script® file is read and passed to the PineTS transpiler
  2. Market data is fetched from Binance (or loaded from your JSON file)
  3. The indicator is executed bar-by-bar with full time-series semantics
  4. Plot data is collected and output as structured JSON

There are no runtime dependencies. The single bundled file includes everything needed.


Supported Timeframes

ValueDescription
11 minute
33 minutes
55 minutes
1515 minutes
3030 minutes
601 hour
1202 hours
2404 hours
1D or D1 day
1W or W1 week
1M or M1 month

Related Projects

  • PineTS : The underlying transpiler and runtime engine

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.


License

AGPL-3.0-or-later - See LICENSE for details.


Built with PineTS by LuxAlgo

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pinets-cli

Run Pine Script® indicators from the command line

npm versionLicensePowered by PineTS

Quick StartUsageOptionsExamplesAI AgentsFull Docs


What is pinets-cli?

pinets-cli is a command-line interface for PineTS, the open-source Pine Script® transpiler and runtime. It lets you execute TradingView® Pine Script® indicators directly from your terminal, with live market data or custom JSON datasets.

pinets run rsi.pine --symbol BTCUSDT --timeframe 60

No code to write. No project to set up. Just point it at a .pine file and go.

Disclaimer: pinets-cli and PineTS are independently developed open-source projects. LuxAlgo Global, LLC and the PineTS project are NOT affiliated with, sponsored by, endorsed by, or in any way officially associated with TradingView, Inc. "Pine Script®" and "TradingView®" are registered trademarks of TradingView, Inc.


Quick Start

Install

npm install -g pinets-cli

Or run directly without installing:

npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60

Run your first indicator

Create a file called sma_cross.pine:

//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)

Run it:

pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60

That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.


Usage

pinets run [options] [file]

The run command executes a Pine Script® indicator and outputs the results as JSON.

Indicator source

Provide the indicator as a file argument or via piped stdin:

# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDT

Data source

Choose between live market data or a local JSON file:

# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json

Options

Data Source

OptionShortDescriptionDefault
--symbol <ticker>-sSymbol to query (e.g., BTCUSDT, ETHUSDT.P)
--timeframe <tf>-tTimeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M60
--data <path>-dPath to a JSON data file (alternative to --symbol)

Output

OptionShortDescriptionDefault
--output <path>-oWrite output to a file instead of stdoutstdout
--format <type>-fOutput format: default or fulldefault
--prettyForce pretty-printed JSONauto
--cleanFilter out null, false, and empty values from plots
--plots <names>Comma-separated list of plot names to includeall plots

Candle Control

OptionShortDescriptionDefault
--candles <count>-nNumber of candles in the output500
--warmup <count>-wExtra candles for indicator warmup (not included in output)0

Other

OptionShortDescription
--debugShow the transpiled code (for debugging)
--quiet-qSuppress all informational messages
--version-vShow version number
--help-hShow help

Examples

Basic indicator with live data

pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100

Indicator warmup

Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:

# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200

Save output to a file

pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json

Pipe into other tools

# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'

Use custom JSON data

pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --pretty

Pipe indicator from stdin

cat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60

Full execution context

pinets run rsi.pine --symbol BTCUSDT --format full --pretty

Debug transpilation

pinets run my_indicator.pine --symbol BTCUSDT --debug

Filter signals with --clean

For indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:

# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean

Select specific plots

When you only need specific plots from an indicator:

# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'

Use with AI agents

pinets-cli is designed to be driven programmatically. Indicators go in on stdin, structured JSON comes out on stdout, and there is no interactive prompt or project scaffolding to negotiate — which makes it usable as a tool call from an agent, a script, or a CI job without a wrapper.

A SKILL.md is included in the repository root for agent frameworks that consume skill definitions.

Three flags matter when an agent is the caller:

FlagWhy it matters for automated callers
--quiet / -qSuppresses informational output so stdout is valid JSON and nothing else
--cleanDrops null, false, and empty plot values, cutting response size sharply
--plots <names>Returns only the plots you asked for instead of everything the script emits
# Generate an indicator, execute it, and return only the signal values
cat generated_strategy.pine | pinets run -s BTCUSDT -t 60 --plots "Buy,Sell" --clean -q

Because the runtime is self-contained and reads from stdin, the whole loop — write a script, execute it against real data, read the result — can run locally without a charting platform in the path.


Output Formats

default format

Contains the indicator metadata and all plot data:

{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}

full format

Everything in default, plus the raw execution result and market data:

{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}

JSON Data Format

When using --data, provide a JSON file with an array of candle objects:

[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]

Required fields: open, high, low, close, volume

Recommended fields: openTime, closeTime (millisecond timestamps)


How It Works

pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:

  1. The Pine Script® file is read and passed to the PineTS transpiler
  2. Market data is fetched from Binance (or loaded from your JSON file)
  3. The indicator is executed bar-by-bar with full time-series semantics
  4. Plot data is collected and output as structured JSON

There are no runtime dependencies. The single bundled file includes everything needed.


Supported Timeframes

ValueDescription
11 minute
33 minutes
55 minutes
1515 minutes
3030 minutes
601 hour
1202 hours
2404 hours
1D or D1 day
1W or W1 week
1M or M1 month

Related Projects

  • PineTS : The underlying transpiler and runtime engine

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.


License

AGPL-3.0-or-later - See LICENSE for details.


Built with PineTS by LuxAlgo

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

pinets-cli

Run Pine Script® indicators from the command line

npm versionLicensePowered by PineTS

Quick StartUsageOptionsExamplesAI AgentsFull Docs


What is pinets-cli?

pinets-cli is a command-line interface for PineTS, the open-source Pine Script® transpiler and runtime. It lets you execute TradingView® Pine Script® indicators directly from your terminal, with live market data or custom JSON datasets.

pinets run rsi.pine --symbol BTCUSDT --timeframe 60

No code to write. No project to set up. Just point it at a .pine file and go.

Disclaimer: pinets-cli and PineTS are independently developed open-source projects. LuxAlgo Global, LLC and the PineTS project are NOT affiliated with, sponsored by, endorsed by, or in any way officially associated with TradingView, Inc. "Pine Script®" and "TradingView®" are registered trademarks of TradingView, Inc.


Quick Start

Install

npm install -g pinets-cli

Or run directly without installing:

npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60

Run your first indicator

Create a file called sma_cross.pine:

//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)

Run it:

pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60

That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.


Usage

pinets run [options] [file]

The run command executes a Pine Script® indicator and outputs the results as JSON.

Indicator source

Provide the indicator as a file argument or via piped stdin:

# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDT

Data source

Choose between live market data or a local JSON file:

# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json

Options

Data Source

OptionShortDescriptionDefault
--symbol <ticker>-sSymbol to query (e.g., BTCUSDT, ETHUSDT.P)
--timeframe <tf>-tTimeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M60
--data <path>-dPath to a JSON data file (alternative to --symbol)

Output

OptionShortDescriptionDefault
--output <path>-oWrite output to a file instead of stdoutstdout
--format <type>-fOutput format: default or fulldefault
--prettyForce pretty-printed JSONauto
--cleanFilter out null, false, and empty values from plots
--plots <names>Comma-separated list of plot names to includeall plots

Candle Control

OptionShortDescriptionDefault
--candles <count>-nNumber of candles in the output500
--warmup <count>-wExtra candles for indicator warmup (not included in output)0

Other

OptionShortDescription
--debugShow the transpiled code (for debugging)
--quiet-qSuppress all informational messages
--version-vShow version number
--help-hShow help

Examples

Basic indicator with live data

pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100

Indicator warmup

Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:

# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200

Save output to a file

pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json

Pipe into other tools

# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'

Use custom JSON data

pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --pretty

Pipe indicator from stdin

cat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60

Full execution context

pinets run rsi.pine --symbol BTCUSDT --format full --pretty

Debug transpilation

pinets run my_indicator.pine --symbol BTCUSDT --debug

Filter signals with --clean

For indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:

# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean

Select specific plots

When you only need specific plots from an indicator:

# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'

Use with AI agents

pinets-cli is designed to be driven programmatically. Indicators go in on stdin, structured JSON comes out on stdout, and there is no interactive prompt or project scaffolding to negotiate — which makes it usable as a tool call from an agent, a script, or a CI job without a wrapper.

A SKILL.md is included in the repository root for agent frameworks that consume skill definitions.

Three flags matter when an agent is the caller:

FlagWhy it matters for automated callers
--quiet / -qSuppresses informational output so stdout is valid JSON and nothing else
--cleanDrops null, false, and empty plot values, cutting response size sharply
--plots <names>Returns only the plots you asked for instead of everything the script emits
# Generate an indicator, execute it, and return only the signal values
cat generated_strategy.pine | pinets run -s BTCUSDT -t 60 --plots "Buy,Sell" --clean -q

Because the runtime is self-contained and reads from stdin, the whole loop — write a script, execute it against real data, read the result — can run locally without a charting platform in the path.


Output Formats

default format

Contains the indicator metadata and all plot data:

{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}

full format

Everything in default, plus the raw execution result and market data:

{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}

JSON Data Format

When using --data, provide a JSON file with an array of candle objects:

[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]

Required fields: open, high, low, close, volume

Recommended fields: openTime, closeTime (millisecond timestamps)


How It Works

pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:

  1. The Pine Script® file is read and passed to the PineTS transpiler
  2. Market data is fetched from Binance (or loaded from your JSON file)
  3. The indicator is executed bar-by-bar with full time-series semantics
  4. Plot data is collected and output as structured JSON

There are no runtime dependencies. The single bundled file includes everything needed.


Supported Timeframes

ValueDescription
11 minute
33 minutes
55 minutes
1515 minutes
3030 minutes
601 hour
1202 hours
2404 hours
1D or D1 day
1W or W1 week
1M or M1 month

Related Projects

  • PineTS : The underlying transpiler and runtime engine

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.


License

AGPL-3.0-or-later - See LICENSE for details.


Built with PineTS by LuxAlgo

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pinets-cli

Run Pine Script® indicators from the command line

npm versionLicensePowered by PineTS

Quick StartUsageOptionsExamplesAI AgentsFull Docs


What is pinets-cli?

pinets-cli is a command-line interface for PineTS, the open-source Pine Script® transpiler and runtime. It lets you execute TradingView® Pine Script® indicators directly from your terminal, with live market data or custom JSON datasets.

pinets run rsi.pine --symbol BTCUSDT --timeframe 60

No code to write. No project to set up. Just point it at a .pine file and go.

Disclaimer: pinets-cli and PineTS are independently developed open-source projects. LuxAlgo Global, LLC and the PineTS project are NOT affiliated with, sponsored by, endorsed by, or in any way officially associated with TradingView, Inc. "Pine Script®" and "TradingView®" are registered trademarks of TradingView, Inc.


Quick Start

Install

npm install -g pinets-cli

Or run directly without installing:

npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60

Run your first indicator

Create a file called sma_cross.pine:

//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)

Run it:

pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60

That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.


Usage

pinets run [options] [file]

The run command executes a Pine Script® indicator and outputs the results as JSON.

Indicator source

Provide the indicator as a file argument or via piped stdin:

# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDT

Data source

Choose between live market data or a local JSON file:

# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json

Options

Data Source

OptionShortDescriptionDefault
--symbol <ticker>-sSymbol to query (e.g., BTCUSDT, ETHUSDT.P)
--timeframe <tf>-tTimeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M60
--data <path>-dPath to a JSON data file (alternative to --symbol)

Output

OptionShortDescriptionDefault
--output <path>-oWrite output to a file instead of stdoutstdout
--format <type>-fOutput format: default or fulldefault
--prettyForce pretty-printed JSONauto
--cleanFilter out null, false, and empty values from plots
--plots <names>Comma-separated list of plot names to includeall plots

Candle Control

OptionShortDescriptionDefault
--candles <count>-nNumber of candles in the output500
--warmup <count>-wExtra candles for indicator warmup (not included in output)0

Other

OptionShortDescription
--debugShow the transpiled code (for debugging)
--quiet-qSuppress all informational messages
--version-vShow version number
--help-hShow help

Examples

Basic indicator with live data

pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100

Indicator warmup

Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:

# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200

Save output to a file

pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json

Pipe into other tools

# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'

Use custom JSON data

pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --pretty

Pipe indicator from stdin

cat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60

Full execution context

pinets run rsi.pine --symbol BTCUSDT --format full --pretty

Debug transpilation

pinets run my_indicator.pine --symbol BTCUSDT --debug

Filter signals with --clean

For indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:

# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean

Select specific plots

When you only need specific plots from an indicator:

# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'

Use with AI agents

pinets-cli is designed to be driven programmatically. Indicators go in on stdin, structured JSON comes out on stdout, and there is no interactive prompt or project scaffolding to negotiate — which makes it usable as a tool call from an agent, a script, or a CI job without a wrapper.

A SKILL.md is included in the repository root for agent frameworks that consume skill definitions.

Three flags matter when an agent is the caller:

FlagWhy it matters for automated callers
--quiet / -qSuppresses informational output so stdout is valid JSON and nothing else
--cleanDrops null, false, and empty plot values, cutting response size sharply
--plots <names>Returns only the plots you asked for instead of everything the script emits
# Generate an indicator, execute it, and return only the signal values
cat generated_strategy.pine | pinets run -s BTCUSDT -t 60 --plots "Buy,Sell" --clean -q

Because the runtime is self-contained and reads from stdin, the whole loop — write a script, execute it against real data, read the result — can run locally without a charting platform in the path.


Output Formats

default format

Contains the indicator metadata and all plot data:

{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}

full format

Everything in default, plus the raw execution result and market data:

{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}

JSON Data Format

When using --data, provide a JSON file with an array of candle objects:

[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]

Required fields: open, high, low, close, volume

Recommended fields: openTime, closeTime (millisecond timestamps)


How It Works

pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:

  1. The Pine Script® file is read and passed to the PineTS transpiler
  2. Market data is fetched from Binance (or loaded from your JSON file)
  3. The indicator is executed bar-by-bar with full time-series semantics
  4. Plot data is collected and output as structured JSON

There are no runtime dependencies. The single bundled file includes everything needed.


Supported Timeframes

ValueDescription
11 minute
33 minutes
55 minutes
1515 minutes
3030 minutes
601 hour
1202 hours
2404 hours
1D or D1 day
1W or W1 week
1M or M1 month

Related Projects

  • PineTS : The underlying transpiler and runtime engine

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.


License

AGPL-3.0-or-later - See LICENSE for details.


Built with PineTS by LuxAlgo

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pinets-cli

Run Pine Script® indicators from the command line

npm versionLicensePowered by PineTS

Quick StartUsageOptionsExamplesAI AgentsFull Docs


What is pinets-cli?

pinets-cli is a command-line interface for PineTS, the open-source Pine Script® transpiler and runtime. It lets you execute TradingView® Pine Script® indicators directly from your terminal, with live market data or custom JSON datasets.

pinets run rsi.pine --symbol BTCUSDT --timeframe 60

No code to write. No project to set up. Just point it at a .pine file and go.

Disclaimer: pinets-cli and PineTS are independently developed open-source projects. LuxAlgo Global, LLC and the PineTS project are NOT affiliated with, sponsored by, endorsed by, or in any way officially associated with TradingView, Inc. "Pine Script®" and "TradingView®" are registered trademarks of TradingView, Inc.


Quick Start

Install

npm install -g pinets-cli

Or run directly without installing:

npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60

Run your first indicator

Create a file called sma_cross.pine:

//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)

Run it:

pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60

That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.


Usage

pinets run [options] [file]

The run command executes a Pine Script® indicator and outputs the results as JSON.

Indicator source

Provide the indicator as a file argument or via piped stdin:

# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDT

Data source

Choose between live market data or a local JSON file:

# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json

Options

Data Source

OptionShortDescriptionDefault
--symbol <ticker>-sSymbol to query (e.g., BTCUSDT, ETHUSDT.P)
--timeframe <tf>-tTimeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M60
--data <path>-dPath to a JSON data file (alternative to --symbol)

Output

OptionShortDescriptionDefault
--output <path>-oWrite output to a file instead of stdoutstdout
--format <type>-fOutput format: default or fulldefault
--prettyForce pretty-printed JSONauto
--cleanFilter out null, false, and empty values from plots
--plots <names>Comma-separated list of plot names to includeall plots

Candle Control

OptionShortDescriptionDefault
--candles <count>-nNumber of candles in the output500
--warmup <count>-wExtra candles for indicator warmup (not included in output)0

Other

OptionShortDescription
--debugShow the transpiled code (for debugging)
--quiet-qSuppress all informational messages
--version-vShow version number
--help-hShow help

Examples

Basic indicator with live data

pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100

Indicator warmup

Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:

# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200

Save output to a file

pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json

Pipe into other tools

# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'

Use custom JSON data

pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --pretty

Pipe indicator from stdin

cat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60

Full execution context

pinets run rsi.pine --symbol BTCUSDT --format full --pretty

Debug transpilation

pinets run my_indicator.pine --symbol BTCUSDT --debug

Filter signals with --clean

For indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:

# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean

Select specific plots

When you only need specific plots from an indicator:

# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'

Use with AI agents

pinets-cli is designed to be driven programmatically. Indicators go in on stdin, structured JSON comes out on stdout, and there is no interactive prompt or project scaffolding to negotiate — which makes it usable as a tool call from an agent, a script, or a CI job without a wrapper.

A SKILL.md is included in the repository root for agent frameworks that consume skill definitions.

Three flags matter when an agent is the caller:

FlagWhy it matters for automated callers
--quiet / -qSuppresses informational output so stdout is valid JSON and nothing else
--cleanDrops null, false, and empty plot values, cutting response size sharply
--plots <names>Returns only the plots you asked for instead of everything the script emits
# Generate an indicator, execute it, and return only the signal values
cat generated_strategy.pine | pinets run -s BTCUSDT -t 60 --plots "Buy,Sell" --clean -q

Because the runtime is self-contained and reads from stdin, the whole loop — write a script, execute it against real data, read the result — can run locally without a charting platform in the path.


Output Formats

default format

Contains the indicator metadata and all plot data:

{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}

full format

Everything in default, plus the raw execution result and market data:

{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}

JSON Data Format

When using --data, provide a JSON file with an array of candle objects:

[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]

Required fields: open, high, low, close, volume

Recommended fields: openTime, closeTime (millisecond timestamps)


How It Works

pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:

  1. The Pine Script® file is read and passed to the PineTS transpiler
  2. Market data is fetched from Binance (or loaded from your JSON file)
  3. The indicator is executed bar-by-bar with full time-series semantics
  4. Plot data is collected and output as structured JSON

There are no runtime dependencies. The single bundled file includes everything needed.


Supported Timeframes

ValueDescription
11 minute
33 minutes
55 minutes
1515 minutes
3030 minutes
601 hour
1202 hours
2404 hours
1D or D1 day
1W or W1 week
1M or M1 month

Related Projects

  • PineTS : The underlying transpiler and runtime engine

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.


License

AGPL-3.0-or-later - See LICENSE for details.


Built with PineTS by LuxAlgo

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

pinets-cli

Run Pine Script® indicators from the command line

npm versionLicensePowered by PineTS

Quick StartUsageOptionsExamplesAI AgentsFull Docs


What is pinets-cli?

pinets-cli is a command-line interface for PineTS, the open-source Pine Script® transpiler and runtime. It lets you execute TradingView® Pine Script® indicators directly from your terminal, with live market data or custom JSON datasets.

pinets run rsi.pine --symbol BTCUSDT --timeframe 60

No code to write. No project to set up. Just point it at a .pine file and go.

Disclaimer: pinets-cli and PineTS are independently developed open-source projects. LuxAlgo Global, LLC and the PineTS project are NOT affiliated with, sponsored by, endorsed by, or in any way officially associated with TradingView, Inc. "Pine Script®" and "TradingView®" are registered trademarks of TradingView, Inc.


Quick Start

Install

npm install -g pinets-cli

Or run directly without installing:

npx pinets-cli run sma_cross.pine --symbol BTCUSDT --timeframe 60

Run your first indicator

Create a file called sma_cross.pine:

//@version=5
indicator("SMA Cross", overlay=true)
fast = ta.sma(close, 9)
slow = ta.sma(close, 21)
plot(fast, "Fast SMA", color=color.blue)
plot(slow, "Slow SMA", color=color.red)

Run it:

pinets run sma_cross.pine --symbol BTCUSDT --timeframe 60

That's it. You'll get JSON output with the calculated SMA values for the last 500 hourly candles.


Usage

pinets run [options] [file]

The run command executes a Pine Script® indicator and outputs the results as JSON.

Indicator source

Provide the indicator as a file argument or via piped stdin:

# From a file
pinets run my_indicator.pine --symbol BTCUSDT
# Piped from stdin (works on Linux, macOS, and Windows)
cat my_indicator.pine | pinets run --symbol BTCUSDT

Data source

Choose between live market data or a local JSON file:

# Live data from Binance
pinets run rsi.pine --symbol BTCUSDT --timeframe 60
# Custom data from a JSON file
pinets run rsi.pine --data ./my_candles.json

Options

Data Source

OptionShortDescriptionDefault
--symbol <ticker>-sSymbol to query (e.g., BTCUSDT, ETHUSDT.P)
--timeframe <tf>-tTimeframe: 1, 5, 15, 60, 240, 1D, 1W, 1M60
--data <path>-dPath to a JSON data file (alternative to --symbol)

Output

OptionShortDescriptionDefault
--output <path>-oWrite output to a file instead of stdoutstdout
--format <type>-fOutput format: default or fulldefault
--prettyForce pretty-printed JSONauto
--cleanFilter out null, false, and empty values from plots
--plots <names>Comma-separated list of plot names to includeall plots

Candle Control

OptionShortDescriptionDefault
--candles <count>-nNumber of candles in the output500
--warmup <count>-wExtra candles for indicator warmup (not included in output)0

Other

OptionShortDescription
--debugShow the transpiled code (for debugging)
--quiet-qSuppress all informational messages
--version-vShow version number
--help-hShow help

Examples

Basic indicator with live data

pinets run rsi.pine --symbol BTCUSDT --timeframe 1D --candles 100

Indicator warmup

Many indicators need historical data to initialize (e.g., a 200-period SMA needs at least 200 bars before producing meaningful output). Use --warmup to fetch extra candles that are processed but excluded from the output:

# Fetch 700 candles (200 warmup + 500 output), return only the last 500
pinets run ema200.pine --symbol ETHUSDT --timeframe 60 --candles 500 --warmup 200

Save output to a file

pinets run macd.pine --symbol BTCUSDT --timeframe 15 -o results.json

Pipe into other tools

# Pretty-print with jq
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots'# Extract last RSI value
pinets run rsi.pine -s BTCUSDT -t 60 -q | jq '.plots.RSI.data[-1].value'

Use custom JSON data

pinets run my_indicator.pine --data ./historical_btc.json --candles 50 --pretty

Pipe indicator from stdin

cat my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60
# Or on Windows PowerShell
Get-Content my_indicator.pine | pinets run --symbol BTCUSDT --timeframe 60

Full execution context

pinets run rsi.pine --symbol BTCUSDT --format full --pretty

Debug transpilation

pinets run my_indicator.pine --symbol BTCUSDT --debug

Filter signals with --clean

For indicators that generate signals (like crossovers), most candles will have false values. Use --clean to filter them out:

# Without --clean: 500 entries, mostly false
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500
# With --clean: Only actual signals
pinets run ma_cross.pine -s BTCUSDT -t 1D -n 500 --clean

Select specific plots

When you only need specific plots from an indicator:

# Get only the Fast SMA (ignore Slow SMA)
pinets run sma_cross.pine -s BTCUSDT --plots "Fast SMA"# Get only Buy and Sell signals
pinets run signals.pine -s BTCUSDT --plots "Buy,Sell" --clean -q | jq '.plots'

Use with AI agents

pinets-cli is designed to be driven programmatically. Indicators go in on stdin, structured JSON comes out on stdout, and there is no interactive prompt or project scaffolding to negotiate — which makes it usable as a tool call from an agent, a script, or a CI job without a wrapper.

A SKILL.md is included in the repository root for agent frameworks that consume skill definitions.

Three flags matter when an agent is the caller:

FlagWhy it matters for automated callers
--quiet / -qSuppresses informational output so stdout is valid JSON and nothing else
--cleanDrops null, false, and empty plot values, cutting response size sharply
--plots <names>Returns only the plots you asked for instead of everything the script emits
# Generate an indicator, execute it, and return only the signal values
cat generated_strategy.pine | pinets run -s BTCUSDT -t 60 --plots "Buy,Sell" --clean -q

Because the runtime is self-contained and reads from stdin, the whole loop — write a script, execute it against real data, read the result — can run locally without a charting platform in the path.


Output Formats

default format

Contains the indicator metadata and all plot data:

{
"indicator": {
"title": "RSI",
"overlay": false
},
"plots": {
"RSI": {
"title": "RSI",
"options": { "color": "#7E57C2" },
"data": [
{ "time": 1704067200000, "value": 65.42 },
{ "time": 1704070800000, "value": 62.18 }
]
}
}
}

full format

Everything in default, plus the raw execution result and market data:

{
"indicator": { ... },
"plots": { ... },
"result": { ... },
"marketData": [
{ "openTime": 1704067200000, "open": 42000, "high": 42500, "low": 41800, "close": 42300, "volume": 1234.5 },
...
]
}

JSON Data Format

When using --data, provide a JSON file with an array of candle objects:

[
{
"openTime": 1704067200000,
"open": 42000.5,
"high": 42500.0,
"low": 41800.0,
"close": 42300.0,
"volume": 1234.56,
"closeTime": 1704070799999
}
]

Required fields: open, high, low, close, volume

Recommended fields: openTime, closeTime (millisecond timestamps)


How It Works

pinets-cli is a self-contained binary that bundles the PineTS library. When you run an indicator:

  1. The Pine Script® file is read and passed to the PineTS transpiler
  2. Market data is fetched from Binance (or loaded from your JSON file)
  3. The indicator is executed bar-by-bar with full time-series semantics
  4. Plot data is collected and output as structured JSON

There are no runtime dependencies. The single bundled file includes everything needed.


Supported Timeframes

ValueDescription
11 minute
33 minutes
55 minutes
1515 minutes
3030 minutes
601 hour
1202 hours
2404 hours
1D or D1 day
1W or W1 week
1M or M1 month

Related Projects

  • PineTS : The underlying transpiler and runtime engine

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.


License

AGPL-3.0-or-later - See LICENSE for details.


Built with PineTS by LuxAlgo

Releases

Packages

Contributors

Languages