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

qrverse

v1.0.1

Published

A comprehensive QR code generation framework with advanced features including dynamic QR codes, analytics, security, and customization

Readme

QRVerse 🎯

npm version License: MIT TypeScript

A comprehensive QR code generation framework with advanced features including dynamic QR codes, analytics, security, and extensive customization options.

✨ Features

  • 🔄 Static & Dynamic QR Codes - Generate traditional static QR codes or dynamic ones with changeable destinations
  • 🔐 Security Features - Password protection and AES encryption for sensitive data
  • Expiration Control - Set expiration dates for time-sensitive QR codes
  • 🎨 Visual Customization - Colors, gradients, logos, frames, and various shapes
  • 📱 Pre-built Templates - 12+ beautiful templates ready to use
  • 📊 Analytics Dashboard - Track scans, locations, devices, and performance metrics
  • 📧 Automated Reports - Schedule daily, weekly, or monthly email reports
  • 🎫 Single-Use Codes - Perfect for tickets, coupons, and vouchers
  • 🌍 Geographic Tracking - Track scan locations by country, region, and city
  • 📱 Device Detection - Identify device types, OS, and browsers
  • 🔒 Encryption Support - Encrypt QR code content with custom keys
  • Batch Processing - Generate multiple QR codes efficiently

🚀 Quick Start

Installation

npm install qrverse

Basic Usage

import QRVerse from 'qrverse';

// Initialize QRVerse
const qrverse = new QRVerse({
  baseUrl: 'https://your-domain.com',
  analytics: {
    enabled: true,
    trackLocation: true,
    trackDevice: true,
  },
});

// Generate a simple QR code
const result = await qrverse.generateQR({
  data: 'https://example.com',
  size: 300,
});

console.log('QR Code generated:', result.id);
// result.qrCode contains the PNG buffer

📖 Comprehensive Examples

1. Static QR Code with Customization

const customQR = await qrverse.generateQR({
  data: 'https://mywebsite.com',
  type: 'static',
  size: 400,
  customization: {
    foregroundColor: '#2C3E50',
    backgroundColor: '#ECF0F1',
    logo: {
      src: './logo.png',
      size: 60,
      margin: 10,
    },
    frame: {
      type: 'rounded',
      color: '#3498DB',
      thickness: 5,
    },
    dotStyle: 'circle',
    shape: 'rounded',
  },
});

2. Dynamic QR Code with Security

const dynamicQR = await qrverse.generateQR({
  data: 'https://changeable-destination.com',
  type: 'dynamic',
  security: {
    password: 'mySecretPassword',
    encryption: true,
    encryptionKey: 'my-custom-key-32-chars-long',
  },
  expiration: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30 days
});

// Later, update the destination
await qrverse.updateDynamicQR(dynamicQR.id, 'https://new-destination.com');

3. Using Templates

// Get all available templates
const templates = qrverse.getTemplates();

// Use a pre-built template
const templateQR = await qrverse.generateQR({
  data: 'https://business-site.com',
  template: 'corporate-gray',
  customization: {
    logo: {
      src: './company-logo.png',
      size: 50,
    },
  },
});

// Get business-specific templates
const businessTemplates = qrverse.getBusinessTemplates();

4. Single-Use QR Code for Tickets

const ticketQR = await qrverse.generateQR({
  data: 'TICKET-12345',
  singleUse: true,
  template: 'golden-luxury',
  expiration: new Date('2024-12-31T23:59:59Z'),
  security: {
    encryption: true,
  },
});

5. Batch Generation

const batchOptions = [
  { data: 'https://product1.com', template: 'modern-blue' },
  { data: 'https://product2.com', template: 'vibrant-sunset' },
  { data: 'https://product3.com', template: 'forest-green' },
];

const batchResults = await qrverse.generateBatch(batchOptions);
console.log(`Generated ${batchResults.length} QR codes`);

📊 Analytics & Tracking

Recording Scans

// Record a scan (typically called from your redirect endpoint)
const scanRecorded = await qrverse.recordScan(
  qrId,
  req.ip,
  req.headers['user-agent']
);

Getting Analytics

// Get analytics for a specific QR code
const analytics = await qrverse.getAnalytics(qrId);
console.log({
  totalScans: analytics.totalScans,
  uniqueScans: analytics.uniqueScans,
  scansByDate: analytics.scansByDate,
  scansByLocation: analytics.scansByLocation,
  scansByDevice: analytics.scansByDevice,
});

// Get top performers
const topQRs = await qrverse.getTopPerformers(10);

// Get scan trends
const trends = await qrverse.getScanTrends(30); // Last 30 days

// Get geographic distribution
const geoDistribution = await qrverse.getGeographicDistribution();

📧 Automated Reports

Setup Email Configuration

const qrverse = new QRVerse({
  email: {
    service: 'gmail', // or 'outlook', 'yahoo', etc.
    user: '[email protected]',
    pass: 'your-app-password',
  },
});

Schedule Reports

// Schedule a weekly report
qrverse.scheduleReport('weekly-report', {
  frequency: 'weekly',
  email: '[email protected]',
  qrIds: ['qr1', 'qr2', 'qr3'], // Optional: specific QR codes
  includeCharts: true,
});

// Generate immediate report
await qrverse.generateReport({
  frequency: 'daily',
  email: '[email protected]',
});

