npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@inlang/sdk

v2.4.8

Published

[![NPM Downloads](https://img.shields.io/npm/dw/%40inlang%2Fsdk?logo=npm&logoColor=red&label=npm%20downloads)](https://www.npmjs.com/package/@inlang/sdk) [![Discord](https://img.shields.io/discord/897438559458430986?style=flat&logo=discord&labelColor=whit

Downloads

781,938

Readme

Inlang file format SDK

NPM Downloads Discord

Outline

Introduction

The inlang SDK is the official specification and parser for .inlang files.

.inlang files are designed to become the open standard for i18n and enable interoperability between i18n solutions. Such solutions involve apps like Fink, libraries like Paraglide JS, or plugins that extend inlang.

Core Features

  • 📁 File-based: Interoperability without cloud integrations or lock-in.
  • 🖊️ CRUD API: Query messages with SQL.
  • 🧩 Plugin System: Extend the capabilities with plugins.
  • 📦 Import/Export: Import and export messages in different file formats.
  • Change control: Collaboration, change proposals, reviews, and automation.

Getting Started

[!Note] Inlang files can be unpacked and stored as directories. The long-term goal is to have portable .inlang files. Hence, the documentation refers to files instead of directories.

Installation

npm install @inlang/sdk

Loading an inlang file

import { loadProjectInMemory, newProject } from "@inlang/sdk";

const project = await loadProjectInMemory({
  blob: await newProject()
});

// query the project
project.*

Next steps

Go to the API reference to learn how to query messages, changes, and save the project.

Plugins

The inlang SDK supports plugins to extend its functionality.

Plugins can be used to import/export messages in different formats, add custom validation rules, and implement specialized workflows.

Available Plugins

Find available plugins on https://inlang.com/c/plugins.

Creating a Plugin

Getting started

Implement the InlangPlugin type.

Examples can be found here. Particulary the message format plugin is a good starting point.

const myPlugin: InlangPlugin = {
  key: "my-plugin",
  importFiles: () => {
    // Import files logic
  },
  exportFiles: () => {
    // Export files logic
  },
};

Deploying a plugin

[!NOTE]
Why is a CDN requires instead of using npm to use plugins?

Non-JS projects (Android, iOS, etc.) wouldn't be able to use inlang, and browser-based apps like Fink couldn't load plugins.

npx @inlang/cli plugin build --entry ./src/plugin.js 

We recommend uploading the plugin to NPM which makes it automatically available on JSDelivr and enables users to pin the version of your plugin.

https://cdn.jsdelivr.net/npm/my-plugin@1/dist/index.js

API reference

Creating a new project

import { newProject } from "@inlang/sdk";

// Create a new project
const file = await newProject();

// write the file anywhere you want
await fs.writeFile("./project.inlang", file);

Loading a project

import { loadProjectInMemory } from "@inlang/sdk";

const file = await fs.readFile("./project.inlang");

// Load a project from a directory
const project = await loadProjectInMemory({
  blob: file
});

Querying a project

// Accessing settings and plugins
const settings = await project.settings.get();
const plugins = await project.plugins.get();

// Querying messages
const messages = await project.db
  .selectFrom("message")
  .selectAll()
  .execute();

console.log(messages);

Querying changes

[!NOTE]
The inlang plugin for lix is work in progress. If you stumble on issues, please open an issue on the GitHub.

The inlang file format uses lix for change control. The lix APIs are exposed via project.lix.*. Visit the lix documentation for more information on how to query changes.

const changes = await project.lix.db
  .selectFrom("change")
  .selectAll()
  .execute();

Saving a project

const newFile = await project.toBlob();

await fs.writeFile("./project.inlang", newFile);

Importing and exporting translation files

The import and export of messages depends on the installed plugins. The following example shows how to import and export messages using a plugin that supports JSON files.

const file = await fs.readFile("./en.json");

// Import files
await project.importFiles({
  pluginKey: "plugin.inlang.messageFormat",
  files: [
    { locale: "en", content: file },
  ],
});

// Export files
const files = await project.exportFiles({
  pluginKey: "plugin.inlang.messageFormat"
});

await fs.writeFile("./en.json", files[0].content);

Installing plugins

const settings = await project.settings.get();

settings.modules.push(
  "https://cdn.jsdelivr.net/npm/@inlang/plugin-i18next@latest/dist/index.js"
)

await project.settings.set(settings)

Unpacked inlang files (directories)

[!NOTE]
Unpacked inlang files are a workaround to store inlang files in git.

Git can't handle binary files. If you don't intend to store the inlang file in git, do not use unpacked inlang files.

Unpacked inlang files are not portable. They depent on plugins that and do not persist lix change control data.

import { 
    loadProjectFromDirectory, 
    saveProjectToDirectory 
} from "@inlang/sdk";

const project = await loadProjectFromDirectory({
    "path": "./project.inlang"
});

// modify the project

await saveProjectToDirectory({
    "project": project,
    "path": "./project.inlang"
});

Listing on inlang.com

To list your app/plugin on inlang.com, please open a pull request to the registry.json file.

Make sure that the link you are contributing points to a marketplace-manifest.json file. An example of can be found here