出品者:jax

Cronicle is a multi-server task scheduler and runner with a web-based UI, supporting scheduled, repeating, and on-demand jobs with real-time stats, live log viewing, and plugin support in any language.
Cronicle is a Node.js-based multi-server task scheduler and job runner with a web UI, REST API, and plugin system. It replaces cron with a persistent server process that manages scheduled, repeating, and on-demand jobs across one or more machines. The typical buyer is a backend team embedding a self-hosted job orchestration layer into their infrastructure.
.github/ - GitHub issue templates and PR templatebin/ - CLI utilities: install, build, storage migration, shell/URL plugin runners, debug launcherdocs/ - Full documentation: setup, configuration, API reference, plugin development, web UI, inner workingshtdocs/ - Web front-end assets (CSS, JS pages, images, favicon) served by the embedded HTTP serverlib/ - Core server logic: engine, API handlers, comm layer, server discoverysample_conf/ - Example configuration files for bootstrapping a deploymentCHANGELOG.md - Version historyCODE_OF_CONDUCT.md - Project conduct policyLICENSE.md - MIT license textREADME.md - Project overview and feature summarypackage.json - Package manifest and dependency listnpm install async bcrypt-node chart.js font-awesome jquery jstimezonedetect mdi moment moment-timezone netmask pixl-args pixl-boot pixl-class pixl-cli pixl-config pixl-json-stream pixl-logger pixl-mail pixl-perf pixl-request pixl-server pixl-server-api pixl-server-storage pixl-server-user pixl-server-web
Node.js v16 or later is required. The server will exit with an error on older versions unless
CRONICLE_OLD=1is set in the environment (not recommended for production). No native addons or build steps beyondnpm installare required.bcrypt-nodeis a pure-JS bcrypt implementation and does not require node-gyp.
Copy the entire source/ directory into your project root, or install Cronicle as a standalone directory adjacent to your application (e.g., services/cronicle/).
Copy source/sample_conf/ to conf/ at the working directory where you intend to run the server:
cp -r source/sample_conf/ conf/
隔離されたサンドボックスを起動しサーバー側で実行 — ローカル設定不要。
このバージョンの Tetrees AI Review
This JavaScript library / package completed archive review. Structure, dependency manifests, documentation, functional source, and common risk patterns were checked by the Tetrees verification pipeline; runtime phases are stated separately.
Deterministic AVCP artifact review
パイプライン avcp-2026-08-04.1 · SHA-256 f22898289faebd60…
This version-scoped review deterministically inspects the submitted archive for structure, dependencies, documentation, functional source, and common malicious or high-risk signals. Build and test phases are reported as passed only after an isolated sandbox audition. It is not a guarantee of perfect security.
レビュー日 2026年8月4日
この製品をお使いのAI IDE・Webビルダー・クラウドIDEに直接取り込みます。
Tetreesを対応AI IDEに接続し、所有製品の一覧取得と検証済みZIPの取得を、販売者のアップロード権限を公開せずに行えます。
まだレビューがありません。
Sign in to join the discussion
Loading discussion…
Edit conf/config.json to set at minimum:
base_app_url - public URL of your Cronicle instancesecret_key - a long random string for session/API signingStorage - backend (filesystem by default; S3 and other adapters supported via pixl-server-storage)Set required environment variables before starting:
export CRONICLE_secret_key="your-secret-key-here"
# Optional overrides follow the pattern CRONICLE_<config_key>
Run the setup installer once to initialize storage:
node source/bin/install.js
Start the server:
node source/lib/main.js
# or via the control script:
bash source/bin/control.sh start
The web UI is available at http://localhost:3012 by default. Initial admin credentials are set during install.js.
For TypeScript projects, Cronicle has no TypeScript types. Reference it via require() or dynamic import() from a thin wrapper module. Do not add it to tsconfig.json paths; treat it as an opaque child process or sidecar service.
pixl-server)import PixlServer = require('pixl-server');
const server = new PixlServer({
__name: string;
__version: string;
configFile: string;
components: any[];
});
server.startup(callback: () => void): void;
PixlServer is the core application container. Pass it a configuration object with a configFile path and an ordered array of component modules. Call startup() to boot all components in sequence. This is the exact pattern used in lib/main.js and should be your entry point if you are embedding or extending Cronicle.
lib/engine.js)// Required as a PixlServer component
const CronicleEngine = require('./lib/engine.js');
// Registered on the PixlServer components array:
components: [
require('pixl-server-storage'),
require('pixl-server-web'),
require('pixl-server-api'),
require('pixl-server-user'),
CronicleEngine
]
The engine is the central Cronicle component. It manages the scheduler loop, job dispatch, inter-server communication, and failover. It is not instantiated directly; PixlServer loads it as a component and calls its lifecycle hooks (startup, shutdown, etc.).
bin/storage-cli.js)// Invoked from the command line; not a programmatic API.
// Usage:
// node bin/storage-cli.js list /jobs
// node bin/storage-cli.js get /global/schedule
// node bin/storage-cli.js put /global/schedule '{"items":[...]}'
storage-cli.js gives direct read/write access to the Cronicle storage backend from the shell. Use it to inspect or repair data, seed initial records in CI pipelines, or export snapshots. It reads the same conf/config.json as the main server.
Your Express app needs to launch Cronicle in-process during integration tests or as a managed subprocess in development. The server is started the same way lib/main.js does it.
import { execSync, spawn } from 'child_process';
import path from 'path';
// Run setup once (idempotent after first run)
execSync('node bin/install.js', {
cwd: path.resolve(__dirname, '../services/cronicle'),
stdio: 'inherit',
});
const child = spawn('node', ['lib/main.js'], {
cwd: path.resolve(__dirname, '../services/cronicle'),
env: {
...process.env,
CRONICLE_secret_key: process.env.CRONICLE_SECRET_KEY ?? 'dev-secret',
},
stdio: 'inherit',
});
child.on('exit', (code) => {
console.log(`Cronicle exited with code ${code}`);
});
process.on('exit', () => child.kill());
Cronicle exposes a JSON REST API. From your backend service, fire an event on demand using an API key.
import https from 'https';
interface CronicleRunEventResponse {
code: number;
description?: string;
ids?: string[];
}
async function triggerCronicleEvent(
baseUrl: string,
apiKey: string,
eventId: string
): Promise<CronicleRunEventResponse> {
const url = `${baseUrl}/api/app/run_event/v1`;
const body = JSON.stringify({ id: eventId });
return new Promise((resolve, reject) => {
const req = https.request(
url,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': apiKey,
},
},
(res) => {
let data = '';
res.on('data', (chunk) => (data += chunk));
res.on('end', () => resolve(JSON.parse(data)));
}
);
req.on('error', reject);
req.write(body);
req.end();
});
}
// Usage
const result = await triggerCronicleEvent(
'https://cronicle.example.com',
process.env.CRONICLE_API_KEY!,
'eXyZ1234abcd'
);
console.log(result);
Cronicle plugins communicate via JSON lines on stdin/stdout. Any language works; here is a Node.js plugin script you place in a path referenced by your event configuration.
// plugins/my-task.ts (compiled to JS and registered in Cronicle UI)
import * as readline from 'readline';
const rl = readline.createInterface({ input: process.stdin });
rl.on('line', (line) => {
const params = JSON.parse(line);
// params.event, params.job_id, params.params are available
const myConfig = params.params as { target_url?: string };
// Do your work here
console.error(`Processing job ${params.job_id}`);
// Report progress (0.0 - 1.0)
process.stdout.write(JSON.stringify({ progress: 0.5 }) + '\n');
// Final success response
process.stdout.write(
JSON.stringify({
complete: 1,
code: 0,
description: 'Task completed successfully',
}) + '\n'
);
});
.github/ - CI/CD templates; not required at runtime.bin/build-tools.js, bin/build.js - Asset bundling tools for the front-end; run during development, not at runtime.bin/changelog.js - Parses CHANGELOG.md for release tooling.bin/control.sh - Shell wrapper for start, stop, restart, status operations using run-detached.js.bin/debug.sh - Starts the server in foreground with verbose logging.bin/install.js - One-time setup: initializes storage records, creates default admin user.bin/run-detached.js - Daemonizes the main server process.bin/shell-plugin.js - Built-in plugin that runs arbitrary shell commands as Cronicle jobs.bin/storage-cli.js - Interactive CLI for reading/writing the storage backend directly.bin/storage-migrate.js - Migrates storage data between backend adapters.bin/storage-repair.js - Repairs corrupted or inconsistent storage records.bin/test-plugin.js - Utility to test a plugin script outside the scheduler.bin/url-plugin.js - Built-in plugin that performs HTTP/HTTPS requests as jobs.docs/ - Authoritative documentation for all subsystems; read before customizing.htdocs/ - Static web assets for the browser UI; served by pixl-server-web.lib/api.js - Registers all REST API route handlers on the web server component.lib/api/ - Subdirectory with individual API endpoint modules.lib/comm.js - Inter-server communication layer (primary-to-worker messaging).lib/discovery.js - Automatic LAN-based server discovery via UDP broadcast.lib/engine.js - Core scheduler engine; the single PixlServer component that owns all Cronicle logic.sample_conf/ - Example config.json, log_columns.json, and other config files to seed a new deployment.CRONICLE_OLD=1 only for testing.conf/config.json: The server crashes on startup with an unhelpful read error. Fix: copy sample_conf/ to conf/ before first run and populate required fields.secret_key left as default: Sessions signed with the sample key are insecure. Fix: always override via CRONICLE_secret_key environment variable or edit conf/config.json before deployment.storage.base_dir in config to a directory owned by the runtime user.WebServer.http_port in conf/config.json and restart.require(). If your project uses "type": "module" in package.json, require Cronicle modules via createRequire or keep your wrapper files as .cjs. Do not attempt to import them directly.I have a copy of the Cronicle multi-server task scheduler source in the `source/` directory of this project, and a USAGE.md file that describes its structure and APIs.
Please help me integrate Cronicle (upstream npm package: user@example.com) into my existing Node.js/TypeScript project by doing the following step by step:
1. Read USAGE.md and source/lib/main.js to understand how PixlServer is instantiated and started.
2. Create a wrapper module (e.g., services/cronicle.ts) that spawns or embeds Cronicle using the pattern from source/lib/main.js.
3. Wire in the configuration from source/sample_conf/ into a conf/ directory, substituting any secrets from environment variables using the CRONICLE_<key> convention.
4. Add a REST API client module that calls Cronicle's /api/app/* endpoints using the X-API-Key header.
5. Write a sample plugin in source/bin/ (following the shell-plugin.js pattern) that performs a task relevant to my application.
6. Make sure all imports use require() / CommonJS since Cronicle is not an ESM package.
Reference USAGE.md for all real export names and file paths. Do not invent APIs.
Cronicle is released under the MIT License (see source/LICENSE.md). It was written by Joseph Huckaby. Upstream repository and package: https://www.npmjs.com/package/Cronicle / https://github.com/jhuckaby/Cronicle.
This product’s unique contribution is clean room implementation of valuable code block into AVCP compatible standard.
完全なインストールガイドと統合プロンプトは購入後に解放されます。
Automation, Utilities & Developer Tools
無料