open-index/open-npm huggingface dataset:
npm package: @linklee/mcp-server
Description: Model Context Protocol server for Linklee — short links, analytics, QR codes
Latest version: 0.1.0

# @linklee/mcp-server

Model Context Protocol (MCP) server for [Linklee](https://linklee.ru) — short links, analytics, and QR codes.

## Quick Start

### With Claude Desktop

Add to `~/.claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "linklee": {
      "command": "npx",
      "args": ["@linklee/mcp-server"],
      "env": {
        "LINKLEE_API_KEY": "lk_live_your_api_key_here"
      }
    }
  }
}
```

### With Claude Code

```bash
claude mcp add linklee -- npx @linklee/mcp-server
```

Set your API key:
```bash
export LINKLEE_API_KEY=lk_live_your_api_key_here
```

## Available Tools

| Tool | Description |
|------|-------------|
| `linklee_create_link` | Create a short link |
| `linklee_list_links` | List links in workspace |
| `linklee_get_analytics` | Get click analytics |
| `linklee_list_tags` | List workspace tags |

## Configuration

| Environment Variable | Default | Description |
|---------------------|---------|-------------|
| `LINKLEE_API_KEY` | — | API key (required). Create at Dashboard → API Keys |
| `LINKLEE_API_URL` | `https://api.linklee.ru` | API base URL |

## Examples

> "Сократи ссылку https://example.com/very-long-url"

> "Покажи аналитику по workspace за последнюю неделю"

> "Создай ссылку с UTM-метками для Instagram кампании"

## Development

```bash
cd mcp-server
npm install
npm run dev
```

## License

MIT
npm package: @linklet-io/node-redis-ratelimit
Description: [![npm (scoped)](https://img.shields.io/npm/v/@linklet-io/node-redis-ratelimit)](https://www.npmjs.com/package/@linklet-io/node-redis-ratelimit) [![Tests](https://github.com/linklet-io/node-redis-ratelimit-js/actions/workflows/tests.yaml/badge.svg)](https
Latest version: 2.0.5

# Node Redis Rate Limit

[![npm (scoped)](https://img.shields.io/npm/v/@linklet-io/node-redis-ratelimit)](https://www.npmjs.com/package/@linklet-io/node-redis-ratelimit)
[![Tests](https://github.com/linklet-io/node-redis-ratelimit-js/actions/workflows/tests.yaml/badge.svg)](https://github.com/linklet-io/node-redis-ratelimit-js/actions/workflows/tests.yaml)

A fork of [@upstash/ratelimit](https://github.com/upstash/ratelimit) that uses Redis' `redis` package instead of Upstash's `@upstash/redis`. For Node.js/Bun/Deno serverful environments. Strips out Upstash specific features - analytics, deny list, etc.

## Quick Start

### Install

#### npm

```bash
npm install @linklet-io/node-redis-ratelimit
```

### Basic Usage

```ts
import { Ratelimit } from "@linklet-io/node-redis-ratelimit";
import { createClient } from "redis";

// Create a new ratelimiter, that allows 10 requests per 10 seconds
const ratelimit = new Ratelimit({
  redis: createClient(),
  limiter: Ratelimit.slidingWindow(10, "10 s"),
  /**
   * Optional prefix for the keys used in redis. This is useful if you want to share a redis
   * instance with other applications and want to avoid key collisions. The default prefix is
   * "@linklet-io/node-redis-ratelimit"
   */
  prefix: "@linklet-io/node-redis-ratelimit",
});

// Use a constant string to limit all requests with a single ratelimit
// Or use a userID, apiKey or ip address for individual limits.
const identifier = "api";
const { success } = await ratelimit.limit(identifier);

if (!success) {
  return "Unable to process at this time";
}
doExpensiveCalculation();
return "Here you go!";
```

## Contributing

### Running tests

To run the tests, you will need to have a redis instance. Example using docker:

```sh
docker run -p 6379:6379 -it redis/redis-stack-server:latest
```

Once you have a redis instance, simply run:

```sh
bun test
```
npm package: @linkorb/activity-tracker
Description: A browser side activity tracker
Author: Hongliang
Latest version: 1.1.1

activity-tracker
========

activity-tracker.js is a simple way to track browser side user behavior. It is helpful for analyzing users' behavior when reading your web articles. 

## Installation
```
npm install @linkorb/activity-tracker
```
To build activity-tracker into your lib with webpack:
```
require('@linkorb/activity-tracker');
```

## Demo

Check the `demo/` directory for an demonstration + example on how to use activity-tracker. To run the demo for test:
```
php -S 127.0.0.1:8888
```
Then you can access the demo from: __http://localhost:8888/demo__

It is possible to configure the activity-tracker:
```html
<!-- platform.js is used for reporting the agent info. optional -->
<script src="node_modules/platform/platform.js"></script>
<!-- load activity-tracker -->
<script src="dist/at.min.js"></script>
<!-- configuread activity-tracker -->
<script>
    // turn on debug mode. Optional
    at('debug')

    // serverUri is required
    // without serverUri nothing is recorded, nor reported

    // server address to report to - websocket
    // at('sender', 'websocket'); // optional, the default sender is websocket
    at('serverUri', 'ws://127.0.0.1:7777')

    // server address to report to - ajax
    at('sender', 'xmlhttp')
    at('serverUri', 'http://localhost/myWebserver')
    
    // time interval to report to the server, in ms. Optional, default 5000
    at('reportInterval', 6000) 

    // custom/meta variables. Optional
    at('meta', 'meRock')
    at('meta', 'contentId', 6)
    at('meta', 'userGroup', 'Cool people')
    at('meta', 'requestId', 'aa-bb-cc-dd-eee')
</script>
```

## Re-provision
When new content/page is loaded without page reload, e.g. AJAX, you can re-provision the activity-tracker:
```html
<script>
at('meta', 'contentId', 7);
at('meta', 'requestId', 'ff-gg-hh-ii-jjj');
atProvision();
</script>
```

## Subscribe only to certain events
By default, activity-tracker reports the following events: __mousemove__, __click__, __dblclick__, __keyup__, __scroll__. You can specify only certain events are reported:
```javascript
// only report click and scroll events
at('subscribe', 'click, scroll');
atProvision();
```

## Inspect local activity stack
```html
<script>
// list all the activity objects recorded
atStack()
</script>
```

## Build from source
To change the source file and build, simply use `webpack`.
```
# generates dist/at.js
webpack -d
# generates dist/at.min.js
webpack -p
```
npm package: @linkorb/brace-helper
Description: Automaticaly initialize textareas as Ace editors through Brace
Author: LinkORB Engineering
Latest version: 0.2.1

brace-helper
============

`brace-helper` will look for `<textarea />` elements with a given classname (`.ace-editor` by default) and turns them into an [ace editor](https://ace.c9.io/) using [brace](https://github.com/thlorenz/brace). You can tune the ace editor by adding `data-` attributes.

## Example

package.json
```json
{
  "dependencies": {
    "brace-helper": "^0.2.0",
  }
}
```

app.js:
```javascript
import '@linkorb/brace-helper'; // auto initialize ace editors

// import any modes or themes you'd like to use in your app
import 'brace/mode/javascript';
import 'brace/mode/css';
import 'brace/mode/yaml';
import 'brace/theme/monokai';
```

example.html:
```html
<textarea class="ace-editor" data-mode="css" data-lines="50"></textarea>
```

This textarea will now be automatically converted into an ace editor with css highlighting.


## Inspiration

This library was inspired by [ace-helper](https://github.com/h-wang/ace-helper), but can be used in a webpack / browserify / webpack-encore environment, and does not require jQuery.

## License

MIT. Please refer to the [license file](LICENSE) for details.

## Brought to you by the LinkORB Engineering team

<img src="http://www.linkorb.com/d/meta/tier1/images/linkorbengineering-logo.png" width="200px" /><br />
Check out our other projects at [linkorb.com/engineering](http://www.linkorb.com/engineering).

Btw, we're hiring!
npm package: @linkorb/form-token
Description: inserts a form token in each form wchich method is post method.
Author: LinkORB Engineering
Latest version: 0.1.0

# form-token
inserts a form token in each form wchich method is post method.

# Example

package.json

```javascript
{
  "dependencies": {
    "@linkorb/form-token": "^0.1",
  }
}
```

app.js:
```javascript
  import '@linkorb/form-token';
```

### Define `formToken` global variable in file

```javascript
  var formToken = "xxx-xx-xxx";
```

## License

MIT. Please refer to the [license file](LICENSE) for details.

## Brought to you by the LinkORB Engineering team

<img src="http://www.linkorb.com/d/meta/tier1/images/linkorbengineering-logo.png" width="200px" /><br />
Check out our other projects at [linkorb.com/engineering](http://www.linkorb.com/engineering).

Btw, we're hiring!
npm package: @linkorb/idle
Description: A simple javascript library to detect browser idle and perform actions.
Author: Hongliang
Latest version: 0.1.1

idle.js
========

A simple javascript library to detect browser idle and perform actions.

## Installation
```
npm install @linkorb/idle
```

## Demo

Check the `demo/` directory for an demonstration + example on how to use idle.js

## How to use

To support idle.js in your application, you'll need to include a script tag in your html:

```html
<script type="text/javascript" src="../idle.js"></script>
```
You may specify some global variables to tweak the behaviors.
```js
// set redirect url (relative) after idle timeout
_idle('url', '/demo/logout.html');

// set escaped urls that no need to detect idle, e.g. logout page
_idle('escape', ['/demo/logout.html']);

// specifying a callback to replace the default redirect action
_idle('callback', function(){console.log('timeout')});

// customize idle time interval, in ms.
_idle('interval', 2000);

// enable debug mode
_idle('debug', true);
```

## Build from source
To change the source file and build, simply use `webpack`.
```
# generates dist/tweak.js
webpack -d
# generates dist/tweak.min.js
webpack -p
```

## License

MIT (see [LICENSE](LICENSE))

## Brought to you by the LinkORB Engineering team

<img src="http://www.linkorb.com/d/meta/tier1/images/linkorbengineering-logo.png" width="200px" /><br />
Check out our other projects at [linkorb.com/engineering](http://www.linkorb.com/engineering).

Btw, we're hiring!
npm package: @linkorgs/babel-plugin-jsx
Description: 更多信息请参考官方文档 [https://gyron.netlify.app/](https://gyron.netlify.app/)
Latest version: 0.0.7

# babel-plugin-jsx

更多信息请参考官方文档 [https://gyron.netlify.app/](https://gyron.netlify.app/)
npm package: @linkorgs/esbuild-plugin-jsx
Description: 更多信息请参考官方文档 [https://gyron.netlify.app/](https://gyron.netlify.app/)
Latest version: 0.0.6

# esbuild-plugin-jsx

更多信息请参考官方文档 [https://gyron.netlify.app/](https://gyron.netlify.app/)
npm package: @linkorgs/html-template
Description: simple html template engine
Author: Link
Latest version: 2.2.2

<p align="center">
  <img src="https://linkorg.club/www/html-template/logo.png" alt="html-template">
</p>

[![Build Status](https://travis-ci.com/Linkontoask/html-template.svg?branch=master)](https://travis-ci.com/Linkontoask/html-template)

# html-template

The simplest `html` template engine

## Installation

`npm install @linkorgs/html-template`

or

`yarn add @linkorgs/html-template`

## Usage

```javascript
import { Render } from "@linkorgs/html-template"                    // ESModule
// const { Render } = require("@linkorgs/html-template")            // commonjs 
const render = new Render()
render.render(`<div>{{ return null || '@linkorgs/html-template' }}</div>`)
// output: <div>@linkorgs/html-template</div>
```

`2.0.1` starts to support asynchronous syntax, the basic usage is as follows

```javascript
import { Render } from "@linkorgs/html-template"
const render = new Render({
  mini: true
})

void async function() {
  await render.render(`
    <div>
      {{
        return (async function() {
          return await Promise.resolve('@linkorgs/html-template')
        })();
      }}
    </div>
`)
  // output: <div>@linkorgs/html-template</div>
}()
```

## Documentation

Use **new Render (options?: object)** for initialization and return an instance of **Render**.

### options

+ `mini`: Whether to compress `html` content. As with the `minify` attribute of` html-webpack-plugin`, use `html-minifier` to compress HTML content. See [List](https://github.com/kangax/html-minifier#options-quick-reference) for optional values. The default values are as follows
```javascript
{
  collapseWhitespace: true,
  removeComments: true,
  removeRedundantAttributes: true,
  removeScriptTypeAttributes: true,
  removeStyleLinkTypeAttributes: true,
  useShortDoctype: true
}
```

Note: If the value of `mini` is` false`, nothing will be compressed. If it is `true`, the above default value will be used

### API

+ `set (html: string)`: set the template string to be rendered
+ `compiler (template?: string)`: Returns a prepared array of templates for the `render` function to compile
+ `render (template?: string)`: render template string and return

### Changelog

Detailed changes for each release are documented in the [release notes](CHANGELOG.md).

### LICENSE

[MIT](LICENSE)
npm package: @linkorgs/jsx-runtime
Description: 支持 `jsx` 语法的运行时，比如 `babel` 的 `transform-react-jsx` 插件
Latest version: 0.0.7

# jsx-runtime

支持 `jsx` 语法的运行时，比如 `babel` 的 `transform-react-jsx` 插件

## 配置

```js
module.exports = {
  plugins: [
    [
      '@babel/plugin-transform-react-jsx',
      {
        importSource: '@linkorgs',
        pragma: 'reactCreateElement',
        pragmaFrag: 'Fragment',
      },
    ],
  ],
}
```

更多信息请参考官方文档 [https://gyron.netlify.app/](https://gyron.netlify.app/)
npm package: @linkorgs/sync
Description: 同步数据，`sync`函数解决响应数据同步时状态不更新的问题。
Latest version: 0.0.7

# sync

同步数据，`sync`函数解决响应数据同步时状态不更新的问题。

在 `gyron` 中负责 `dox` 状态库的数据同步。

```jsx
import { useReactive } from '@linkorgs/runtime'
import { sync } from '@linkorgs/sync'

const target = useReactive({})
const source = {
  foo: {
    bar: {
      baz: ['gyron', 'cool'],
    },
  },
}

sync(target, source)
```
npm package: @linkowlnew/react-native
Description: Attribution tracking for indie iOS developers. Pure JS — works in Expo Go, bare React Native, and web.
Author: LinkOwl
Latest version: 1.0.3

# LinkOwl React Native 🦉

Attribution tracking for indie iOS developers. Know which link drove each install.

**Free to use. £0.02 per attributed purchase.**

## Install

```bash
npm install @linkowl/react-native
```

## Setup (one line)

```javascript
import LinkOwl from '@linkowl/react-native';

// In your App.tsx or App.js, at the top level:
LinkOwl.start("lo_live_xxxx"); // Your API key from linkowl.app
```

That's it. Installs are now tracked.

## RevenueCat Users

```javascript
LinkOwl.setUserId(Purchases.getAppUserID());
```

## Superwall Users

```javascript
LinkOwl.setUserId(Superwall.shared.userId);
```

## For AI Coding Tools

Paste this into **VibeCode**, **Bolt**, **Cursor**, or any AI tool:

> Install @linkowl/react-native with npm. In App.tsx, add: import LinkOwl from '@linkowl/react-native' then call LinkOwl.start("lo_live_xxxx") at the top of the App component. Replace xxxx with my API key.

## API

| Method | Description |
|--------|-------------|
| `LinkOwl.start(apiKey)` | Configure + track install. Call once. |
| `LinkOwl.setUserId(userId)` | Link paywall user for purchase attribution. |
| `LinkOwl.trackPurchase(txnId, revenue, currency)` | Manual purchase tracking. |

## How It Works

1. Create a tracking link at [linkowl.app](https://linkowl.app)
2. Someone clicks it → fingerprint captured → redirected to App Store
3. They install → SDK tracks it → matched to click
4. They purchase → webhook attributes it to the link

## Privacy

- No IDFA / IDFV
- No persistent device IDs
- IPs hashed server-side with daily-rotating salt
- GDPR-safe

## License

MIT