Socket
Socket
Sign inDemoInstall

lightweight-charts

Package Overview
Dependencies
Maintainers
2
Versions
43
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

lightweight-charts - npm Package Compare versions

Comparing version 1.0.0-rc.1 to 1.0.0-rc.2

365

dist/typings.d.ts

@@ -0,1 +1,6 @@

/**
* Enum of possible crosshair behavior modes.
* Normal means that the crosshair always follows the pointer.
* Magnet means that the vertical line of the crosshair follows the pointer, while the horizontal line is placed on the corresponding series point.
*/
export declare const enum CrossHairMode {

@@ -16,2 +21,9 @@ Normal = 0,

}
/**
* Enum of possible price scale modes
* Normal mode displays original price values
* Logarithmic mode makes price scale show logarithms of series values instead of original values
* Percentage turns the percentage mode on.
* IndexedTo100 turns the "indexed to 100" mode on
*/
export declare const enum PriceScaleMode {

@@ -23,2 +35,8 @@ Normal = 0,

}
/**
* This function is the main entry point of the Lightweight Charting Library
* @param container - id of HTML element or element itself
* @param options - any subset of ChartOptions to be applied at start.
* @return an interface to the created chart
*/
export declare function createChart(container: string | HTMLElement, options?: DeepPartial<ChartOptions>): IChartApi;

@@ -28,6 +46,15 @@ export declare function isBusinessDay(time: Time): time is BusinessDay;

export declare function version(): string;
export declare type AreaSeriesParams = SeriesParams<AreaSeriesOptions>;
/**
* Structure describing area series options. It inherits all options of the base interface
*/
export declare type AreaSeriesOptions = SeriesOptionsBase & AreaStyleOptions;
export declare type BarPrice = Nominal<number, 'BarPrice'>;
export declare type BarSeriesParams = SeriesParams<BarSeriesOptions>;
export declare type CandleSeriesParams = SeriesParams<CandleSeriesOptions>;
/**
* Structure describing bar series options. It inherits all options of the base interface
*/
export declare type BarSeriesOptions = SeriesOptionsBase & BarStyleOptions;
/**
* Structure describing candle series options. It inherits all options of the base interface
*/
export declare type CandleSeriesOptions = SeriesOptionsBase & CandleStyleOptions;
export declare type Coordinate = Nominal<number, 'Coordinate'>;

@@ -38,5 +65,11 @@ export declare type DateFormat = 'dd MMM \'yy' | 'yyyy-MM-dd' | 'yy-MM-dd' | 'yy/MM/dd' | 'yyyy/MM/dd' | 'dd-MM-yyyy' | 'dd-MM-yy' | 'dd/MM/yy' | 'dd/MM/yyyy' | 'MM/dd/yy' | 'MM/dd/yyyy';

};
export declare type HistogramSeriesParams = SeriesParams<HistogramSeriesOptions>;
/**
* Structure describing histogram series options. It inherits all options of the base interface
*/
export declare type HistogramSeriesOptions = SeriesOptionsBase & HistogramStyleOptions;
export declare type HorzAlign = 'left' | 'center' | 'right';
export declare type LineSeriesParams = SeriesParams<LineSeriesOptions>;
/**
* Structure describing line series options. It inherits all options of the base interface
*/
export declare type LineSeriesOptions = SeriesOptionsBase & LineStyleOptions;
export declare type LineWidth = 1 | 2 | 3 | 4;

@@ -67,5 +100,2 @@ export declare type MouseEventHandler = (param: MouseEventParams) => void;

