A user script project template to create large and structured TypeScript projects for Tampermonkey or Greasemonkey. It is intended to form a scalable base and is primarily aimed at the Ingress community.
Find a file
Jonas Pfalzgraf d0a6b3dfc2
Merge pull request #6 from JosunLP/dev
feat: Update README.md with additional badges and improved formatting
2025-07-12 01:16:42 +02:00
assets feat: Add development scripts for building UserScript header 2025-07-11 18:02:09 +02:00
src feat: Implement mobile support with touch gestures and responsive design features 2025-07-11 19:21:39 +02:00
tools feat: Add development scripts for building UserScript header 2025-07-11 18:02:09 +02:00
.editorconfig feat: Add .editorconfig and update package.json for improved project structure and versioning 2025-07-11 18:15:19 +02:00
.eslintrc.js feat: Enhance UserScript structure and functionality 2025-07-11 17:47:22 +02:00
.gitignore feat: Enhance UserScript structure and functionality 2025-07-11 17:47:22 +02:00
.prettierrc.json feat: Enhance UserScript structure and functionality 2025-07-11 17:47:22 +02:00
header.config.json feat: Implement mobile support with touch gestures and responsive design features 2025-07-11 19:21:39 +02:00
LICENSE ⬆️ Upgrading Project 2024-06-02 20:50:22 +02:00
package-lock.json feat: Enhance UserScript structure and functionality 2025-07-11 17:47:22 +02:00
package.json feat: Implement mobile support with touch gestures and responsive design features 2025-07-11 19:21:39 +02:00
README.md fix: Correct formatting of contact information in README.md 2025-07-12 01:16:14 +02:00
tsconfig.json feat: Enhance UserScript structure and functionality 2025-07-11 17:47:22 +02:00
vite.config.ts feat: Enhance UserScript structure and functionality 2025-07-11 17:47:22 +02:00

UserScript Project Template

GitHub license GitHub issues GitHub stars GitHub forks

TypeScript Vite ESLint Prettier Node.js

Tampermonkey Greasemonkey Violentmonkey Mobile Support

Last Commit Contributors Repository Size

Description

A modern, production-ready template for building UserScripts using TypeScript and Vite. This template provides a solid foundation with best practices, type safety, and modern development tools for creating sophisticated Tampermonkey and Greasemonkey scripts.

Features

  • 🚀 Modern Tech Stack: TypeScript, Vite, ESLint, Prettier
  • 🛡️ Type Safety: Strict TypeScript configuration with comprehensive UserScript API definitions
  • 🔧 Development Tools: ESLint, Prettier, automated build pipeline
  • 🎯 Environment Support: Separate development and production configurations
  • 📦 Modular Architecture: Component system with reusable utilities
  • 💾 Storage Management: Type-safe wrapper for GM_setValue/GM_getValue
  • 🛠️ Build System: Optimized Vite configuration with automatic header generation
  • 🎨 DOM Utilities: Helper functions for element manipulation and waiting
  • 🔒 Error Handling: Comprehensive error boundary system
  • Event System: Type-safe event emitter for module communication
  • 📱 Mobile Support: Touch-optimized interface with mobile browser detection
  • 🤏 Touch Gestures: Built-in touch event handling and gesture recognition
  • 📲 Responsive Design: Mobile-first CSS with safe area support for notched devices

Installation

Quick Start

git clone https://github.com/JosunLP/UserScriptProjectTemplate.git
cd UserScriptProjectTemplate
npm install

Development Setup

# Install dependencies
npm install

# Start development mode with auto-rebuild
npm run dev

# Type checking
npm run type-check

# Linting and formatting
npm run validate

Usage

Project Structure

src/
├── types/            # TypeScript type definitions
├── utils/            # Utility functions (Storage, DOM, Events)
├── core/             # Core application logic
├── modules/          # Feature modules
└── index.ts          # Main application entry point

tools/
├── userScriptHeader.ts  # UserScript header generator

assets/               # Icons and static resources
└── icon.afdesign

Configuration

The main configuration is in header.config.json. This file controls UserScript metadata generation:

{
  "environments": {
    "development": {
      "includes": ["http://localhost:*/*", "https://localhost:*/*"],
      "grants": ["GM_setValue", "GM_getValue", "GM_log", "GM_notification"]
    },
    "production": {
      "includes": ["https://your-domain.com/*"],
      "grants": ["GM_setValue", "GM_getValue"]
    }
  }
}

Build Commands

# Development
npm run dev              # Start development with watch mode
npm run dev:build        # Single development build with header
npm run dev:header       # Generate header for existing dev build

