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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@starkbase/sdk

v0.1.2

Published

The official SDK for [Starkbase](https://starkbase.vercel.app) — a backend-as-a-service for Starknet with built-in schema management, blob storage (EigenDA), NFT/token deployment, event-based proof-of-attendance, and onchain verification.

Readme

@starkbase/sdk

The official SDK for Starkbase — a backend-as-a-service for Starknet with built-in schema management, blob storage (EigenDA), NFT/token deployment, event-based proof-of-attendance, and onchain verification.

Install

npm install @starkbase/sdk

Peer dependencies (React apps):

npm install react react-dom

Quick Start

Vanilla TypeScript / Node.js

import { StarkbaseClient } from '@starkbase/sdk';

const client = new StarkbaseClient({
  apiUrl: 'https://starknet.philotheephilix.in',
  platformId: 'your-platform-id',
  apiKey: 'sb_your_api_key',
});

// Register a user (deploys a Starknet wallet)
const auth = await client.auth.register({
  username: 'alice',
  password: 'securepassword',
});
console.log('Wallet:', auth.walletAddress);

// Set the session token for authenticated requests
client.setSessionToken(auth.sessionToken);

React

import { StarkbaseProvider, useAuth, useSchemas } from '@starkbase/sdk';

function App() {
  return (
    <StarkbaseProvider
      apiUrl="https://starknet.philotheephilix.in"
      platformId="your-platform-id"
      apiKey="sb_your_api_key"
    >
      <MyApp />
    </StarkbaseProvider>
  );
}

Configuration

const client = new StarkbaseClient({
  apiUrl: 'https://starknet.philotheephilix.in', // Backend URL (default)
  platformId: 'uuid',          // Your platform ID
  apiKey: 'sb_...',            // Platform API key
  sessionToken: 'jwt...',     // Optional: restore existing session
});

| Option | Type | Default | Description | |--------|------|---------|-------------| | apiUrl | string | https://starknet.philotheephilix.in | Backend API URL | | platformId | string | — | Platform UUID | | apiKey | string | — | Platform API key (used for auth requests) | | sessionToken | string | — | JWT token to restore a session |


Modules (Vanilla Client)

All modules are accessible as properties on StarkbaseClient:

client.auth        // AuthModule
client.platforms   // PlatformsModule
client.schemas     // SchemasModule
client.blobs       // BlobsModule
client.events      // EventsModule
client.tokens      // TokensModule
client.nfts        // NFTsModule
client.contracts   // ContractsModule
client.storage     // StorageModule
client.query       // QueryModule
client.schema(name) // SchemaCollection (document CRUD for a specific schema)

Auth

Register and login deploy Starknet wallets for users. Sessions are JWT-based.

// Register (deploys a new Starknet wallet)
const result = await client.auth.register({
  username: 'alice',
  password: 'password123',
});
// result: { walletAddress, sessionToken, username, platformId }

// Login
const result = await client.auth.login({
  username: 'alice',
  password: 'password123',
});

// Set session for authenticated requests
client.setSessionToken(result.sessionToken);

// Get current user
const me = await client.auth.me();
// me: { userId, username, platformId, walletAddress }

// List all users in a platform
const users = await client.auth.listUsers('platform-uuid');
// users: [{ userId, username, walletAddress, deployed, createdAt }]

// Logout
await client.auth.logout();
client.clearSessionToken();

React hook:

function LoginForm() {
  const { user, isAuthenticated, isLoading, login, register, logout } = useAuth();

  const handleLogin = async () => {
    await login({ username: 'alice', password: 'password123' });
  };

  if (isLoading) return <p>Loading...</p>;
  if (isAuthenticated) return <p>Welcome, {user.username}!</p>;
  return <button onClick={handleLogin}>Login</button>;
}

Session is automatically restored from localStorage on mount.


Platforms

Platforms are multi-tenant environments. Each platform has its own API key, users, schemas, and data.

// Create a platform
const platform = await client.platforms.create('my-app', '0xCreatorWallet');
// platform: { id, name, apiKey, creatorWallet, createdAt }

// List all platforms
const all = await client.platforms.list();

// List platforms created by a specific wallet
const mine = await client.platforms.listByWallet('0xMyWallet...');

Schemas

Schemas define typed document structures. Documents are stored on EigenDA with optional onchain commitment anchoring.

Define & Create

// Create a schema
const schema = await client.schemas.create(
  'users',
  {
    fields: {
      name: { type: 'string', required: true },
      age: { type: 'number', required: false },
      active: { type: 'boolean', required: true },
    },
  },
  { onchain: true } // Anchor schema commitment onchain
);

// List all schemas
const schemas = await client.schemas.list();

// Get a specific schema
const s = await client.schemas.get('users');

Document CRUD

const users = client.schema('users');

// Upload a document
const doc = await users.upload('alice', {
  name: 'Alice',
  age: 30,
  active: true,
});

// Find by key
const found = await users.find('alice');

// Find all documents
const all = await users.findAll();

// Query with filter
const active = await users.findMany({ active: true });

// Update
const updated = await users.update('alice', {
  name: 'Alice',
  age: 31,
  active: true,
});

// Version history
const versions = await users.history('alice');

// Delete
await users.delete('alice');

Onchain Verification

const result = await client.schemas.verify('users');
// result: {
//   verified: true,
//   commitment: 'sha256...',
//   onchainKey: 'felt252...',
//   txHash: '0x...',
//   onchainWalletAddress: '0x...'
// }

React hook:

function SchemaManager() {
  const { listSchemas, createSchema, getSchema, verifySchema, collection } = useSchemas();

  const handleCreate = async () => {
    await createSchema('products', {
      fields: {
        title: { type: 'string', required: true },
        price: { type: 'number', required: true },
      },
    }, { onchain: true });
  };

  // Use collection for document CRUD
  const products = collection('products');
  const all = await products.findAll();
}

Blobs (File Storage)

Upload files to EigenDA with optional onchain commitment anchoring for immutability.

// Upload a file
const blob = await client.blobs.upload(file, {
  filename: 'photo.png',
  mimeType: 'image/png',
  onchain: true, // Immutable — cannot be deleted
});
// blob: { id, blobId, commitment, filename, mimeType, size, onchain, ... }

// List all blobs
const blobs = await client.blobs.list();

// Get metadata
const meta = await client.blobs.getMeta(blob.id);

// Download raw bytes
const data = await client.blobs.get(blob.id);

// Verify onchain consistency
const result = await client.blobs.verify(blob.id);
// result: { verified, commitment, onchainKey, txHash, onchainWalletAddress }

// Delete (soft-delete; throws 403 if onchain=true)
await client.blobs.delete(blob.id);

React hook:

function FileUploader() {
  const { upload, list, get, verify, delete: remove } = useBlobs();

  const handleUpload = async (file: File) => {
    const blob = await upload(file, { onchain: true });
    console.log('Uploaded:', blob.id);
  };
}

Events (Proof-of-Attendance NFTs)

Deploy event contracts and mint proof-of-attendance NFTs to attendees.

// Create an event (deploys an ERC-721 contract)
const event = await client.events.createEvent(
  'Starknet Hackathon 2026',
  'Annual builder hackathon',
  'https://example.com/banner.png',
  100 // maxSupply (0 = unlimited)
);
// event: { id, contractAddress, txHash, ... }

// List events
const events = await client.events.listEvents();

// Mint NFT to attendee
const mint = await client.events.mint(event.id, '0xRecipientWallet');
// mint: { id, eventId, tokenId, recipient, txHash, mintedAt }

// List mints for an event
const mints = await client.events.listMints(event.id);

React hook:

function EventManager() {
  const { createEvent, listEvents, mint, listMints } = useEvents();

  const handleMint = async (eventId: string, recipient: string) => {
    const result = await mint(eventId, recipient);
    console.log('Minted token #' + result.tokenId);
  };
}

Tokens (ERC-20)

Deploy ERC-20 token contracts and mint tokens.

// Deploy a token contract
const token = await client.tokens.deploy(
  'GameCoin',        // name
  'GMC',             // symbol
  '1000000',         // initialSupply
  '0xRecipient...'   // recipient of initial supply
);
// token: { contractAddress, name, symbol, initialSupply, transactionHash, ... }

// Mint more tokens (owner only)
const result = await client.tokens.mint(
  token.contractAddress,
  '0xRecipient...',
  '5000'
);
// result: { txHash, recipient, amount }

// List deployed tokens
const tokens = await client.tokens.list();

// Get onchain mint history (Transfer events from zero address)
const history = await client.tokens.history(token.contractAddress);
// history: [{ txHash, recipient, amount, blockNumber }]

React hook:

function TokenDashboard() {
  const { deploy, mint, list, history, isLoading, error } = useTokens();

  const handleDeploy = async () => {
    const token = await deploy('GameCoin', 'GMC', '1000000', recipientAddress);
    console.log('Deployed at:', token.contractAddress);
  };
}

NFTs (ERC-721 Collections)

Create NFT collections and mint NFTs with metadata and labels.

// Create a collection
const collection = await client.nfts.createCollection('MyNFTs', 'MNFT', platformId);
// collection: { contractAddress, name, symbol, platformId, transactionHash }

// Mint an NFT
const nft = await client.nfts.mint(
  collection.contractAddress,
  '0xRecipient...',
  {
    name: 'Cool NFT #1',
    description: 'A rare collectible',
    image: 'https://example.com/nft.png',
    attributes: [{ trait_type: 'rarity', value: 'legendary' }],
  },
  ['rare', 'genesis']  // labels
);
// nft: { tokenId, contractAddress, recipient, transactionHash }

// Add labels to existing NFT
await client.nfts.addLabels(collection.contractAddress, nft.tokenId, ['featured']);

React hook:

function NFTMinter() {
  const { createCollection, mint, addLabels, isLoading, error } = useNFTs();
}

Contracts (Smart Contract Records)

Deploy contracts from schema definitions and store records onchain.

// Deploy a contract
const contract = await client.contracts.deploy(schemaDefinition, '0xOwner');

// Create a record
const record = await client.contracts.createRecord(contract.contractAddress, {
  name: 'Alice',
  score: 100,
});

// Get a record
const r = await client.contracts.getRecord(contract.contractAddress, record.id);

// Get contract schema
const schema = await client.contracts.getSchema(contract.contractAddress);

Storage (Raw EigenDA Blobs)

Low-level blob storage on EigenDA.

// Upload raw bytes
const result = await client.storage.upload(
  new Uint8Array([1, 2, 3]),
  'application/octet-stream'
);
// result: { blobId, commitment, dataHash, size }

// Download
const data = await client.storage.get(result.blobId);

// Verify integrity
const valid = await client.storage.verify(result.blobId, result.commitment, result.dataHash);

// Get metadata
const meta = await client.storage.getMetadata(result.blobId);

Query

GraphQL and paginated queries over contract data.

// GraphQL query
const result = await client.query.graphql<{ users: User[] }>(
  '{ users { id name } }'
);

// Paginated records
const page = await client.query.getRecords(contractAddress, {
  limit: 10,
  offset: 0,
  orderBy: 'createdAt',
  orderDirection: 'desc',
});
// page: { items, total, limit, offset }

React Hooks Summary

| Hook | Description | |------|-------------| | useAuth() | Authentication state + login, register, logout | | useSchemas() | Schema CRUD + collection(name) for document ops | | useBlobs() | File upload/download/verify via EigenDA | | useEvents() | Event creation + NFT minting | | useTokens() | ERC-20 deploy/mint/history | | useNFTs() | ERC-721 collection/mint/labels | | useContracts() | Smart contract deploy/records | | useStorage() | Raw blob storage | | useQuery() | GraphQL + paginated queries |

All hooks must be used inside <StarkbaseProvider>.


Full Example

import {
  StarkbaseProvider,
  useAuth,
  useSchemas,
  useBlobs,
  useEvents,
  useTokens,
} from '@starkbase/sdk';

function App() {
  return (
    <StarkbaseProvider
      apiUrl="https://starknet.philotheephilix.in"
      platformId="your-platform-id"
      apiKey="sb_your_api_key"
    >
      <Dashboard />
    </StarkbaseProvider>
  );
}

function Dashboard() {
  const { user, isAuthenticated, login } = useAuth();
  const { listSchemas, createSchema, collection } = useSchemas();
  const { upload, list: listBlobs } = useBlobs();
  const { createEvent, mint: mintNFT } = useEvents();
  const { deploy: deployToken, mint: mintToken } = useTokens();

  if (!isAuthenticated) {
    return (
      <button onClick={() => login({ username: 'admin', password: 'pass' })}>
        Login
      </button>
    );
  }

  return <div>Welcome, {user?.username}!</div>;
}

License

MIT