Skip to content
Knack Exporter logo

Knack Exporter

Creates shareable and compliant stakeholder reports in multiple formats (PDF, CSV, JSON, Excel, HTML). Supports NCDIT submissions, board presentati...

SKILL.md

Full skill instructions

Knack Exporter

Purpose

Creates shareable and compliant stakeholder reports in multiple formats (PDF, CSV, JSON, Excel, HTML). Supports NCDIT submissions, board presentations, and donor communications.

Core Functions

export_pdf

Purpose: Generate branded PDF reports for formal submissions

Parameters:

  • report (object, required): Report data structure
  • filename (string, required): Output filename
  • template (string, optional): "ncdit_compliance" | "board_summary" | "donor_impact"
  • branding (boolean, optional): Apply HTI colors/​logo (default: true)

Example:

const pdf = await export_pdf({
  report: await generate_quarterly_report("Q1", "2025"),
  filename: "HTI_Q1_2025_Report.pdf",
  template: "ncdit_compliance",
  branding: true
});

PDF Generation Libraries:

// Option 1: Puppeteer (HTML → PDF)
import puppeteer from 'puppeteer';

async function generate_pdf_from_html(html, filename) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setContent(html);
  await page.pdf({
    path: filename,
    format: 'Letter',
    margin: { top: '0.5in', bottom: '0.5in', left: '0.5in', right: '0.5in' },
    printBackground: true
  });
  await browser.close();
}

// Option 2: jsPDF (programmatic)
import jsPDF from 'jspdf';

function generate_pdf_programmatic(data, filename) {
  const doc = new jsPDF();

  // Add HTI branding
  doc.setFontSize(20);
  doc.setTextColor('#0E2240'); // Navy Blue
  doc.text('HUBZone Technology Initiative', 20, 20);

  // Add content
  doc.setFontSize(12);
  doc.text(`Q1 2025 Quarterly Report`, 20, 40);
  doc.text(`Laptops Acquired: ${data.acquired}`, 20, 50);
  doc.text(`Devices Converted: ${data.converted}`, 20, 60);

  doc.save(filename);
}

export_csv

Purpose: Export raw data for Excel analysis or data pipelines

Parameters:

  • records (array, required): Array of record objects
  • filename (string, required): Output filename
  • columns (array, optional): Which fields to include (default: all)
  • delimiter (string, optional): "," | ";" | "\t" (default: ",")

Example:

const csv = await export_csv({
  records: await fetch_all_pages("object_1"),
  filename: "HTI_All_Devices_2025.csv",
  columns: ["id", "serial_number", "donor", "status", "county", "acquisition_date"],
  delimiter: ","
});

Implementation:

import { stringify } from 'csv-stringify/​sync';

function export_csv({ records, filename, columns, delimiter = ',' }) {
  const csv_data = stringify(records, {
    header: true,
    columns: columns || Object.keys(records[0]),
    delimiter: delimiter
  });

  fs.writeFileSync(filename, csv_data);
  return { filename, rows: records.length };
}

export_json

Purpose: Export structured data for API consumption or archival

Parameters:

  • dataset (object, required): Data to export
  • filename (string, optional): Save to file (default: return string)
  • pretty (boolean, optional): Human-readable formatting (default: true)

Example:

const json = await export_json({
  dataset: {
    metadata: { quarter: "Q1", year: "2025" },
    metrics: await generate_metrics({ fields: ["acquired", "converted"] }),
    records: await fetch_all_pages("object_1")
  },
  filename: "HTI_Q1_2025_Data.json",
  pretty: true
});

Implementation:

function export_json({ dataset, filename, pretty = true }) {
  const json_string = JSON.stringify(dataset, null, pretty ? 2 : 0);

  if (filename) {
    fs.writeFileSync(filename, json_string);
    return { filename, size_kb: (json_string.length / 1024).toFixed(2) };
  }

  return json_string;
}

export_excel

Purpose: Generate Excel workbooks with multiple sheets and formatting

Parameters:

  • workbook (object, required): Multi-sheet workbook structure
  • filename (string, required): Output filename (.xlsx)
  • formatting (object, optional): Cell styles, colors, formulas

Example:

const excel = await export_excel({
  workbook: {
    sheets: [
      {
        name: "Summary",
        data: [
          ["Metric", "Value"],
          ["Laptops Acquired", 875],
          ["Devices Converted", 623],
          ["Conversion Rate", "71.2%"]
        ]
      },
      {
        name: "All Devices",
        data: await fetch_all_pages("object_1")
      },
      {
        name: "By County",
        data: await county_breakdown()
      }
    ]
  },
  filename: "HTI_Q1_2025_Workbook.xlsx",
  formatting: {
    header_style: {
      fill: { fgColor: { rgb: "0E2240" } },
      font: { color: { rgb: "FFFFFF" }, bold: true }
    }
  }
});