export declare type VertAlign = 'top' | 'center' | 'bottom';
export interface AreaSeriesOptions extends SeriesOptionsBase {
areaStyle: AreaStyleOptions;
}
export interface AreaStyleOptions {

@@ -86,5 +116,2 @@ topColor: string;

}
export interface BarSeriesOptions extends SeriesOptionsBase {
barStyle: BarStyleOptions;
}
export interface BarStyleOptions {

@@ -101,49 +128,94 @@ upColor: string;

}
export interface CandleSeriesOptions extends SeriesOptionsBase {
candleStyle: CandleStyleOptions;
}
/** Structure describing a drawing style of the candle chart */
export interface CandleStyleOptions {
/** Color of growing candles */
upColor: string;
/** Color of falling candles */
downColor: string;
/** Flag to draw/hide candles' wicks */
wickVisible: boolean;
/** Flag to draw/hide candles' borders around bodies */
borderVisible: boolean;
/**
* Color of borders around candles' bodies. Ignored if borderVisible == false
* If specified, it overrides both borderUpColor and borderDownColor options
*/
borderColor: string;
/** Color of the border of growing candles. Ignored if borderVisible == false or borderColor is specified */
borderUpColor: string;
/** Color of the border of falling candles. Ignored if borderVisible == false or borderColor is specified */
borderDownColor: string;
/**
* Color of candles' wicks. Ignored if wickVisible == false
* If specified, it overrides both wickUpColor and wickDownColor options
*/
wickColor: string;
/** Color of growing candles' wicks. Ignored if wickVisible == false or wickColor is specified */
wickUpColor: string;
/** Color of falling candles' wicks. Ignored if wickVisible == false or wickColor is specified */
wickDownColor: string;
}
/**
* Structure describing options of the chart. Series options are to be set separately
*/
export interface ChartOptions {
/** Width of the chart */
width: number;
/** Height of the chart */
height: number;
/** Structure with watermark options */
watermark: WatermarkOptions;
/** Structure with layout options */
layout: LayoutOptions;
/** Structure with price scale options */
priceScale: PriceScaleOptions;
/** Structure with time scale options */
timeScale: TimeScaleOptions;
/** Structure with crosshair options */
crossHair: CrossHairOptions;
/** Structure with grid options */
grid: GridOptions;
/** Structure with localization options */
localization: LocalizationOptions;
/** Structure that describes scrolling behavior */
handleScroll: HandleScrollOptions;
/** Structure that describes scaling behavior */
handleScale: HandleScaleOptions;
}
/** Structure describing a crosshair line (vertical or horizontal) */
export interface CrossHairLineOptions {
/** Color of a certain crosshair line */
color: string;
/** Width of a certain crosshair line and corresponding scale label */
width: LineWidth;
/** Style of a certain crosshair line */
style: LineStyle;
/** Visibility of a certain crosshair line */
visible: boolean;
/** Visibility of corresponding scale label */
labelVisible: boolean;
}
/** Structure describing crosshair options */
export interface CrossHairOptions {
/** Crosshair mode */
mode: CrossHairMode;
/** Options of the crosshair vertical line */
vertLine: CrossHairLineOptions;
/** Options of the crosshair horizontal line */
horzLine: CrossHairLineOptions;
}
/** Structure describing horizontal or vertical grid lines options */
export interface GridLineOptions {
/** Color of the lines */
color: string;
/** Style of the lines */
style: LineStyle;
/** Visibility of the lines */
visible: boolean;
}
/** Structure describing grid options */
export interface GridOptions {
/** Vertical grid lines options */
vertLines: GridLineOptions;
/** Horizontal grid lines options */
horzLines: GridLineOptions;

@@ -160,8 +232,7 @@ }

}
/** Structure describing a single item of data for histogram series */
export interface HistogramData extends LineData {
/** Optional color value for certain data item. If missed, color from HistogramSeriesOptions is used */
color?: string;
}
export interface HistogramSeriesOptions extends SeriesOptionsBase {
histogramStyle: HistogramStyleOptions;
}
export interface HistogramStyleOptions {

@@ -189,71 +260,248 @@ color: string;

export interface IChartApi {
/**
* Removes the chart object including all DOM elements. This is an irreversible operation, you cannot do anything with the chart after removing it.
*/
remove(): void;
/**
* Sets fixed size of the chart. By default chart takes 100% of its container
* @param height - target heght of the chart
* @param width - target width of the chart
* @param [forceRepaint=false] - true to initiate resize immediately. One could need this to get screenshot immediately after resize
*/
resize(height: number, width: number, forceRepaint?: boolean): void;
addAreaSeries(areaParams?: DeepPartial<AreaSeriesParams>): IAreaSeriesApi;
addBarSeries(barParams?: DeepPartial<BarSeriesParams>): IBarSeriesApi;
addCandleSeries(candleParams?: DeepPartial<CandleSeriesParams>): ICandleSeries;
addHistogramSeries(histogramParams?: DeepPartial<HistogramSeriesParams>): IHistogramSeriesApi;
addLineSeries(lineParams?: DeepPartial<LineSeriesParams>): ILineSeriesApi;
/**
* Creates an area series with specified parameters
* @param [areaParams = undefined] - customization parameters of the series being created
* @return an interface of the created series
*/
addAreaSeries(areaParams?: DeepPartial<AreaSeriesOptions>): IAreaSeriesApi;
/**
* Creates a bars series with specified parameters
* @param [barParams = undefined] - customization parameters of the series being created
* @return an interface of the created series
*/
addBarSeries(barParams?: DeepPartial<BarSeriesOptions>): IBarSeriesApi;
/**
* Creates a candle series with specified parameters
* @param [candleParams = undefined] - customization parameters of the series being created
* @return an interface of the created series
*/
addCandleSeries(candleParams?: DeepPartial<CandleSeriesOptions>): ICandleSeries;
/**
* Creates a histogram series with specified parameters
* @param [histogramParams=undefined] - customization parameters of the series being created
* @return an interface of the created series
*/
addHistogramSeries(histogramParams?: DeepPartial<HistogramSeriesOptions>): IHistogramSeriesApi;
/**
* Creates a line series with specified parameters
* @param [lineParams=undefined] - customization parameters of the series being created
* @return an interface of the created series
*/
addLineSeries(lineParams?: DeepPartial<LineSeriesOptions>): ILineSeriesApi;
/**
* Removes a series of any type. This is an irreversible operation, you cannot do anything with the series after removing it
*/
removeSeries(seriesApi: ISeriesApi): void;
subscribeClick(handler: MouseEventHandler): void;
/**
* Removes mouse click subscription
* @param handler - previously subscribed handler
*/
unsubscribeClick(handler: MouseEventHandler): void;
/**
* Adds a subscription to crosshair movement to receive notifications aboute cross hair moving
* @param handler - handler (function) to be called on cross hair move
*/
subscribeCrossHairMove(handler: MouseEventHandler): void;
/**
* Removes a subscription on crosshair movement
* @param handler - previously subscribed handler
*/
unsubscribeCrossHairMove(handler: MouseEventHandler): void;
/**
* Adds a subscription to visible range changes to receive notification about visible range of data changes
* @param handler - handler (function) to be called on changing visible data range
*/
subscribeVisibleTimeRangeChange(handler: TimeRangeChangeEventHandler): void;
/**
* Removes a subscription to visible range changes
* @param handler - previously subscribed handler
*/
unsubscribeVisibleTimeRangeChange(handler: TimeRangeChangeEventHandler): void;
/**
* Returns API to manipulate the price scale
* @returns - target API
*/
priceScale(): IPriceScaleApi;
/**
* Returns API to manipulate the time scale
* @return - target API
*/
timeScale(): ITimeScaleApi;
/**
* Applies new options to the chart
* @param - options, any subset of chart options
*/
applyOptions(options: DeepPartial<ChartOptions>): void;
/**
* Returns currently applied options
* @return - full set of currently applied options, including defautls
*/
options(): ChartOptions;
/**
* Removes branding text from the chart.
* Please read the description of this method in the documentation to learn more about the conditions for remove the branding.
*/
disableBranding(): void;
}
/** Interface to histogram series */
export interface IHistogramSeriesApi extends ISeriesApi {
/**
* Sets or replaces series data
* @param - ordered (earlier time point goes first) array of data items. Old data are fully replaced with new one
*/
setData(data: HistogramData[]): void;
/**
* Appends a new bar or replaces the last bar of the series
* @param a single data item to be added. Time of new item must be greater or equal to the latest time point of already existing data.
* If the new item's time is equal to the last existing item's time, then the existing item is replaced with the new one.
*/
update(bar: HistogramData): void;
/**
* Applies new options to the existing series
* @param options - any subset of options
*/
applyOptions(options: DeepPartial<HistogramSeriesOptions>): void;
/**
* Returns currently applied options
* @return full set of currently applied options, including defaults
*/
options(): HistogramSeriesOptions;
}
/** Interface describing line series */
export interface ILineSeriesApi extends ILineSeriesApiBase {
/**
* Applies new options to the existing series
* @param options - any subset of options
*/
applyOptions(options: DeepPartial<LineSeriesOptions>): void;
/**
* Returns currently applied options
* @return full set of currently applied options, including defaults
*/
options(): LineSeriesOptions;
}
/** Interface implemented by all series types having a single value per time point: line, area */
export interface ILineSeriesApiBase extends ISeriesApi {
/**
* Sets or replaces line series data
* @param - ordered (earlier time point goes first) array of data items. Old data are fully replaced with new one
*/
setData(data: LineData[]): void;
/**
* Appends a new point or replaces the last point of the series
* @param a single data item to be added. Time of the new item must be greater or equal to the latest existing time point.
* If the new item's time is equal to the last existing item's time, then the existing item is replaced with the new one.
*/
update(bar: LineData): void;
}
/** Interface to be implemened by the object in order to be used as a price formatter */
export interface IPriceFormatter {
/**
* Formatting function
* @param price - original price to be formatted
* @return - formatted price
*/
format(price: BarPrice): string;
}
/** Interface to control chart's price scale */
export interface IPriceScaleApi {
/**
* Applies new options to the price scale
* @param options - any subset of PriceScaleOptions
*/
applyOptions(options: DeepPartial<PriceScaleOptions>): void;
/**
* Returns currently applied options of the price scale
* @return full set of currently applied options, including defaults
*/
options(): PriceScaleOptions;
}
/** Basic interface implemented by all series objects */
export interface ISeriesApi {
/**
* Returns current price formatter
* @return - interface to the price formatter object that can be used to format prices in the same way as the chart does
*/
priceFormatter(): IPriceFormatter;
/** Converts specified series price to pixel coordinate according to the chart price scale
* @param price - input price to be converted
* @result - pixel coordinate of the price level on the chart
*/
priceToCoordinate(price: BarPrice): Coordinate | null;
}
/** Interface to chart time scale */
export interface ITimeScaleApi {
/**
* Returns current scroll position of the chart
* @return a distance from the right edge to the latest bar, measured in bars
*/
scrollPosition(): number;
/**
* Scrolls the chart to the specified position
* @param position - target data position
* @param animated - setting true makes the chart scrolling smoothly with an animation
*/
scrollToPosition(position: number, animated: boolean): void;
scrollToRealtime(): void;
/**
* Restores default scroll position of the chart. This operation is always animated.
*/
scrollToRealTime(): void;
/**
* Returns current visible time range of the chart
* @return - visible range or null if the chart has no data at all
*/
getVisibleRange(): TimeRange | null;
/**
* Sets visible range of data
* @param range - target visible range of data
*/
setVisibleRange(range: TimeRange): void;
/**
* Restores default zooming and scroll position of the time scale
*/
resetTimeScale(): void;
/**
* Automatically calculates the visible range to fit all data from all series
* This is a momentary operation.
*/
fitContent(): void;
/**
* Applies new options to the time scale.
* @param options - any subset of options
*/
applyOptions(options: DeepPartial<TimeScaleOptions>): void;
/**
* Returns current options
* @return - currently applied options
*/
options(): TimeScaleOptions;
}
/** Structure describing layout options */
export interface LayoutOptions {
lineColor: string;
/** Background color of the chart area and the scales */
backgroundColor: string;
/** Color of a text on the scales */
textColor: string;
/** Font size of a text on the scales in pixels */
fontSize: number;
/** Font family of a text on the scales */
fontFamily: string;
}
/** Structure describing single data item for series of type Line or Area */
export interface LineData extends TimedData {
/** Price value of data item */
value: number;
}
export interface LineSeriesOptions extends SeriesOptionsBase {
lineStyle: LineStyleOptions;
}
export interface LineStyleOptions {

@@ -272,4 +520,13 @@ color: string;

locale: string;
/**
* User-defined function for price formatting. Could be used for some specific cases, that could not be covered with PriceFormat
*/
priceFormatter?: PriceFormatterFn;
/**
* User-defined function for time formatting.
*/
timeFormatter?: TimeFormatterFn;
/**
* One of predefined variants to format time. Ignored if timeFormatter has been specified.
*/
dateFormat: DateFormat;

@@ -286,33 +543,70 @@ }

}
/**
* Structure describing series values formatting
* Fields precision and minMove allow wide customization of formatting
* @example
* minMove = 0.01 , precision is not specified. Prices will change like 1.13, 1.14, 1.15 etc.
* minMove = 0.01 , precision = 3. Prices will change like 1.130, 1.140, 1.150 etc.
* minMove = 0.05 , precision is not specified. Prices will change like 1.10, 1.15, 1.20
*/
export interface PriceFormat {
/**
* Enum of possible modes of price formatting
* 'price' is the most common choice; it allows customization of precision and rounding of prices
* 'volume' uses abbreviation for formatting prices like '1.2K' or '12.67M'
* 'percent' uses '%' sign at the end of prices.
*/
type: 'price' | 'volume' | 'percent';
/**
* Number of digits after the decimal point.
* If it is not set, then its value is calculated automatically based on minMove
*/
precision: number;
/**
* Minimal step of the price. This value shouldn't have more decimal digits than the precision
*/
minMove: number;
}
/** Defines margins of the price scale */
export interface PriceScaleMargins {
/** Top margin in percents. Must be greater or equal to 0 and less than 100 */
top: number;
/** Bottom margin in percents. Must be greater or equal to 0 and less than 100 */
bottom: number;
}
/** Structure that describes price scale options */
export interface PriceScaleOptions {
/** True makes chart calculate the price range automatically based on the visible data range */
autoScale: boolean;
/** Mode of the price scale */
mode: PriceScaleMode;
/** True inverts the scale. Makes lager values drawn lower. Affects both the price scale and the data on the chart */
invertScale: boolean;
/** True value prevents labels on the price scale from overlapping one another by aligning them one below others */
alignLabels: boolean;
/** Defines position of the price scale on the chart */
position: PriceAxisPosition;
/** Defines price margins for the price scale */
scaleMargins: PriceScaleMargins;
/** Set true to draw a border between the price scale and the chart area */
borderVisible: boolean;
/** Defines a color of the border between the price scale and the chart area. It is ignored if borderVisible is false */
borderColor: string;
}
/**
* Structure describing options common for all types of series
*/
export interface SeriesOptionsBase {
/** Visibility of the price line. Price line is a horizontal line indicating the last price of the series */
priceLineVisible: boolean;
/** Visibility of the label with the latest visible price on the price scale */
lastValueVisible: boolean;
/** Width of the price line. Ignored if priceLineVisible is false */
priceLineWidth: LineWidth;
/** Color of the price line. Ignored if priceLineVisible is false */
priceLineColor: string;
/** Formatting settings associated with the series */
priceFormat: PriceFormat;
/** Color of the base line in IndexedTo100 mode */
baseLineColor: string;
}
export interface SeriesParams<T extends SeriesOptionsBase> extends SeriesParamsBase {
options?: DeepPartial<T>;
}
export interface SeriesParamsBase {
overlay: boolean;

@@ -341,8 +635,15 @@ title?: string;

}
/** Structure describing watermark options */
export interface WatermarkOptions {
/** Color of the watermark */
color: string;
/** Visibility of the watermark. If false, other parameters are ignored */
visible: boolean;
/** Text of the watermark. Word wrapping is not supported */
text: string;
/** Font size in pixels */
fontSize: number;
/** Horizontal alignment of the watermark inside the chart area */
horzAlign: HorzAlign;
/** Vertical alignment of the watermark inside the chart area */
vertAlign: VertAlign;

@@ -349,0 +650,0 @@ }