# Production
npm run build            # Build for production
npm run build:prod       # Explicit production build

# Quality Assurance
npm run validate         # Type check + lint
npm run lint            # ESLint with auto-fix
npm run format          # Prettier formatting

# Utilities
npm run clean           # Clean dist folder
npm run type-check      # TypeScript type checking

Development Workflow

  1. Configure your script in header.config.json
  2. Start development: npm run dev
  3. Write your code in the src/ directory
  4. Build for production: npm run build
  5. Install the UserScript from dist/ folder in Tampermonkey/Greasemonkey

Storage Management

The template includes a type-safe storage system:

import { Storage } from '@/utils/storage';

// Save data
Storage.set('userData', { name: 'John', visits: 5 });

// Get data with default value
const userData = Storage.get('userData', { name: '', visits: 0 });

// Check if key exists
if (Storage.has('userData')) {
  // Key exists
}

// Remove data
Storage.remove('userData');

DOM Utilities

Helper functions for DOM manipulation:

import { DOMUtils } from '@/utils/dom';

// Wait for element to appear
const element = await DOMUtils.waitForElement('.my-selector');

// Add custom styles
DOMUtils.addStyles(`
  .my-class { color: red; }
`);

// Create element with attributes
const button = DOMUtils.createElement('button', {
  textContent: 'Click me',
  onclick: () => console.log('Clicked!'),
});

Event System

Type-safe communication between modules:

import { EventEmitter } from '@/utils/events';

interface MyEvents {
  userAction: { userId: string };
  dataLoaded: { count: number };
}

const emitter = new EventEmitter<MyEvents>();

// Listen for events
emitter.on('userAction', ({ userId }) => {
  console.log(`User ${userId} performed an action`);
});

// Emit events
emitter.emit('userAction', { userId: '123' });

Module System

Create reusable, event-driven modules:

import { EventEmitter } from '@/utils/events';

interface ModuleEvents {
  initialized: void;
  actionPerformed: { action: string };
}

export class MyModule extends EventEmitter<ModuleEvents> {
  async initialize() {
    // Module initialization logic
    this.emit('initialized', undefined);
  }
}

Mobile Utilities

Mobile-specific functionality for touch-enabled devices:

import { MobileUtils } from '@/utils/mobile';

// Detect mobile browser and capabilities
const detection = MobileUtils.detect();
console.log('Is Mobile:', detection.isMobile);
console.log('Has Touch:', detection.hasTouch);
console.log('Browser:', detection.browser);

// Add mobile-optimized styles
if (detection.isMobile) {
  MobileUtils.addMobileStyles();
}

// Unified touch/mouse event handling
MobileUtils.addUnifiedEventListener(element, 'start', event => {
  const position = MobileUtils.getEventPosition(event);
  console.log('Touch/click at:', position);
});

// Create mobile-friendly buttons
const button = mobileModule.createMobileButton('Action', () => {
  console.log('Button pressed');
});

// Orientation detection
console.log('Portrait mode:', MobileUtils.isPortrait());

UserScript Compatibility

  • Tampermonkey: Full support with all GM_* APIs
  • Greasemonkey: Compatible with standard UserScript APIs
  • Violentmonkey: Full compatibility
  • Safari: Works with userscript managers

Mobile Browser Support

Android:

  • Kiwi Browser: Full Chrome extension + UserScript support
  • Microsoft Edge Mobile: Tampermonkey support
  • Firefox Mobile: Greasemonkey, Tampermonkey, Violentmonkey
  • Yandex Browser: Chrome extension support

iOS:

  • Safari Mobile: Tampermonkey or Userscripts App
  • Limited support due to iOS restrictions

Mobile Features

  • Touch Gestures: Tap, swipe, and pinch detection
  • Responsive Design: Mobile-first CSS with viewport adaptation
  • Safe Area Support: Automatic handling of notched devices
  • Orientation Detection: Portrait/landscape change handling
  • Mobile-Optimized UI: Touch-friendly buttons and menus

Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Make your changes and ensure tests pass: npm run validate
  4. Commit your changes: git commit -m 'Add amazing feature'
  5. Push to the branch: git push origin feature/amazing-feature
  6. Open a Pull Request

Development Guidelines

  • Follow TypeScript best practices
  • Use meaningful variable and function names
  • Add proper error handling
  • Write self-documenting code
  • Follow the established project structure
  • Run npm run validate before committing

License

This project is licensed under the MIT License.

Author

Jonas Pfalzgraf


Built with ❤️ for the UserScript community