Implementation:

import ExcelJS from 'exceljs';

async function export_excel({ workbook, filename, formatting }) {
  const wb = new ExcelJS.Workbook();

  workbook.sheets.forEach(sheet_def => {
    const sheet = wb.addWorksheet(sheet_def.name);

    // Add data
    sheet.addRows(sheet_def.data);

    // Apply header formatting
    const header_row = sheet.getRow(1);
    header_row.font = { bold: true, color: { argb: 'FFFFFFFF' } };
    header_row.fill = {
      type: 'pattern',
      pattern: 'solid',
      fgColor: { argb: 'FF0E2240' } // HTI Navy
    };

    // Auto-size columns
    sheet.columns.forEach(column => {
      column.width = 15;
    });
  });

  await wb.xlsx.writeFile(filename);
  return { filename, sheets: workbook.sheets.length };
}

export_html

Purpose: Generate HTML reports for emails or web embedding

Parameters:

  • report (object, required): Report data
  • template (string, required): HTML template name
  • inline_css (boolean, optional): Embed CSS (for email) (default: true)

Example:

const html = await export_html({
  report: await generate_quarterly_report("Q1", "2025"),
  template: "donor_impact_email",
  inline_css: true
});

// Send via email
await sendEmail({
  to: "[email protected]",
  subject: "HTI Q1 2025 Impact Report",
  html: html
});

Template Example:

function render_donor_impact_email(data) {
  return `
    <!DOCTYPE html>
    <html>
    <head>
      <style>
        body { font-family: Arial, sans-serif; color: #0E2240; }
        .header { background: #0E2240; color: white; padding: 20px; }
        .metric { font-size: 48px; color: #6FC3DF; font-weight: bold; }
        .label { font-size: 14px; color: #666; }
      </​style>
    </​head>
    <body>
      <div class="header">
        <h1>Your Impact This Quarter</​h1>
      </​div>
      <div style="padding: 20px;">
        <p>Thanks to your generous donation, HTI was able to:</​p>

        <div style="text-align: center; margin: 30px 0;">
          <div class="metric">${data.acquired}</​div>
          <div class="label">Laptops Acquired</​div>
        </​div>

        <div style="text-align: center; margin: 30px 0;">
          <div class="metric">${data.converted}</​div>
          <div class="label">Chromebooks Created</​div>
        </​div>

        <div style="text-align: center; margin: 30px 0;">
          <div class="metric">${data.train_hours}</​div>
          <div class="label">Training Hours Delivered</​div>
        </​div>

        <p><strong>Every device makes a difference.</​strong> Thank you for being part of HTI's mission to bridge the digital divide.</​p>
      </​div>
    </​body>
    </​html>
  `;
}

Report Templates

NCDIT Compliance Template (PDF)

const ncdit_template = {
  sections: [
    {
      title: "Grant Information",
      fields: ["grant_id", "organization", "reporting_period"]
    },
    {
      title: "Device Acquisition & Conversion",
      fields: ["acquired", "converted", "conversion_rate"],
      chart: "acquisition_trend"
    },
    {
      title: "Geographic Distribution",
      fields: ["counties_served", "county_breakdown"],
      chart: "county_bar_chart"
    },
    {
      title: "Training & Education",
      fields: ["train_hours", "participants", "sessions"]
    },
    {
      title: "Progress Toward Goals",
      fields: ["goal_comparison"],
      chart: "progress_bars"
    }
  ],
  branding: {
    header_color: "#0E2240",
    accent_color: "#6FC3DF",
    logo: "hti_logo.png",
    footer: "HUBZone Technology Initiative | NCDIT Digital Champion Grantee"
  }
};

Board Summary Template (PDF)

const board_template = {
  sections: [
    { title: "Executive Summary", type: "text" },
    { title: "Key Metrics", type: "kpi_grid" },
    { title: "Operational Highlights", type: "bullet_list" },
    { title: "Financial Summary", type: "table" },
    { title: "Challenges & Risks", type: "callout" },
    { title: "Next Quarter Priorities", type: "numbered_list" }
  ],
  branding: {
    full_hti_branding: true,
    page_numbers: true,
    confidential_watermark: false
  }
};

Donor Impact Template (HTML Email)

const donor_email_template = {
  layout: "single_column",
  sections: [
    { type: "hero_image", content: "devices_in_action.jpg" },
    { type: "thank_you_message", tone: "warm" },
    { type: "impact_metrics", style: "large_numbers" },
    { type: "success_story", format: "quote" },
    { type: "call_to_action", button: "View Full Report" }
  ],
  branding: {
    colors: ["#0E2240", "#6FC3DF"],
    inline_css: true, // For email clients
    mobile_responsive: true
  }
};