4

package.json
{
"version": "1.0.0-rc.1",
"version": "1.0.0-rc.2",
"name": "lightweight-charts",
"author": "TradingView, Inc.",
"license": "Apache-2.0",
"description": "Lightweight financial HTML5 canvas charting library",
"description": "Financial lightweight charts built with HTML5 canvas",
"bugs": {

@@ -8,0 +8,0 @@ "url": "https://github.com/tradingview/lightweight-charts/issues"

# Lightweight Charts
TradingView Lightweight Chart is one of the smallest and high performative financial HTML5 charts.
[![npm version](https://badge.fury.io/js/lightweight-charts.svg)](https://www.npmjs.com/package/lightweight-charts)
![npm bundle size](https://badgen.net/bundlephobia/minzip/lightweight-charts)
![Zero dependencies](https://badgen.net/badge/dependencies/0/green)
[![Downloads](https://img.shields.io/npm/dm/lightweight-charts.svg)](https://www.npmjs.com/package/lightweight-charts)
TradingView Lightweight Charts is one of the smallest and fastest financial HTML5 charts.
The Lightweight Charting Library is the best choice for you if you want to display financial data as an interactive chart on your web page without affecting your web page loading speed and performance.
It is the best choice for you if you want to replace static image charts with interactive ones.
The size of the library is close to static images but if you have dozens of image charts on a web page then using this library can make the size of your web page smaller.
## Documentation
Getting started guide and documentation you can find in [docs](./docs) folder.
## Installing

@@ -36,5 +50,5 @@

https://unpkg.com/lightweight-charts/dist/lightweight-charts.standalone.production.js
<https://unpkg.com/lightweight-charts/dist/lightweight-charts.standalone.production.js>
The standalone version puts all exports from `esm` version to `window.LightweightCharts`:
The standalone version creates `window.LightweightCharts` object with all exports from `esm` version:

@@ -62,6 +76,6 @@ ```js

- `npm run tsc` - compiles source code only (without tests)
- `npm run tsc-watch` - runs the TypeScript compiler in watch mode for source code (the same as `tsc`, but in watch mode)
- `npm run tsc` - compiles the source code only (excluding tests)
- `npm run tsc-watch` - runs the TypeScript compiler in the watch mode for source code (same as `tsc`, but in the watch mode)
- `npm run tsc-all` - compiles everything (source code and tests)
- `npm run tsc-all-watch` - runs the TypeScript compiler in watch mode for source code and tests (the same as `tsc-all`, but in watch mode)
- `npm run tsc-all-watch` - runs the TypeScript compiler in watch mode for source code and tests (same as `tsc-all`, but in watch mode)

@@ -71,7 +85,6 @@ ### Bundling

- `npm run rollup` - runs Rollup to bundle code
- `npm run build` - compiles source code and bundles it (a short-hand for `npm run tsc && npm run rollup`)
- `npm run build` - compiles source code and bundles it (as one word for `npm run tsc && npm run rollup`)
Note: by default only dev version is bundled.
To bundle a production builds (minified) too just set `NODE_ENV` variable to `production` and run bundling.
For example: `NODE_ENV=production npm run rollup`.
Note that only the dev version is bundled by default.
To bundle production builds (minified) too just set the `NODE_ENV` variable to `production` and run bundling, e.g. `NODE_ENV=production npm run rollup`.

@@ -85,11 +98,11 @@ ### Testing

To make sure that your local copy passed all (almost) checks, you can use a `verify` npm script: `npm run verify`.
To make sure that your local copy passed all (almost) checks, you can use the `verify` npm script: `npm run verify`.
## License
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this software except in compliance with the License.
You may obtain a copy of the License at LICENSE file.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
This software incorporates several parts of tslib (https://github.com/Microsoft/tslib, (c) Microsoft Corporation) that are covered by the the Apache License, Version 2.0.
This software incorporates several parts of tslib (<https://github.com/Microsoft/tslib>, (c) Microsoft Corporation) that are covered by the the Apache License, Version 2.0.

@@ -99,2 +112,2 @@ This license requires specifying TradingView as the product creator. You can use one of the following methods to do it:

- do not disable the TradingView branding displaying;
- add the "attribution notice" from the NOTICE file and a link to our website (https://www.tradingview.com/) to the page of your website or mobile application that is available to your users;
- add the "attribution notice" from the NOTICE file and a link to our website (<https://www.tradingview.com/>) to the page of your website or mobile application that is available to your users;

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc