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

luhux-card

v2.2.8

Published

Şık alıntı kartları ve Spotify kartları oluşturur — Chromium indirmez, kurulu Chrome'u kullanır.

Readme

Headless Chrome kullanarak alıntı kartları, Spotify kartları ve rank/seviye kartları PNG buffer olarak üretir. Discord botları için yapıldı, her Node projesinde çalışır.


Önizleme

Alıntı Kartı — Sinema Stili

Sinema

Alıntı Kartı — Poster Stili

Poster

Alıntı Kartı — Minimal Stili

Minimal

Spotify Kartı

Spotify

Rank Kartı

Rank


Kurulum

npm install luhux-card

puppeteer-core kullanır — Chromium indirmez, bilgisayarındaki kurulu Chrome'u otomatik bulur. Chrome kurulu değilse PUPPETEER_EXECUTABLE_PATH ortam değişkeniyle yolu belirtebilirsin.


Alıntı Kartı

Hızlı başlangıç

import { generateQuoteCard } from 'luhux-card';
import fs from 'fs';

const buffer = await generateQuoteCard({
    avatarUrl: 'https://cdn.discordapp.com/avatars/.../avatar.png',
    displayName: 'luhux1337',
    username: 'luhux',
    text: 'selamun aleyküm :D',
    style: 'cinema',       // 'cinema' | 'poster' | 'minimal'
    accent: '#10b981',
    bg: '#0a0a0f',
    fontKey: 'inter',
    watermark: 'my-bot.dev',
});

fs.writeFileSync('quote.png', buffer);

Tekrarlı render (Discord butonları)

Kullanıcı butonlarla stil/renk değiştiriyorsa QuoteCardRenderer kullan — browser'ı açık tutar, her render çok daha hızlı olur.

import { QuoteCardRenderer } from 'luhux-card';

const renderer = new QuoteCardRenderer();

// Her buton tıklamasında:
const buffer = await renderer.render(state);

// Collector bittiğinde:
await renderer.close();

Discord.js örneği

import { QuoteCardRenderer, type QuoteCardOptions } from 'luhux-card';
import { AttachmentBuilder } from 'discord.js';

const renderer = new QuoteCardRenderer();

const state: QuoteCardOptions = {
    avatarUrl: user.displayAvatarURL({ size: 512, extension: 'png' }),
    displayName: user.globalName ?? user.username,
    username: user.username,
    text: interaction.options.getString('text', true),
    style: 'cinema',
};

const buf = await renderer.render(state);
await interaction.reply({ files: [new AttachmentBuilder(buf, { name: 'quote.png' })] });

await renderer.close();

Seçenekler (QuoteCardOptions)

| Seçenek | Tip | Varsayılan | Açıklama | |---|---|---|---| | avatarUrl | string | — | zorunlu | | displayName | string | — | zorunlu | | username | string | — | zorunlu, @kullaniciadi olarak gösterilir | | text | string | — | zorunlu, alıntı metni | | style | 'cinema' \| 'poster' \| 'minimal' | 'cinema' | | | fontKey | FONTS içindeki bir anahtar | 'inter' | aşağıya bak | | customFont | { label, css, family } | — | kendi Google Font'unu kullanmak için | | bg | hex renk | #0a0a0f | arka plan rengi | | accent | hex renk | #10b981 | vurgu / gradient rengi | | tc | hex renk | #f0ece4 | metin rengi (poster ve minimal stilleri) | | fontSize | number | 22 | temel boyut; sinema modunda metin uzunluğuna göre otomatik ölçeklenir | | dim | number (10–90) | 55 | fotoğrafın karartılma miktarı | | watermark | string | 'luhux-card' | sinema stilinde sol alt köşedeki yazı | | width / height | number | 920 / 460 | tuval boyutu | | scale | number | 2 | ekran görüntüsü ölçek çarpanı (netlik / hız dengesi) |

Hazır presetler

import { FONTS, ACCENT_COLORS, BG_COLORS, TEXT_COLORS } from 'luhux-card';

Object.keys(FONTS);
// 'cormorant' | 'playfair' | 'eb' | 'cinzel' | 'raleway' | 'inter' | 'mono' | 'baloo'

Object.keys(ACCENT_COLORS);
// 'Altın' | 'Gümüş' | 'Mor' | 'Mavi' | 'Yeşil' | 'Kırmızı'

Spotify Kartı

Spotify "şu an çalıyor" kartı — albüm kapağı, blur arka plan, progress bar ve öneri listesiyle.

Hızlı başlangıç

import { generateSpotifyCard } from 'luhux-card';
import fs from 'fs';

const buffer = await generateSpotifyCard({
    title: 'Şarkı Adı',
    artist: 'Sanatçı',
    album: 'Albüm Adı',
    cover: 'https://i.scdn.co/image/...',
    username: 'luhux',
    startTime: Date.now() - 60_000,
    endTime: Date.now() + 180_000,
    recommendations: [
        { name: 'Başka Şarkı', artists: 'Başka Sanatçı', url: 'https://open.spotify.com/track/...' },
    ],
});

fs.writeFileSync('spotify.png', buffer);

Discord.js örneği (presence üzerinden)

import { generateSpotifyCard } from 'luhux-card';
import { AttachmentBuilder, ActivityType } from 'discord.js';

const status = member.presence?.activities?.find(
    a => a.name === 'Spotify' && a.type === ActivityType.Listening
);

