@appsutra/data
v0.1.0
Published
AppSutra Data Package - Community-curated SaaS product listings for India
Maintainers
Readme
🚀 AppSutra – Open SaaS Directory
An India-first, GitHub-powered directory of SaaS products where vendors add listings via Pull Requests and users share experiences via Issues.
📋 What is AppSutra?
AppSutra is a community-driven directory of SaaS products optimized for Indian businesses. Unlike traditional directories, we leverage GitHub's collaborative features to create a transparent, auditable, and community-moderated platform.
Key Features:
- 🇮🇳 India-first focus - Pricing in ₹, local integrations, compliance considerations
- 🔍 Transparent reviews - All reviews are public GitHub Issues with full history
- 🤖 Automated validation - Schema validation, link checking, and quality assurance
- 📊 Community-driven - Vendors submit via PRs, users review via Issues
- 🎯 Category-organized - CRM, HR, Marketing, Finance, and more
🚀 Quick Start
Adding Your Product
- Fork this repository
- Create your listing file at
listings/<category-folder>/<your-product>.md - Fill in the details using our template (see example below)
- Open a Pull Request - our validation will run automatically
- Get reviewed by maintainers and go live!
Note: Slugs are auto-generated from your
nameandcategoryfields in YAML. The filename must matchslugify(name)and the folder must matchslugify(category). Validation runs automatically on PR submission.
Example Listing Structure
---
icon: "https://example.com/logo.png"
name: "Razorpay"
company: "Razorpay Software Private Limited"
trialPlan: true
trialPlanPricing: "Free"
category: "Finance"
# IMPORTANT: Do NOT add 'slug' or 'categorySlug' fields
# They are auto-generated during validation and build from 'name' and 'category'
# - Filename must be: slugify("Razorpay") = "razorpay.md"
# - Folder must be: slugify("Finance") = "finance/"
# - Location: listings/finance/razorpay.md
useCases:
- "Online Payments"
- "E-commerce"
- "Subscription Billing"
keywords:
- "payment gateway"
- "online payments"
- "e-commerce"
integration:
- title: "Shopify"
- title: "WooCommerce"
- title: "Zapier"
description: |
Razorpay is a comprehensive payment gateway platform designed to empower businesses...
**Key Highlights**
- Comprehensive payment processing platform
- Accept payments globally through multiple channels
- Simple API integrations for developers
locations:
- "India"
- "Global"
website: "https://razorpay.com/"
updated_at: "2025-01-18"
keyFeatures:
description: "Razorpay offers a full range of payment tools..."
features:
- title: "Payment Gateway"
desc: "Accept payments via credit cards, debit cards, UPI, wallets."
- title: "Subscription Management"
desc: "Create and manage recurring billing for subscription-based businesses."
# Maximum 8 features
buyingGuide:
- question: "1. What's your business model?"
why: "Helps determine the payment features you need"
answer: "E-commerce, subscription-based, service-based, or other?"
# Maximum 8 questions
pricing:
desc: "Razorpay offers flexible pricing plans..."
plans:
- name: "Basic Plan"
pricing:
amount: 0
currency: "INR"
currencySymbol: "₹"
period: "month"
perUnit: null
description: "Free plan with all essential features."
# Maximum 4 plans
---📂 Categories
- CRM - Customer relationship management
- Human Resource - HR software and recruitment
- Payment Gateway - Payment processing and merchant services
- Marketing - Digital marketing and automation
- Finance - Financial management tools
- Support - Customer support and helpdesk
- Analytics - Business intelligence and analytics
- Security - Cybersecurity and compliance
- DevTools - Development and technical tools
🔍 Writing Reviews
Share your experience by creating a review issue!
What makes a great review:
- Specific use case and context
- Honest pros and cons
- Team size and industry
- Duration of usage
- Specific features used
🛠️ Development
Prerequisites
- Node.js 18+
- npm
Setup
git clone https://github.com/salesuplabs/appsutra.git
cd appsutra
npm installValidation
# Validate all listings against schema
npm run validate
# Check all links in listings
npm run linkcheck
# Run all validation
npm testBuilding Data Package
# Build the data package (compiles MD → JSON)
npm run build:data
# Output: dist/listings.json
# This file contains all validated listings in JSON format
# Run full pre-publish validation
npm run prepublishOnlyFile Structure
appsutra/
├── listings/ # Product listings (organized by category)
│ ├── hr/ # HR category folder
│ │ └── keka-services.md
│ ├── finance/ # Finance category folder
│ │ └── razorpay.md
│ └── payment-gateway/ # Payment Gateway category folder
│ └── ...
├── schema/ # JSON Schema validation
│ ├── product.schema.json # Product validation schema
│ └── categories.json # Category definitions
├── scripts/ # Validation and build scripts
│ ├── validate.mjs # Schema validation
│ ├── linkcheck.mjs # URL verification
│ └── build-data.ts # MD → JSON compiler
├── dist/ # Build output
│ └── listings.json # Compiled data package
├── .github/ # GitHub templates and workflows
│ └── workflows/
│ ├── validate-listings.yml
│ └── release.yml # Auto-publish to GitHub Packages
└── package.json # @appsutra/data package configArchitecture: Data Package Pipeline
How listings become consumable data:
Organize by Category: Place product in category folder
- Example:
listings/finance/razorpay.md
- Example:
Define in YAML: Add YAML front-matter with product details
name: "Razorpay"category: "Finance"(display name, can differ from folder)
Auto-Generate Slugs: Build process generates slugs from YAML fields
name: "Razorpay"→slug: "razorpay"(validated against filename)category: "Finance"→categorySlug: "finance"(validated against folder)- Validation ensures: filename = slugify(name), folder = slugify(category)
Compile to JSON:
build-data.tsparses all MD files withgray-matter- Validates against
product.schema.json - Generates
slugandcategorySlugfields - Outputs to
dist/listings.json
- Validates against
Publish Package: GitHub Actions publishes
@appsutra/datato GitHub PackagesConsume: Applications install the package and import the data
Key Points:
- ✅ Data-only package - No frontend code, just structured data
- ✅ Automated publishing - Tag version, GitHub Actions handles the rest
- ✅ Type-safe compilation - TypeScript build with schema validation
- ✅ Consumable via npm - Install via GitHub Packages
📦 Data Package Distribution
AppSutra publishes listings as a consumable npm package via GitHub Packages, enabling other applications to use our curated dataset.
Package: @appsutra/data
Published to: GitHub Packages (npm.pkg.github.com)
Main Export: dist/listings.json - Compiled array of all product listings
Publishing Workflow
- Make changes to listings in
listings/directory - Commit and push to the main branch
- Tag a version:
git tag v0.1.x && git push --tags - GitHub Actions automatically:
- Validates all listings against schema
- Builds data package (
npm run build:data) - Publishes to GitHub Packages
Build Process
# Install dependencies (includes TypeScript)
npm install
# Validate listings
npm run validate
# Check all URLs
npm run linkcheck
# Build data package (compiles MD → JSON)
npm run build:data
# Output: dist/listings.json with all listingsThe build-data.ts script:
- Parses all
.mdfiles withgray-matter - Validates against
schema/product.schema.json - Auto-generates
slugandcategorySlugfields - Compiles into a single JSON array
Consuming the Package
Other applications can install and use the data:
# Configure .npmrc for GitHub Packages
echo "@appsutra:registry=https://npm.pkg.github.com" >> .npmrc
# Set auth token (requires read:packages scope)
export NODE_AUTH_TOKEN=ghp_your_token
# Install package
npm install @appsutra/data// Import in your application
import listings from '@appsutra/data/dist/listings.json';
// Use the data
const allProducts = listings;
const financeProducts = listings.filter(l => l.categorySlug === 'finance');Any web application, mobile app, or backend service can consume this data package to display SaaS product information.
🤝 Contributing
We welcome contributions from the community! Please read our Contributing Guide for details on:
- Adding new listings
- Improving existing listings
- Contributing to the platform itself
- Code of conduct and community guidelines
📜 Guidelines
For Vendors
- Keep descriptions factual and neutral - No promotional language
- Include India-specific context - ₹ pricing, local integrations
- Follow field limits:
- Maximum 8 key features
- Maximum 4 pricing plans
- Maximum 8 buying guide questions
- Maximum 30 keywords
- Use proper structure - Follow the Product type interface exactly
- No manual slugs - Slugs are auto-generated from name and category
- File naming: Filename must match
slugify(name).md, folder must matchslugify(category) - Required fields: All fields in Product schema are required, including
updated_at(YYYY-MM-DD format) - Maintain up-to-date information - Update
updated_atwhen making changes
For Users
- Write constructive, helpful reviews
- Include your context (team size, use case)
- Focus on specific experiences
- Follow our Code of Conduct
🔐 Moderation
All submissions go through:
- Automated schema validation
- Link verification
- Manual review by maintainers
- Community feedback
See our Moderation Guidelines for details.
📊 Stats
- Total Listings: Check the listings directory
- Active Categories: 9 major SaaS categories
- Community Reviews: Browse review issues
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Built with ❤️ for the Indian SaaS community
- Powered by GitHub's collaborative features
- Inspired by awesome-lists and other community-driven projects
Ready to contribute? Add your product or write a review!
