Debug receiver for Node.js — see what your app is doing, instantly.
Send any value from your Node.js app and watch it appear in the Fanar desktop app in real time. Zero dependencies. Works with plain Node, Express, Fastify, and NestJS.
npm install @fanar-app/fanarRequires the Fanar desktop app running on your machine.
import fanar from '@fanar-app/fanar'
// Primitives
fanar('hello world')
fanar(42)
fanar(true)
// Objects — renders as a collapsible JSON tree
fanar({ user, orders, meta })
// Exceptions — renders with clickable stack frames that open in VS Code
fanar(new Error('something went wrong'))
// SQL queries — syntax highlighted, bindings listed, slow queries flagged red
fanar.query('SELECT * FROM users WHERE id = ?', { bindings: [userId], duration: 12 })
// Timers
const t = fanar.time('render')
// ... do work ...
t.stop()
// Named label and color for any payload
fanar(data).label('after transform').color('purple')
// Clear the desktop app
await fanar.clear()Automatically group all fanar() calls within a single request. Register the middleware once:
Express / Fastify
app.use(fanar.middleware())Standalone (no HTTP framework)
fanar.run(() => {
fanar('inside this closure — all calls share a request ID')
})import { FanarModule, FanarTypeOrmLogger, withFanar, Fanar } from '@fanar-app/fanar/nestjs'Module setup:
// Inline config
FanarModule.forRoot({ enabled: true, host: 'localhost', port: 23517 })
// From ConfigService
FanarModule.forRootAsync({
imports: [ConfigModule],
useFactory: (config: ConfigService) => ({
enabled: config.get('NODE_ENV') !== 'production',
}),
inject: [ConfigService],
})Once imported, a global interceptor fires after every request and sends: method, path, status, duration, and query count.
TypeORM — automatic query logging:
// data-source.ts
import { FanarTypeOrmLogger } from '@fanar-app/fanar/nestjs'
export const AppDataSource = new DataSource({
// ...
logger: new FanarTypeOrmLogger(),
})Prisma — automatic query logging:
import { withFanar } from '@fanar-app/fanar/nestjs'
export const prisma = withFanar(
new PrismaClient({ log: [{ emit: 'event', level: 'query' }] })
)Method tracing:
import { Fanar } from '@fanar-app/fanar/nestjs'
@Injectable()
export class OrderService {
@Fanar()
async createOrder(dto: CreateOrderDto) {
// method name, args, return value, and duration sent automatically
}
}fanar.configure({ host: 'localhost', port: 23517 })Or set at startup — the desktop app also accepts FANAR_PORT as an environment variable.
MIT