if (status) {
    const albumArt = `https://i.scdn.co/image/${status.assets?.largeImage?.slice(8)}`;

    const buf = await generateSpotifyCard({
        title: status.details ?? '',
        artist: status.state ?? '',
        album: status.assets?.largeText ?? '',
        cover: albumArt,
        username: member.displayName,
        startTime: status.timestamps?.start ?? Date.now(),
        endTime: status.timestamps?.end ?? Date.now(),
    });

    await interaction.reply({
        files: [new AttachmentBuilder(buf, { name: 'spotify.png' })],
    });
}

Seçenekler (GenerateSpotifyCardOptions)

| Seçenek | Tip | Varsayılan | Açıklama | |---|---|---|---| | title | string | — | zorunlu, şarkı adı | | artist | string | — | zorunlu, sanatçı adı | | album | string | '' | albüm adı | | cover | string \| Buffer | — | albüm kapağı URL, base64 data URL veya dosya yolu | | username | string | 'Kullanıcı' | dinleyen kişinin adı | | startTime | number \| Date | — | şarkının başladığı zaman (timestamp) | | endTime | number \| Date | — | şarkının biteceği zaman (timestamp) | | progressMs | number | — | geçen süre ms (startTime/endTime yerine kullanılabilir) | | durationMs | number | — | toplam süre ms (startTime/endTime yerine kullanılabilir) | | recommendations | SpotifyCardRecommendation[] | [] | benzer şarkı önerileri (en fazla 3) | | theme | SpotifyCardTheme | — | renk özelleştirme | | theme.accent | string | '#1DB954' | Spotify yeşili (progress bar rengi) | | theme.accentLight | string | '#20e565' | progress bar gradient sonu | | theme.background | string | '#0f0f0f' | kart arka plan rengi | | labels | SpotifyCardLabels | — | metin özelleştirme | | labels.nowPlaying | string | 'Şu anda çalıyor' | badge yazısı | | labels.listener | string | 'Dinleyen' | dinleyen etiketi | | labels.suggestions | string | 'Benzer Şarkı Önerileri' | öneri başlığı | | width | number | 780 | kart genişliği | | scale | number | 2 | ekran görüntüsü ölçek çarpanı | | outputPath | string | — | belirtilirse dosyaya da kaydeder |


Rank Kartı

Kullanıcı seviye/XP kartı — avatar, sunucu sırası, istatistikler, XP progress bar ve rozetlerle.

Hızlı başlangıç

import { generateRankCard } from 'luhux-card';
import fs from 'fs';

const buffer = await generateRankCard({
    displayName: 'luhux1337',
    username: 'luhux',
    rank: 4,
    level: 38,
    xp: 72_450,
    levelStartXp: 50_000,
    nextLevelXp: 100_000,
    messageCount: 1284,
    voiceHours: 62,
    streak: 14,
    accent: '#7c3aed',
    badges: [
        { label: 'Aktif Üye',     color: 'purple', emoji: '⚡' },
        { label: 'Top 10',        color: 'gold',   emoji: '🏆' },
        { label: 'Sohbet Ustası', color: 'blue',   emoji: '💬' },
        { label: 'Ses Dostu',     color: 'green',  emoji: '🎵' },
    ],
});

fs.writeFileSync('rank.png', buffer);

Discord.js örneği

import { generateRankCard } from 'luhux-card';
import { AttachmentBuilder } from 'discord.js';

const buf = await generateRankCard({
    avatarUrl: member.displayAvatarURL({ size: 512, extension: 'png' }),
    displayName: member.displayName,
    username: member.user.username,
    rank: 4,           
    level: 38,
    xp: 72_450,
    levelStartXp: 50_000,
    nextLevelXp: 100_000,
    messageCount: 1284,
    voiceHours: 62,
    streak: 14,
    accent: '#7c3aed',
});

await interaction.reply({
    files: [new AttachmentBuilder(buf, { name: 'rank.png' })],
});

Seçenekler (RankCardOptions)

| Seçenek | Tip | Varsayılan | Açıklama | |---|---|---|---| | displayName | string | — | zorunlu, görünen ad | | level | number | — | zorunlu, mevcut seviye | | xp | number | — | zorunlu, mevcut toplam XP | | nextLevelXp | number | — | zorunlu, sonraki seviye için gereken XP | | avatarUrl | string | — | avatar URL (yoksa baş harf gösterilir) | | username | string | — | @handle olarak gösterilir | | rank | number | — | sunucu sırası | | levelStartXp | number | 0 | bu seviyenin başlangıç XP'si | | messageCount | number | — | toplam mesaj sayısı | | voiceHours | number | — | toplam ses saati | | streak | number | — | günlük aktiflik serisi | | badges | RankCardBadge[] | — | rozetler (aşağıya bak) | | accent | hex renk | '#7c3aed' | kart accent rengi | | width | number | 780 | kart genişliği | | scale | number | 2 | ekran görüntüsü ölçek çarpanı | | outputPath | string | — | belirtilirse dosyaya da kaydeder |

Rozetler (RankCardBadge)

| Alan | Tip | Açıklama | |---|---|---| | label | string | rozet yazısı | | color | 'purple' \| 'gold' \| 'blue' \| 'green' \| 'red' | rozet rengi | | emoji | string | isteğe bağlı emoji |


Lisans

MIT © Utku 'luhux' KÖSEM