Multi-Format Export

Generate All Formats

async function export_all_formats(quarter, year) {
  const report_data = await generate_quarterly_report(quarter, year);

  return {
    pdf: await export_pdf({
      report: report_data,
      filename: `HTI_${quarter}_${year}_Report.pdf`,
      template: "ncdit_compliance"
    }),

    excel: await export_excel({
      workbook: {
        sheets: [
          { name: "Summary", data: report_data.metrics },
          { name: "Devices", data: report_data.devices },
          { name: "Training", data: report_data.training }
        ]
      },
      filename: `HTI_${quarter}_${year}_Data.xlsx`
    }),

    csv: await export_csv({
      records: report_data.devices,
      filename: `HTI_${quarter}_${year}_Devices.csv`
    }),

    json: await export_json({
      dataset: report_data,
      filename: `HTI_${quarter}_${year}_Full.json`
    })
  };
}

Cloud Storage Integration

Upload to Vercel Blob Storage

import { put } from '@vercel/​blob';

async function export_and_upload(report, filename) {
  const pdf_buffer = await generate_pdf_buffer(report);

  const blob = await put(filename, pdf_buffer, {
    access: 'public',
    contentType: 'application/​pdf'
  });

  return {
    url: blob.url,
    filename: filename,
    size: blob.size
  };
}

Upload to S3

import AWS from 'aws-sdk';

const s3 = new AWS.S3();

async function export_to_s3(report, filename) {
  const pdf_buffer = await generate_pdf_buffer(report);

  await s3.putObject({
    Bucket: 'hti-reports',
    Key: `quarterly/​${filename}`,
    Body: pdf_buffer,
    ContentType: 'application/​pdf',
    ACL: 'private'
  }).promise();

  const signed_url = s3.getSignedUrl('getObject', {
    Bucket: 'hti-reports',
    Key: `quarterly/​${filename}`,
    Expires: 604800 // 7 days
  });

  return { url: signed_url };
}

Automated Export Workflows

Quarterly Report Auto-Export

// Generate and distribute quarterly reports automatically
cron.schedule('0 8 5 1,4,7,10 *', async () => {
  const quarter = getCurrentQuarter();
  const year = getCurrentYear();

  // Generate all formats
  const exports = await export_all_formats(quarter, year);

  // Upload to cloud storage
  const pdf_url = await export_and_upload(exports.pdf, exports.pdf.filename);

  // Notify stakeholders
  await sendEmail({
    to: "[email protected]",
    subject: `${quarter} ${year} Quarterly Report Available`,
    body: `Download: ${pdf_url.url}`
  });

  await sendEmail({
    to: "[email protected]",
    subject: `HTI ${quarter} ${year} Grant Report`,
    body: `Attached quarterly report for review.`,
    attachments: [exports.pdf.filename]
  });
});

Integration Points

  • knack_reporting_sync: Generate report data for export
  • knack_dashboard_ai: Render charts and visualizations
  • knack_data_cleaner: Ensure data quality before export
  • knack_goal_tracker: Include progress metrics
  • knack_cache_optimizer: Cache generated reports

Best Practices

  1. Version exports: Include timestamp in filename
  2. Test all formats: Verify output before distribution
  3. Compress large files: Zip multi-file exports
  4. Secure sensitive data: Use signed URLs, not public links
  5. Archive exports: Retain copies of all official reports

Grant Compliance

NCDIT Submission Requirements

  • PDF for official record
  • Excel for data validation
  • All files <25MB (portal limit)
  • Naming convention: HTI_Q#_YYYY_Type.ext
  • Retention: 5 years post-grant completion

More skills from majiayu000

xiaohongshu logo
majiayu000/claude-arsenal

xiaohongshu

xiaohongshu

286 148
View
agent-task-conductor logo
majiayu000/claude-skill-registry

agent-task-conductor

Conduct multi-agent task orchestration and workflow coordination.

663 1
View
conductor-setup logo
majiayu000/claude-skill-registry

conductor-setup

Initialize project with Conductor artifacts (product definition,

663 1
View
animation-designer logo
majiayu000/claude-skill-registry

animation-designer

Expert in web animations, transitions, and motion design using Framer Motion and CSS

663 1
View
diagramming logo
majiayu000/claude-skill-registry

diagramming

Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...

663 1
View
h3-pg logo
majiayu000/claude-skill-registry-data

h3-pg

PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.

23 1
View
conductor-development logo
majiayu000/claude-skill-registry

conductor-development

Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...

663 1
View
conductor-status logo
majiayu000/claude-skill-registry

conductor-status

Display project status, active tracks, and next actions

663 1
View
dockerization logo
majiayu000/claude-skill-registry

dockerization

Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.

663 1
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View