// Generate CSV export
const csvData = await qrverse.generateCSVReport({
  frequency: 'monthly',
  email: '[email protected]',
});

🎨 Available Templates

QRVerse comes with 12+ pre-built templates:

  • classic - Traditional black and white
  • modern-blue - Clean blue gradient with rounded corners
  • vibrant-sunset - Warm sunset gradient with circular design
  • corporate-gray - Professional gray theme for business
  • neon-purple - Futuristic neon purple with glow effect
  • forest-green - Natural green theme inspired by nature
  • ocean-blue - Deep ocean blue with wave-like gradient
  • fire-red - Bold red gradient with dynamic energy
  • golden-luxury - Elegant gold gradient for premium brands
  • minimalist - Clean and simple design
  • retro-wave - 80s inspired neon colors
  • pastel-dream - Soft pastel colors for gentle look
// Create custom template
const customTemplate = qrverse.createCustomTemplate(
  'my-brand',
  'My Brand Template',
  'Custom template for my brand',
  {
    gradient: {
      type: 'linear',
      colors: ['#FF6B6B', '#4ECDC4'],
      direction: 45,
    },
    frame: {
      type: 'rounded',
      color: '#FF6B6B',
      thickness: 4,
    },
  }
);

🔐 Security Features

Password Protection

const protectedQR = await qrverse.generateQR({
  data: 'Sensitive information',
  security: {
    password: 'strongPassword123',
  },
});

// Verify password when scanning
const verifiedData = qrverse.verifyPassword(protectedData, 'strongPassword123');

Encryption

const encryptedQR = await qrverse.generateQR({
  data: 'Top secret data',
  security: {
    encryption: true,
    encryptionKey: 'your-32-character-encryption-key',
  },
});

// Decrypt data
const decryptedData = qrverse.decrypt(encryptedData, 'your-32-character-encryption-key');

🛠️ Configuration Options

interface QRVerseConfig {
  baseUrl?: string; // Base URL for dynamic QR codes
  database?: DatabaseConfig; // Database configuration
  analytics?: {
    enabled: boolean;
    trackLocation: boolean;
    trackDevice: boolean;
  };
  security?: {
    defaultEncryption: boolean;
    hashAlgorithm: string;
  };
  email?: EmailConfig; // Email configuration for reports
}

🎯 Use Cases

E-commerce

  • Product QR codes with analytics
  • Dynamic pricing and promotions
  • Inventory tracking

Events & Tickets

  • Single-use ticket validation
  • Event check-in systems
  • Promotional campaigns

Marketing

  • Campaign performance tracking
  • A/B testing with different designs
  • Geographic market analysis

Business Cards

  • Dynamic contact information
  • Professional templates
  • Analytics on networking effectiveness

Restaurants

  • Digital menus with analytics
  • Table-specific QR codes
  • Promotional offers tracking

📚 API Reference

Core Methods

generateQR(options: QRCodeOptions): Promise<QRCodeResult>

Generate a QR code with specified options.

updateDynamicQR(id: string, newDestination: string): Promise<boolean>

Update the destination URL of a dynamic QR code.

recordScan(qrId: string, ip: string, userAgent: string): Promise<boolean>

Record a QR code scan for analytics.

Analytics Methods

getAnalytics(qrId: string): Promise<AnalyticsData | null>

Get comprehensive analytics for a QR code.

getTopPerformers(limit?: number): Promise<AnalyticsData[]>

Get the best performing QR codes.

getScanTrends(days?: number): Promise<Record<string, number>>

Get scan trends over time.

Template Methods

getTemplates(): Template[]

Get all available templates.

getTemplate(id: string): Template | null

Get a specific template by ID.

createCustomTemplate(id: string, name: string, description: string, customization: QRCustomization): Template

Create a custom template.

Security Methods

encrypt(data: string, key?: string): string

Encrypt data with optional custom key.

decrypt(encryptedData: string, key: string): string

Decrypt previously encrypted data.

verifyPassword(protectedData: string, password: string): string | null

Verify password for protected data.

🧪 Testing

npm test

🏗️ Building

npm run build

📝 Examples Repository

Check out our examples repository for complete implementation examples:

  • Express.js server integration
  • React frontend components
  • Next.js full-stack application
  • Analytics dashboard
  • Batch processing scripts

🤝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

Development Setup

git clone https://github.com/julioamorimdev/qrverse.git
cd qrverse
npm install
npm run dev

Running Tests

npm test
npm run test:coverage

Code Style

We use ESLint and Prettier for code formatting:

npm run lint
npm run lint:fix

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🆘 Support

🙏 Acknowledgments

  • qrcode - Core QR code generation
  • canvas - Image manipulation
  • sharp - High-performance image processing
  • crypto-js - Cryptographic functions

🔄 Changelog

See CHANGELOG.md for a detailed history of changes.

🚀 Roadmap

  • [ ] React/Vue/Angular components
  • [ ] WebAssembly support for better performance
  • [ ] Machine learning for QR code optimization
  • [ ] Blockchain integration for verification
  • [ ] Mobile SDK (React Native, Flutter)
  • [ ] Advanced analytics with AI insights

Made with ❤️ by the QRVerse Team

If you find QRVerse useful, please consider giving it a ⭐ on GitHub!