A simple, standalone web application that allows veterinarians to issue digital vaccination certificates (stamps) that pet owners can save and anyone can verify.
- Vet Interface: Simple form to generate vaccination certificates
- Certificate Generation: Creates unique certificate IDs with QR codes
- Pet Owner View: Clean, printable certificate format with PDF download
- Verification: Public verification page to check certificate authenticity
- Mobile-Friendly: Responsive design works on all devices
- Offline Support: Coming soon
- Frontend: HTML, CSS, Vanilla JavaScript
- Backend: Node.js with Express
- Database: SQLite
- Libraries:
better-sqlite3- SQLite databaseqrcode- QR code generationnanoid- Unique ID generationpdfkit- PDF generation
jet-stamp/
├── server.js # Express server and API routes
├── database.js # SQLite database setup
├── package.json # Dependencies
├── certificates.db # SQLite database (created on first run)
├── public/
│ ├── vet.html # Vet interface
│ ├── vet.js # Vet interface logic
│ ├── certificate.html # Certificate view
│ ├── certificate.js # Certificate view logic
│ ├── verify.html # Verification page
│ ├── verify.js # Verification logic
│ └── styles.css # Global styles
└── README.md
CREATE TABLE certificates (
id TEXT PRIMARY KEY, -- Unique 6-character alphanumeric ID
vet_name TEXT NOT NULL,
license_number TEXT NOT NULL,
clinic_name TEXT,
pet_name TEXT NOT NULL,
pet_type TEXT NOT NULL, -- dog, cat, or other
vaccine_type TEXT NOT NULL,
date_administered TEXT NOT NULL,
next_due_date TEXT,
created_at TEXT NOT NULL,
qr_code TEXT -- Base64 encoded QR code image
);- Node.js (v14 or higher)
- npm (comes with Node.js)
-
Clone or download this repository
-
Install dependencies
npm install
-
Start the server
npm start
-
Open your browser
http://localhost:3000
The application will automatically:
- Create the SQLite database on first run
- Initialize the database schema
- Start the web server on port 3000
- Navigate to
http://localhost:3000/vet - Fill in the vaccination certificate form:
- Veterinarian information (name, license, clinic)
- Pet information (name, type)
- Vaccination details (vaccine type, dates)
- Click "Generate Certificate"
- Share the generated link with the pet owner
- Receive the certificate link from your veterinarian
- View the certificate at
/certificate/{ID} - Options available:
- Download as PDF
- Share link
- Print certificate
- Scan the QR code on a certificate, or
- Visit
/verify/{ID}directly - View certificate details and verification status
Create a new vaccination certificate
Request body:
{
"vet_name": "Dr. Jane Smith",
"license_number": "VET123456",
"clinic_name": "Happy Paws Clinic",
"pet_name": "Max",
"pet_type": "dog",
"vaccine_type": "Rabies",
"date_administered": "2025-11-03",
"next_due_date": "2026-11-03"
}Response:
{
"success": true,
"certificateId": "ABC123",
"certificateUrl": "http://localhost:3000/certificate/ABC123"
}Retrieve certificate data
Response:
{
"id": "ABC123",
"vet_name": "Dr. Jane Smith",
"license_number": "VET123456",
"clinic_name": "Happy Paws Clinic",
"pet_name": "Max",
"pet_type": "dog",
"vaccine_type": "Rabies",
"date_administered": "2025-11-03",
"next_due_date": "2026-11-03",
"created_at": "2025-11-03T12:00:00.000Z",
"qr_code": "data:image/png;base64,..."
}Download certificate as PDF
Returns a PDF file for download.
The application is ready to run locally using the setup instructions above.
-
Install Node.js on your server
-
Clone the repository to your server
-
Install dependencies
npm install --production
-
Set the PORT environment variable (optional)
export PORT=3000 -
Start with a process manager (e.g., PM2)
npm install -g pm2 pm2 start server.js --name jet-stamp pm2 save pm2 startup
-
Configure reverse proxy (e.g., Nginx)
server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
Heroku:
# Install Heroku CLI and login
heroku create your-app-name
git push heroku mainRailway / Render / Fly.io:
- Connect your Git repository
- Set start command:
npm start - Deploy automatically on push
Create a Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]Build and run:
docker build -t jet-stamp .
docker run -p 3000:3000 -v $(pwd)/certificates.db:/app/certificates.db jet-stampPORT- Server port (default: 3000)
This is an MVP application. For production use, consider:
- Authentication: Add user authentication for veterinarians
- Authorization: Implement role-based access control
- HTTPS: Use SSL/TLS certificates
- Input Validation: Enhanced server-side validation
- Rate Limiting: Prevent abuse
- Database Backups: Regular automated backups
- Audit Logging: Track all certificate operations
- Offline mode support (PWA)
- User authentication
- Multi-language support
- Email notifications
- Certificate expiration reminders
- Batch certificate generation
- Analytics dashboard
- Mobile app (iOS/Android)
MIT
For issues or questions, please open an issue on the repository.