2025-08-14 14:30:54 +00:00
# @push.rocks/smartproxy 🚀
2025-02-03 23:41:13 +01:00
2025-08-14 14:30:54 +00:00
**The Swiss Army Knife of Node.js Proxies** - A unified, high-performance proxy toolkit that handles everything from simple HTTP forwarding to complex enterprise routing scenarios.
2025-05-09 22:58:42 +00:00
2026-01-30 09:22:41 +00:00
## 📦 Installation
```bash
npm install @push .rocks/smartproxy
# or
pnpm add @push .rocks/smartproxy
```
## Issue Reporting and Security
For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/ ](https://community.foss.global/ ). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/ ](https://code.foss.global/ ) account to submit Pull Requests directly.
2025-08-14 14:30:54 +00:00
## 🎯 What is SmartProxy?
2025-05-03 13:19:23 +00:00
2025-08-14 14:30:54 +00:00
SmartProxy is a modern, production-ready proxy solution that brings order to the chaos of traffic management. Whether you're building microservices, deploying edge infrastructure, or need a battle-tested reverse proxy, SmartProxy has you covered.
2025-05-09 22:11:56 +00:00
2025-08-14 14:30:54 +00:00
### ⚡ Key Features
2025-05-09 22:11:56 +00:00
2026-01-30 09:22:41 +00:00
| Feature | Description |
|---------|-------------|
| 🔀 **Unified Route-Based Config ** | Clean match/action patterns for intuitive traffic routing |
| 🔒 **Automatic SSL/TLS ** | Zero-config HTTPS with Let's Encrypt ACME integration |
| 🎯 **Flexible Matching ** | Route by port, domain, path, client IP, TLS version, or custom logic |
| 🚄 **High-Performance ** | Choose between user-space or kernel-level (NFTables) forwarding |
| ⚖️ **Load Balancing ** | Distribute traffic with health checks and multiple algorithms |
| 🛡️ **Enterprise Security ** | IP filtering, rate limiting, authentication, connection limits |
| 🔌 **WebSocket Support ** | First-class WebSocket proxying with ping/pong keep-alive |
| 🎮 **Custom Protocols ** | Socket handlers for implementing any protocol |
| 📊 **Live Metrics ** | Real-time throughput, connection counts, and performance data |
| 🔧 **Dynamic Management ** | Add/remove ports and routes at runtime without restarts |
2025-05-03 13:19:23 +00:00
2025-08-14 14:30:54 +00:00
## 🚀 Quick Start
2025-05-09 22:58:42 +00:00
2026-01-30 09:22:41 +00:00
Get up and running in 30 seconds:
2025-05-09 22:58:42 +00:00
```typescript
2025-08-14 14:30:54 +00:00
import { SmartProxy, createCompleteHttpsServer } from '@push .rocks/smartproxy';
2025-05-10 00:01:02 +00:00
2025-08-14 14:30:54 +00:00
// Create a proxy with automatic HTTPS
2025-05-09 22:58:42 +00:00
const proxy = new SmartProxy({
2025-05-18 18:29:59 +00:00
acme: {
2026-01-30 09:22:41 +00:00
email: 'ssl@yourdomain .com', // Your email for Let's Encrypt
useProduction: true // Use production servers
2025-05-18 18:29:59 +00:00
},
2025-05-10 00:01:02 +00:00
routes: [
2026-01-30 09:22:41 +00:00
// Complete HTTPS setup in one line! ✨
...createCompleteHttpsServer('app.example.com', {
host: 'localhost',
port: 3000
2025-08-14 14:30:54 +00:00
}, {
certificate: 'auto' // Magic! 🎩
})
2025-05-19 17:39:35 +00:00
]
2025-05-09 22:58:42 +00:00
});
await proxy.start();
2025-08-14 14:30:54 +00:00
console.log('🚀 Proxy running with automatic HTTPS!');
2025-05-10 00:06:53 +00:00
```
2025-08-14 14:30:54 +00:00
## 📚 Core Concepts
2025-05-10 00:06:53 +00:00
2025-08-14 14:30:54 +00:00
### 🏗️ Route-Based Architecture
2025-05-10 00:06:53 +00:00
2026-01-30 09:22:41 +00:00
SmartProxy uses a powerful **match/action ** pattern that makes routing predictable and maintainable:
2025-05-10 00:06:53 +00:00
```typescript
2025-07-21 12:23:22 +00:00
{
2026-01-30 09:22:41 +00:00
name: 'api-route',
2025-07-21 12:23:22 +00:00
match: {
ports: 443,
domains: 'api.example.com',
path: '/v1/*'
},
action: {
type: 'forward',
2025-08-14 14:30:54 +00:00
targets: [{ host: 'backend', port: 8080 }],
tls: { mode: 'terminate', certificate: 'auto' }
2025-07-21 12:23:22 +00:00
}
2025-05-10 00:06:53 +00:00
}
```
2026-01-30 09:22:41 +00:00
Every route consists of:
- **Match** - What traffic to capture (ports, domains, paths, IPs)
- **Action** - What to do with it (forward, redirect, block, socket-handler)
- **Security** (optional) - Access controls, rate limits, authentication
- **Name/Priority** (optional) - For identification and ordering
### 🔄 TLS Modes
SmartProxy supports three TLS handling modes:
| Mode | Description | Use Case |
|------|-------------|----------|
| `passthrough` | Forward encrypted traffic as-is | Backend handles TLS |
| `terminate` | Decrypt at proxy, forward plain | Standard reverse proxy |
| `terminate-and-reencrypt` | Decrypt, then re-encrypt to backend | Zero-trust environments |
2025-05-10 00:06:53 +00:00
2025-08-14 14:30:54 +00:00
## 💡 Common Use Cases
2025-05-15 19:39:09 +00:00
2026-01-30 09:22:41 +00:00
### 🌐 HTTP to HTTPS Redirect
2025-05-15 19:39:09 +00:00
2025-05-10 00:06:53 +00:00
```typescript
2025-08-14 14:30:54 +00:00
import { SmartProxy, createHttpToHttpsRedirect } from '@push .rocks/smartproxy';
2025-05-29 15:06:57 +00:00
2025-08-14 14:30:54 +00:00
const proxy = new SmartProxy({
routes: [
createHttpToHttpsRedirect(['example.com', '*.example.com'])
]
});
```
2025-05-29 15:06:57 +00:00
2025-08-14 14:30:54 +00:00
### ⚖️ Load Balancer with Health Checks
2025-05-10 00:06:53 +00:00
```typescript
2025-08-14 14:30:54 +00:00
import { createLoadBalancerRoute } from '@push .rocks/smartproxy';
2025-05-29 15:06:57 +00:00
2025-08-14 14:30:54 +00:00
const route = createLoadBalancerRoute(
'app.example.com',
[
{ host: 'server1.internal', port: 8080 },
{ host: 'server2.internal', port: 8080 },
{ host: 'server3.internal', port: 8080 }
],
{
tls: { mode: 'terminate', certificate: 'auto' },
loadBalancing: {
algorithm: 'round-robin',
healthCheck: {
path: '/health',
interval: 30000,
timeout: 5000
}
}
}
);
2025-05-29 15:06:57 +00:00
```
2025-08-14 14:30:54 +00:00
### 🔌 WebSocket Proxy
2025-05-29 15:06:57 +00:00
```typescript
2025-08-14 14:30:54 +00:00
import { createWebSocketRoute } from '@push .rocks/smartproxy';
const route = createWebSocketRoute(
'ws.example.com',
{ host: 'websocket-server', port: 8080 },
{
path: '/socket',
useTls: true,
certificate: 'auto',
2026-01-30 09:22:41 +00:00
pingInterval: 30000, // Keep connections alive
pingTimeout: 10000
2025-07-21 12:23:22 +00:00
}
2025-08-14 14:30:54 +00:00
);
2025-05-10 00:06:53 +00:00
```
2025-08-14 14:30:54 +00:00
### 🚦 API Gateway with Rate Limiting
2025-05-10 00:06:53 +00:00
```typescript
2025-08-14 14:30:54 +00:00
import { createApiGatewayRoute, addRateLimiting } from '@push .rocks/smartproxy';
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
let route = createApiGatewayRoute(
'api.example.com',
'/api',
{ host: 'api-backend', port: 8080 },
{
useTls: true,
certificate: 'auto',
addCorsHeaders: true
}
);
2025-06-12 16:59:25 +00:00
2026-01-30 09:22:41 +00:00
// Add rate limiting - 100 requests per minute per IP
2025-08-14 14:30:54 +00:00
route = addRateLimiting(route, {
maxRequests: 100,
2026-01-30 09:22:41 +00:00
window: 60,
2025-08-14 14:30:54 +00:00
keyBy: 'ip'
});
2025-06-12 16:59:25 +00:00
```
2025-08-14 14:30:54 +00:00
### 🎮 Custom Protocol Handler
2025-06-12 16:59:25 +00:00
2026-01-30 09:22:41 +00:00
SmartProxy lets you implement any protocol with full socket control:
2025-06-12 16:59:25 +00:00
```typescript
2025-08-14 14:30:54 +00:00
import { createSocketHandlerRoute, SocketHandlers } from '@push .rocks/smartproxy';
2025-06-12 16:59:25 +00:00
2026-01-30 09:22:41 +00:00
// Use pre-built handlers
2025-08-14 14:30:54 +00:00
const echoRoute = createSocketHandlerRoute(
2026-01-30 09:22:41 +00:00
'echo.example.com',
7777,
2025-08-14 14:30:54 +00:00
SocketHandlers.echo
);
2026-01-30 09:22:41 +00:00
// Or create your own custom protocol
2025-08-14 14:30:54 +00:00
const customRoute = createSocketHandlerRoute(
'custom.example.com',
9999,
async (socket, context) => {
console.log(`Connection from ${context.clientIp}` );
socket.write('Welcome to my custom protocol!\n');
2026-01-30 09:22:41 +00:00
2025-08-14 14:30:54 +00:00
socket.on('data', (data) => {
const command = data.toString().trim();
2026-01-30 09:22:41 +00:00
switch (command) {
case 'PING': socket.write('PONG\n'); break;
case 'TIME': socket.write(`${new Date().toISOString()}\n` ); break;
case 'QUIT': socket.end('Goodbye!\n'); break;
default: socket.write(`Unknown: ${command}\n` );
2025-07-21 12:23:22 +00:00
}
2025-08-14 14:30:54 +00:00
});
2025-06-12 16:59:25 +00:00
}
2025-08-14 14:30:54 +00:00
);
2025-06-12 16:59:25 +00:00
```
2026-01-30 09:22:41 +00:00
**Pre-built Socket Handlers:**
| Handler | Description |
|---------|-------------|
| `SocketHandlers.echo` | Echo server - returns everything sent |
| `SocketHandlers.proxy(host, port)` | TCP proxy to another server |
| `SocketHandlers.lineProtocol(handler)` | Line-based text protocol |
| `SocketHandlers.httpResponse(code, body)` | Simple HTTP response |
| `SocketHandlers.httpRedirect(url, code)` | HTTP redirect with templates |
| `SocketHandlers.httpServer(handler)` | Full HTTP request/response handling |
| `SocketHandlers.block(message)` | Block with optional message |
2025-08-14 14:30:54 +00:00
### ⚡ High-Performance NFTables Forwarding
2025-06-12 16:59:25 +00:00
2026-01-30 09:22:41 +00:00
For ultra-low latency on Linux, use kernel-level forwarding (requires root):
2025-06-12 16:59:25 +00:00
```typescript
2025-08-14 14:30:54 +00:00
import { createNfTablesTerminateRoute } from '@push .rocks/smartproxy';
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
const route = createNfTablesTerminateRoute(
'fast.example.com',
{ host: 'backend', port: 8080 },
{
ports: 443,
certificate: 'auto',
2026-01-30 09:22:41 +00:00
preserveSourceIP: true, // Backend sees real client IP
maxRate: '1gbps' // QoS rate limiting
2025-06-12 16:59:25 +00:00
}
2025-08-14 14:30:54 +00:00
);
2025-06-12 16:59:25 +00:00
```
2025-08-14 14:30:54 +00:00
## 🔧 Advanced Features
### 🎯 Dynamic Routing
Route traffic based on runtime conditions:
2025-06-12 16:59:25 +00:00
```typescript
{
2026-01-30 09:22:41 +00:00
name: 'business-hours-only',
2025-08-14 14:30:54 +00:00
match: {
ports: 443,
2026-01-30 09:22:41 +00:00
domains: 'internal.example.com'
2025-08-14 14:30:54 +00:00
},
action: {
type: 'forward',
targets: [{
host: (context) => {
2026-01-30 09:22:41 +00:00
// Dynamic host selection based on path
return context.path?.startsWith('/premium')
? 'premium-backend'
2025-08-14 14:30:54 +00:00
: 'standard-backend';
},
port: 8080
}]
2025-06-12 16:59:25 +00:00
}
}
```
2025-08-14 14:30:54 +00:00
### 🔒 Security Controls
2026-01-30 09:22:41 +00:00
Comprehensive per-route security options:
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
```typescript
2025-07-21 12:23:22 +00:00
{
2026-01-30 09:22:41 +00:00
name: 'secure-api',
match: { ports: 443, domains: 'api.example.com' },
action: {
type: 'forward',
targets: [{ host: 'api-backend', port: 8080 }]
},
2025-07-21 12:23:22 +00:00
security: {
2025-08-14 14:30:54 +00:00
// IP-based access control
ipAllowList: ['10.0.0.0/8', '192.168.*'],
ipBlockList: ['192.168.1.100'],
2026-01-30 09:22:41 +00:00
2025-08-14 14:30:54 +00:00
// Connection limits
maxConnections: 1000,
maxConnectionsPerIp: 10,
2026-01-30 09:22:41 +00:00
2025-08-14 14:30:54 +00:00
// Rate limiting
rateLimit: {
maxRequests: 100,
windowMs: 60000
2025-07-21 12:23:22 +00:00
}
}
}
```
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
### 📊 Runtime Management
Control your proxy without restarts:
2025-06-12 16:59:25 +00:00
```typescript
2026-01-30 09:22:41 +00:00
// Dynamic port management
2025-08-14 14:30:54 +00:00
await proxy.addListeningPort(8443);
await proxy.removeListeningPort(8080);
// Update routes on the fly
await proxy.updateRoutes([...newRoutes]);
// Monitor status
const status = proxy.getStatus();
2026-01-30 09:22:41 +00:00
console.log(`Active connections: ${status.activeConnections}` );
// Get detailed metrics
2025-08-14 14:30:54 +00:00
const metrics = proxy.getMetrics();
2026-01-30 09:22:41 +00:00
console.log(`Throughput: ${metrics.throughput.bytesPerSecond} bytes/sec` );
2025-08-14 14:30:54 +00:00
// Certificate management
const certInfo = proxy.getCertificateInfo('example.com');
2026-01-30 09:22:41 +00:00
console.log(`Certificate expires: ${certInfo.expiresAt}` );
2025-06-12 16:59:25 +00:00
```
2025-08-14 14:30:54 +00:00
### 🔄 Header Manipulation
2026-01-30 09:22:41 +00:00
Transform requests and responses with template variables:
2025-08-14 14:30:54 +00:00
2025-06-12 16:59:25 +00:00
```typescript
{
action: {
2026-01-30 09:22:41 +00:00
type: 'forward',
targets: [{ host: 'backend', port: 8080 }],
2025-07-21 12:23:22 +00:00
headers: {
request: {
2026-01-30 09:22:41 +00:00
'X-Real-IP': '{clientIp}',
2025-08-14 14:30:54 +00:00
'X-Request-ID': '{uuid}',
2026-01-30 09:22:41 +00:00
'X-Forwarded-Proto': 'https'
2025-07-21 12:23:22 +00:00
},
response: {
'X-Powered-By': 'SmartProxy',
2025-08-14 14:30:54 +00:00
'Strict-Transport-Security': 'max-age=31536000',
'X-Frame-Options': 'DENY'
2025-07-21 12:23:22 +00:00
}
2025-06-12 16:59:25 +00:00
}
}
}
```
2025-08-14 14:30:54 +00:00
## 🏛️ Architecture
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
SmartProxy is built with a modular, extensible architecture:
2025-06-12 16:59:25 +00:00
2025-07-21 12:23:22 +00:00
```
2025-08-14 14:30:54 +00:00
SmartProxy
2026-01-30 09:22:41 +00:00
├── 📋 RouteManager # Route matching and prioritization
├── 🔌 PortManager # Dynamic port lifecycle management
├── 🔒 SmartCertManager # ACME/Let's Encrypt automation
├── 🚦 ConnectionManager # Connection pooling and tracking
├── 📊 MetricsCollector # Real-time performance monitoring
├── 🛡️ SecurityManager # Access control and rate limiting
├── 🔧 ProtocolDetector # Smart HTTP/TLS/WebSocket detection
├── ⚡ NFTablesManager # Kernel-level forwarding (Linux)
└── 🌐 HttpProxyBridge # HTTP/HTTPS request handling
2025-08-14 14:30:54 +00:00
```
## 🎯 Route Configuration Reference
### Match Criteria
2025-06-12 16:59:25 +00:00
```typescript
2025-08-14 14:30:54 +00:00
interface IRouteMatch {
ports: number | number[] | string; // 80, [80, 443], '8000-8999'
domains?: string | string[]; // 'example.com', '*.example.com'
path?: string; // '/api/*', '/users/:id'
clientIp?: string | string[]; // '10.0.0.0/8', ['192.168.*']
tlsVersion?: string | string[]; // ['TLSv1.2', 'TLSv1.3']
}
2025-06-12 16:59:25 +00:00
```
2025-08-14 14:30:54 +00:00
### Action Types
2026-01-30 09:22:41 +00:00
| Type | Description |
|------|-------------|
| `forward` | Proxy to one or more backend targets |
| `redirect` | HTTP redirect with status code |
| `block` | Block the connection |
| `socket-handler` | Custom socket handling function |
### TLS Options
2025-06-12 16:59:25 +00:00
```typescript
2026-01-30 09:22:41 +00:00
interface IRouteTls {
mode: 'passthrough' | 'terminate' | 'terminate-and-reencrypt';
certificate: 'auto' | { key: string; cert: string };
// For terminate-and-reencrypt:
reencrypt?: {
host: string;
port: number;
ca?: string; // Custom CA for backend
2025-08-14 14:30:54 +00:00
};
}
2025-06-12 16:59:25 +00:00
```
2026-01-30 09:22:41 +00:00
## 🛠️ Helper Functions Reference
All helpers are fully typed and documented:
```typescript
import {
// HTTP/HTTPS
createHttpRoute,
createHttpsTerminateRoute,
createHttpsPassthroughRoute,
createHttpToHttpsRedirect,
createCompleteHttpsServer,
// Load Balancing
createLoadBalancerRoute,
createSmartLoadBalancer,
// API & WebSocket
createApiRoute,
createApiGatewayRoute,
createWebSocketRoute,
// Custom Protocols
createSocketHandlerRoute,
SocketHandlers,
// NFTables (Linux)
createNfTablesRoute,
createNfTablesTerminateRoute,
createCompleteNfTablesHttpsServer,
// Dynamic Routing
createPortMappingRoute,
createOffsetPortMappingRoute,
createDynamicRoute,
// Security Modifiers
addRateLimiting,
addBasicAuth,
addJwtAuth
} from '@push .rocks/smartproxy';
```
2025-08-14 14:30:54 +00:00
## 🐛 Troubleshooting
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
### Certificate Issues
2026-01-30 09:22:41 +00:00
- ✅ Ensure domain DNS points to your server
- ✅ Port 80 must be accessible for ACME HTTP-01 challenges
- ✅ Check DNS propagation with `dig` or `nslookup`
- ✅ Verify the email in ACME configuration is valid
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
### Connection Problems
2026-01-30 09:22:41 +00:00
- ✅ Check route priorities (higher number = matched first)
- ✅ Verify security rules aren't blocking legitimate traffic
- ✅ Test with `curl -v` for detailed connection output
- ✅ Enable debug logging for verbose output
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
### Performance Tuning
2026-01-30 09:22:41 +00:00
- ✅ Use NFTables forwarding for high-traffic routes (Linux only)
- ✅ Enable connection keep-alive where appropriate
- ✅ Monitor metrics to identify bottlenecks
- ✅ Adjust `maxConnections` based on your server resources
2025-06-12 16:59:25 +00:00
2025-07-21 12:23:22 +00:00
### Debug Mode
2026-01-30 09:22:41 +00:00
2025-06-12 16:59:25 +00:00
```typescript
2025-07-21 12:23:22 +00:00
const proxy = new SmartProxy({
2026-01-30 09:22:41 +00:00
enableDetailedLogging: true, // Verbose connection logging
2025-07-21 12:23:22 +00:00
routes: [...]
});
2025-06-12 16:59:25 +00:00
```
2025-08-14 14:30:54 +00:00
## 🏆 Best Practices
2025-06-12 16:59:25 +00:00
2026-01-30 09:22:41 +00:00
1. * * 📝 Use Helper Functions** - They provide sensible defaults and prevent common mistakes
2. * * 🎯 Set Route Priorities** - More specific routes should have higher priority values
3. * * 🔒 Enable Security** - Always use IP filtering and rate limiting for public services
4. * * 📊 Monitor Metrics** - Use the built-in metrics to identify issues early
5. * * 🔄 Certificate Monitoring** - Set up alerts for certificate expiration
6. * * 🛑 Graceful Shutdown** - Always call `proxy.stop()` for clean connection termination
7. * * 🔧 Test Routes** - Validate your route configurations before deploying to production
2025-06-12 16:59:25 +00:00
2025-08-14 14:30:54 +00:00
## 📖 API Documentation
2025-06-09 15:14:13 +00:00
2025-07-21 12:23:22 +00:00
### SmartProxy Class
2025-06-09 15:14:13 +00:00
2025-06-22 23:10:56 +00:00
```typescript
2025-07-21 12:23:22 +00:00
class SmartProxy {
2026-01-30 09:22:41 +00:00
constructor(options: ISmartProxyOptions);
2025-08-14 14:30:54 +00:00
// Lifecycle
2025-07-21 12:23:22 +00:00
start(): Promise<void>;
stop(): Promise<void>;
2026-01-30 09:22:41 +00:00
2025-08-14 14:30:54 +00:00
// Route Management
2025-07-21 12:23:22 +00:00
updateRoutes(routes: IRouteConfig[]): Promise<void>;
2026-01-30 09:22:41 +00:00
2025-08-14 14:30:54 +00:00
// Port Management
2025-07-21 12:23:22 +00:00
addListeningPort(port: number): Promise<void>;
removeListeningPort(port: number): Promise<void>;
getListeningPorts(): number[];
2026-01-30 09:22:41 +00:00
2025-08-14 14:30:54 +00:00
// Monitoring
2025-07-21 12:23:22 +00:00
getStatus(): IProxyStatus;
2026-01-30 09:22:41 +00:00
getMetrics(): IMetrics;
// Certificate Management
getCertificateInfo(domain: string): ICertStatus | null;
2025-06-09 15:14:13 +00:00
}
2025-06-22 23:10:56 +00:00
```
2025-06-13 17:22:31 +00:00
2026-01-30 09:22:41 +00:00
### Configuration Options
2025-06-22 23:10:56 +00:00
2025-08-14 14:30:54 +00:00
```typescript
2026-01-30 09:22:41 +00:00
interface ISmartProxyOptions {
routes: IRouteConfig[]; // Required: array of route configs
// ACME/Let's Encrypt
acme?: {
email: string; // Contact email
useProduction?: boolean; // Use production servers (default: false)
port?: number; // Challenge port (default: 80)
renewThresholdDays?: number; // Days before expiry to renew (default: 30)
};
// Defaults
defaults?: {
target?: { host: string; port: number };
security?: IRouteSecurity;
tls?: IRouteTls;
};
// Behavior
enableDetailedLogging?: boolean;
gracefulShutdownTimeout?: number; // ms to wait for connections to close
}
2025-08-14 14:30:54 +00:00
```
2025-03-07 14:34:49 +00:00
2024-04-14 18:10:41 +02:00
## License and Legal Information
2026-01-30 09:22:41 +00:00
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE ](./LICENSE ) file.
2024-04-14 18:10:41 +02:00
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
2020-02-23 19:04:53 +00:00
2026-01-30 09:22:41 +00:00
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.
Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.
2020-02-23 19:04:53 +00:00
2024-04-14 18:10:41 +02:00
### Company Information
2020-02-07 13:04:11 +00:00
2026-01-30 09:22:41 +00:00
Task Venture Capital GmbH
Registered at District Court Bremen HRB 35230 HB, Germany
2020-02-07 13:04:11 +00:00
2026-01-30 09:22:41 +00:00
For any legal inquiries or further information, please contact us via email at hello@task .vc.
2019-08-20 18:43:15 +02:00
2026-01-30 09:22:41 +00:00
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.