Flowfile v0.8.0 — Your Flows Can Run Themselves Now

Schedules Overview showing scheduler status, summary cards, and schedule list with interval and table trigger types

Full disclosure: I built Flowfile. This post is about a feature I just shipped and why I think it matters.

Up until this release, Flowfile was a tool you designed pipelines in. You’d build a flow visually, maybe export the code, and then figure out how to actually run it on a schedule. That “figure out” part usually meant cron, Airflow, or a very optimistic shell script.

v0.8.0 changes that. Flowfile now has a built-in scheduler. You can set an interval, trigger flows when data updates, or just hit “Run” from the catalog. No external orchestrator needed.

I’m not going to pretend this competes with Airflow or Dagster for serious production workloads. It doesn’t. But if you’ve ever had a lightweight data platform where you just needed a few flows to run on a timer without setting up a whole orchestration layer — this is that.

Schedules Overview showing scheduler status, summary cards, and schedule list with interval and table trigger types

The Part I’m Most Excited About: Table Triggers

Interval scheduling is useful but not interesting. “Run every 30 minutes” is solved. What I actually want to talk about is table triggers.

The idea is simple: instead of running a flow on a timer, you run it when the data it depends on changes. A Catalog Writer node overwrites a table, and any flow watching that table starts automatically.

In practice, this means you can chain flows together through data. Flow A produces a cleaned customer table. Flow B, which reads that table, runs as soon as Flow A finishes writing it. No coordination logic, no polling intervals to tune, no “let’s just run everything at 3am and hope the order works out.”

Three Types, and Why

Table trigger — a flow runs when a single table is refreshed. The obvious case. Your flow reads orders_raw, you set a trigger on orders_raw, and the flow runs every time that table gets new data.

Table set trigger — a flow runs when all tables in a set have been refreshed. This one would have saved me real time on past projects. Picture this: you have a reporting flow that joins three source tables — sales, inventory, and returns. You never want the report to run until all three are fresh. Without table set triggers, you solve this with retry logic, completion flags, or by scheduling everything sequentially and adding generous wait times. With table set triggers, you just list the three tables and the flow runs once all three have been updated. Declarative, no coordination code.

Unrestricted table trigger — a flow can also trigger on a table it doesn’t read. I debated whether to restrict triggers to only tables the flow actually depends on. Seemed cleaner. But I kept coming back to the same thought: I can’t predict every use case people will have. Maybe you want a notification flow to fire whenever a table updates. Maybe you have a cleanup job that should run after any write to a particular namespace. I don’t know. So I left it open.

How the Scheduler Works

Three modes, depending on how you run Flowfile:

If you’re on the desktop app or pip install, the scheduler runs inside the Flowfile process. Start and stop it from the Schedules tab. Simple.

If you want it running independently:

flowfile run flowfile_scheduler

That gives you a standalone background service that survives UI restarts. Only one scheduler instance runs at a time — there’s an advisory database lock with a heartbeat. If a scheduler dies, another can take over after 90 seconds.

For Docker, add one environment variable:

environment:
  - FLOWFILE_SCHEDULER_ENABLED=true

One thing I got right early: each flow can only have one active run at a time. If a flow is already running, new triggers are skipped. This prevents the cascade of overlapping runs that makes scheduling systems miserable to debug.

Running Flows Without a Schedule

Not everything needs to be automated. Sometimes you just want to run a registered flow right now and see what happens.

v0.8.0 adds a Run Flow button directly in the catalog’s flow detail panel. It spawns a subprocess, tracks the run in your history, and writes logs to ~/.flowfile/logs/. You can cancel a running flow at any time — it sends SIGTERM to the process.

When flows are running, an active runs banner appears at the top of the catalog. You can see what’s running, when it started, and cancel anything that’s taking too long.

Run History showing scheduled, manual, and designer runs with status, duration, and node completion

Being Honest About Scope

This scheduler is not Airflow. It doesn’t have retries with exponential backoff. It doesn’t have DAG-level dependency management across dozens of flows. It doesn’t have a distributed executor.

What it does have: zero additional infrastructure. If you can pip install flowfile, you have a scheduler. If you can run Docker Compose, you have a scheduler. For a team that needs three flows running on an interval and two more triggered by data updates, that’s enough. For a lightweight data platform that’s still figuring out what it needs, this could be the first proof of concept before anyone decides whether Airflow is worth the setup.

And if you outgrow it — that’s fine. Flowfile still generates standalone Python code. The flows don’t lock you in, and neither does the scheduler.

Where this is heading: table triggers are a step, not the destination. The real goal is that you shouldn’t be thinking about schedules at all. You should define how fresh your data needs to be, and the system figures out the rest. The catalog already tracks what each flow reads and writes, when tables were last updated, and how flows relate to each other. The pieces are there. Schedules are the scaffolding — data freshness is the building.

Try It

pip install flowfile

If you have questions or feedback, I’d genuinely love to hear it. Especially if you have a use case for table triggers I haven’t thought of — that’s exactly why I left them unrestricted.

Distributed Sagas, Locking, and Zero-Config Documentation in NodeJS

We are thrilled to announce the release of HazelJS v0.4.0, a major update focused on building resilient, distributed systems with ease. This release introduces two powerhouse packages—@hazeljs/saga and @hazeljs/distributed-lock—along with significant observability and developer productivity enhancements across our entire ecosystem.

As the HazelJS ecosystem continues to grow with 45+ specialized packages, we remain committed to our mission: providing a modular, AI-native framework that scales from local experiments to production-grade distributed architectures.

What’s New in v0.4.0?

1. Distributed Sagas (@hazeljs/saga) 🔄

Managing data consistency in microservices shouldn’t require complex, manual state machine code. @hazeljs/saga brings declarative distributed transactions to HazelJS with both Orchestration and Choreography patterns.

Key Features:

  • Dual Pattern Support: Choose between centralized orchestration or decentralized event-driven choreography
  • Decorator-Based API: Clean, intuitive @Saga, @SagaStep, and @OnEvent decorators
  • Auto-Compensation: Automatic reversal of completed steps in reverse order on failure
  • Status Management: Built-in tracking for STARTED, COMPENSATING, ABORTED, and COMPLETED states
  • Type-Safe Context: Pass state and data across transaction steps with full TypeScript support

Orchestration Example:

@Saga({ name: 'checkout-saga' })
export class CheckoutSaga {
  @SagaStep({ order: 1, compensate: 'cancelReservation' })
  async reserveProduct(ctx: SagaContext) {
    return await this.inventory.reserve(ctx.input.productId);
  }

  @SagaStep({ order: 2, compensate: 'refund' })
  async chargeUser(ctx: SagaContext) {
    return await this.payment.charge(ctx.input.userId, ctx.input.amount);
  }

  async cancelReservation(ctx: SagaContext) {
    await this.inventory.cancel(ctx.input.productId);
  }
}

Choreography Example:

@Injectable()
export class OrderService {
  @OnEvent('order.created')
  async handleOrderCreated(data: any) {
    // Automatically participates in distributed transaction
    await this.processOrder(data);
  }
}

2. Distributed Locking (@hazeljs/distributed-lock) 🔒

Race conditions can destroy data integrity in multi-node environments. @hazeljs/distributed-lock provides first-class mutual exclusion with Redis and In-Memory backends.

Key Features:

  • Decorator-Based API: @DistributedLock() for declarative method-level locking
  • Dynamic Key Resolution: Template placeholders ({id}, {user.token}) resolve from method arguments
  • Multiple Backends: Redis for production, Memory for development/testing
  • Atomic Mutual Exclusion: Exactly one process executes critical sections across all nodes
  • Configurable Strategies: Retry counts, delays, TTLs, and wait behaviors
  • Automatic Cleanup: Locks released on method completion, regardless of success/failure

Usage:

@Injectable()
export class StockService {
  @DistributedLock({ 
    key: 'update-stock-{{productId}}', 
    ttl: 10000, 
    wait: true 
  })
  async decrementStock(productId: string) {
    // Only one instance can execute this for the same productId
    return await this.db.update(productId);
  }
}

3. Zero-Config Swagger Documentation 📚

Documentation should keep up with your code, not slow you down. @hazeljs/swagger now features generateAutoSpec(), producing complete OpenAPI 3.0 specifications by scanning your module’s controllers—no decorators required.

Key Features:

  • Zero-Config Generation: Complete API specs without adding a single decorator
  • Path Discovery: Automatic detection of routes including complex path parameters
  • Smart Summaries: Infers operation descriptions from TypeScript method names
  • Method Mapping: Correct handling of GET, POST, PUT, DELETE, and PATCH methods
  • Default Schemas: Automatic inclusion of 400 and 500 error response schemas

How it works:

import { SwaggerService } from '@hazeljs/swagger';
import { AppModule } from './app.module';

@Service()
export class MyDocService {
  constructor(private readonly swagger: SwaggerService) {}

  getDocs() {
    // Discovers all controllers in AppModule and builds a spec
    return this.swagger.generateAutoSpec(AppModule, {
      title: 'Auto-Generated API',
      version: '1.0.0'
    });
  }
}

4. Core Observability: Performance Monitoring & Tracing 📊

Observability is now a first-class citizen in HazelJS Core with built-in performance monitoring and OpenTelemetry support.

Performance Monitoring:

// Built-in performance hooks
app.addPerformanceHook(BuiltinPerformanceHooks.slowRequestLogger(1000));
app.addPerformanceHook(BuiltinPerformanceHooks.memoryMonitor());
app.addPerformanceHook(BuiltinPerformanceHooks.metricsCollector());

// Custom hooks
app.addPerformanceHook({
  name: 'custom-metrics',
  onResponse: (metrics) => {
    // Track custom metrics
    this.metrics.track(metrics.duration, metrics.statusCode);
  }
});

Tracing with @trace:

@Service()
export class AIService {
  @Trace('ai.generate_summary')
  async summarize(text: string) {
    // Execution time automatically tracked and exported
    return await this.llm.call(text);
  }
}

Key Features:

  • Built-in Hooks: Slow request logger, memory monitor, rate limiter, metrics collector
  • Custom Hooks: Easy extension with custom performance monitoring
  • OpenTelemetry Integration: @Trace decorator for automatic span creation
  • Request Lifecycle: Full request tracking from start to finish
  • Performance Metrics: Active requests, response times, error rates

5. Enhanced Error Handling with EnhancedErrors 🚨

Consistency is key to a great developer experience. The new EnhancedErrors utility provides standardized error handling with helpful suggestions and context.

Key Features:

  • Standardized Errors: Consistent error codes and messages across your application
  • Helpful Suggestions: Automatic suggestions for common error scenarios
  • Context Preservation: Maintain request context and metadata
  • Type Safety: Full TypeScript support with proper error typing

Usage:

if (!user) {
  throw EnhancedErrors.notFound('User not found in registry');
}

if (!permission) {
  throw EnhancedErrors.unauthorized('Insufficient permissions');
}

if (validationError) {
  throw EnhancedErrors.validationFailed('Invalid input data');
}

Available Error Types:

  • validationFailed() – 400 Bad Request
  • unauthorized() – 401 Unauthorized
  • notFound() – 404 Not Found
  • methodNotAllowed() – 405 Method Not Allowed
  • rateLimitExceeded() – 429 Too Many Requests

6. Lazy Loading for Performance Optimization ⚡

New lazy loading capabilities in the Core DI container improve startup performance and reduce memory usage.

Key Features:

  • Module-Level Lazy: Load entire modules only when needed
  • Provider-Level Lazy: Individual providers instantiate on first use
  • Circular Dependency Handling: Graceful resolution of circular dependencies
  • Memory Optimization: Reduced initial memory footprint

Usage:

@Lazy()
@Injectable()
export class HeavyService {
  // Only instantiated when first resolved
}

@Module({
  lazy: true, // Entire module loads lazily
  providers: [HeavyService]
})
export class LazyModule {}

Ecosystem Highlights: 45+ Packages & Growing

HazelJS v0.4.0 continues our commitment to modularity with specialized packages for every need:

AI & Machine Learning 🤖

  • @hazeljs/ai – Multi-provider AI integration (OpenAI, Anthropic, Gemini, Cohere, Ollama)
  • @hazeljs/rag – Complete RAG + GraphRAG pipeline with 11 document loaders
  • @hazeljs/ml – Machine learning utilities and model management
  • @hazeljs/prompts – Prompt engineering and template management
  • @hazeljs/guardrails – AI safety and content filtering

Data & Persistence 💾

  • @hazeljs/data – Data pipelines and ETL workflows
  • @hazeljs/prisma – Prisma ORM integration
  • @hazeljs/typeorm – TypeORM integration
  • @hazeljs/cache – Multi-backend caching (Redis, Memory, etc.)

Distributed Systems 🌐

  • @hazeljs/saga – Distributed transaction management
  • @hazeljs/distributed-lock – Cross-node mutual exclusion
  • @hazeljs/kafka – Apache Kafka integration
  • @hazeljs/messaging – Message queue abstractions
  • @hazeljs/event-emitter – Event-driven architecture

Security & Auth 🔐

  • @hazeljs/auth – Authentication and authorization
  • @hazeljs/oauth – OAuth 2.0 integration
  • @hazeljs/casl – Access control lists
  • @hazelcs/security-headers – Security middleware

Observability & Monitoring 📈

  • @hazeljs/observability – Metrics and tracing
  • @hazeljs/inspector – Application inspection and debugging
  • @hazeljs/audit – Audit logging and compliance

Developer Tools 🛠️

  • @hazeljs/cli – Command-line interface and scaffolding
  • @hazeljs/testing – Enhanced testing utilities
  • @hazeljs/flow – Workflow and orchestration engine
  • @hazeljs/serverless – Serverless deployment support

Performance & Quality Improvements

Test Coverage: 83.73% 🎯

  • Performance Monitoring: 91.8% coverage
  • Enhanced Errors: 90.56% coverage
  • Container DI: 80.68% coverage
  • Overall Suite: 908 passing tests

TypeScript Enhancements

  • Strict Type Safety: Improved type inference across all packages
  • Better IntelliSense: Enhanced IDE support with proper exports
  • Reduced Bundle Size: Optimized imports and tree-shaking support

Developer Experience

  • Zero-Config Defaults: Sensible defaults that work out of the box
  • Progressive Enhancement: Start simple, add complexity as needed
  • Unified APIs: Consistent patterns across all packages

Migration Guide

From v0.3.x to v0.4.0

The migration is straightforward with most changes being additive:

# Update existing packages
npm update @hazeljs/core @hazeljs/swagger

# Add new packages (optional)
npm install @hazeljs/saga @hazeljs/distributed-lock

Breaking Changes

  • None – This is a fully backward-compatible release

Recommended Upgrades

  1. Add Performance Monitoring: Enable built-in performance hooks
  2. Implement Enhanced Errors: Standardize error handling
  3. Try Zero-Config Docs: Replace manual Swagger decorators with auto-generation
  4. Evaluate Distributed Needs: Consider sagas and locking for multi-node deployments

Getting Started

New Project Setup

# Install HazelJS CLI
npm install -g @hazeljs/cli

# Create new project
hazeljs create my-app

# Add distributed features
cd my-app
npm install @hazeljs/saga @hazeljs/distributed-lock

Existing Project Enhancement

# Update to latest
npm update @hazeljs/core @hazeljs/swagger

# Add new capabilities
npm install @hazeljs/saga @hazeljs/distributed-lock @hazeljs/ai

What’s Next?

Looking ahead to v0.5.0, we’re focusing on:

  • Advanced Observability: Distributed tracing and APM integrations
  • GraphQL Enhancements: Federation and subscription improvements
  • AI Agent Framework: Multi-agent systems with coordination
  • Edge Computing: Optimizations for serverless and edge deployments
  • Performance Tuning: Further optimizations for high-throughput scenarios

HazelJS v0.4.0 represents our most significant release yet, bringing enterprise-grade distributed systems capabilities to the Node.js ecosystem while maintaining the simplicity and developer experience that makes HazelJS special.

Join thousands of developers building the next generation of TypeScript applications with HazelJS.

HazelJS: The Future of Modular, AI-Native TypeScript Frameworks.

Related Links

📚 Documentation & Guides

🚀 Quick Start Resources

🔧 Package Documentation

🤖 AI & ML Resources

Turkcell, 5G hizmetini bazı bölgelerde erkenden kullanıma sundu

Turkcell, 5G hizmetini bazı bölgelerde kullanıma sundu

Turkcell, 5G hizmetini bazı bölgelerde kullanıma sunduTurkcell, kullanıcılar tarafından aktarıldığı kadarıyla normalde 1 Nisan itibarıyla başlayacak 5G hizmetini bazı bölgelerde erkenden kullanıma sundu. 5G destekli cihaz sahiplerine sürpriz yapan şirket, bu durum hakkında resmi bir açıklama paylaşmadı. Ulaştırma ve Altyapı Bakanı Abdulkadir Uraloğlu, Türk Telekom’un Teknoloji ve İnovasyon Merkezi’nin açılış töreninde 5G ile alakalı önemli açıklamalarda bulunmuştu. 5G yetkilendirme ihalesi neticesinde 3 milyar 534 milyon dolar gelir elde ettiklerini dile getiren Uraloğlu, açıklamasında şu ifadelere yer vermişti: “1 Nisan 2026 tarihinde ilk sinyalini alacağımız 5G hizmetlerini 2 yıl içerisinde ülkemizin her noktasına eriştirmeyi hedefliyoruz. 5G’ye geçişle birlikte mobil internet hızımız 10 kata yakın artacak; vatandaşlarımız daha hızlı, daha güvenilir ve daha kesintisiz bir haberleşme imkanına kavuşacak. 5G, yalnızca bir haberleşme teknolojisi değil, aynı zamanda üretim gücümüzü, hizmet kalitemizi ve teknolojik rekabetçiliğimizi aynı anda yükselten bir kalkınma altyapısıdır.” 5G’nin endüstriyel robotlardan otonom sürüş teknolojilerine, kritik altyapı yönetiminden akıllı şehir uygulamalarına kadar birçok alanda dönüşümü hızlandıracağını söyleyen Uraloğlu, […]

Turkcell, 5G hizmetini bazı bölgelerde erkenden kullanıma sundu yazısı ilk olarak Teknoloji haberleri – LOG üzerinde yayınlandı.

Önümüzdeki yıllarda 200 megapiksel ana kameraya sahip iPhone modelleri gelebilir

iPhone 17 Pro

iPhone 17 ProÇin merkezli güvenilir kaynaklardan Digital Chat Station tarafından ortaya atılan son iddiaya göre Apple, önümüzdeki yıllarda karşımıza 200 megapiksel ana kameraya sahip iPhone modelleri çıkarabilir. Şu anda 1/1.12 inç boyuta sahip bir 200 megapiksel kamera üzerinde testler gerçekleştirdiği iddia edilen şirket, satıştaki 17 Pro serisinde 48 megapiksellik ana kameraya yer veriyor ve bunun eylül ayında tanıtılacak 18 Pro serisinde de değişmesi beklenmiyor. Çok sayıda Android üreticisinin uzun zamandır kullandığı 200 megapiksellik sensörler, yüksek çözünürlük sayesinde geniş düzenleme olanakları sağlıyor.

Önümüzdeki yıllarda 200 megapiksel ana kameraya sahip iPhone modelleri gelebilir yazısı ilk olarak Teknoloji haberleri – LOG üzerinde yayınlandı.

Forza Horizon 6, çoklu kare oluşturma özellikli DLSS 4 desteğiyle çıkıyor

Forza Horizon 6 için resmi PC sistem gereksinimleri paylaşıldı

Forza Horizon 6 için resmi PC sistem gereksinimleri paylaşıldıBugün Nvidia tarafından yapılan resmi doğrulamaya göre Forza Horizon 6 çıkış gününde “çoklu kare oluşturma” özellikli DLSS 4 desteğine sahip olacak. Nvidia Reflex desteği de bulunan oyun; aynı zamanda ultra geniş ekran, sınırsız kare hızı, ray tracing yansımalar ve ray tracing global illumination aydınlatma gibi önemli özelliklerle geliyor. Bu detaylar doğrudan Nvidia ekran kartı sahiplerini ilgilendirirken, oyunda aynı zamanda AMD FSR 3, FSR 4 ve Intel XeSS 2.1 destekleri de yer alıyor. Dün oyunun resmi PC sistem gereksinimleri de paylaşılmıştı. Japonya’da geçen yapım için 1440p / High / 60 FPS özelinde tavsiye edilen işlemciler i5-12400F ile Ryzen 5 5600X, tavsiye edilen ekran kartları ise RTX 3060 Ti, RX 6700 XT ve Arc A580 oldu. En az 16 GB RAM ve SSD depolama biriminin istendiği yapım, 4K / en yüksek grafik ayarları / Ray Tracing / 60 FPS özelindeyse i7-12700K ya da Ryzen 7 770X işlemci, RTX 5070 Ti ya da […]

Forza Horizon 6, çoklu kare oluşturma özellikli DLSS 4 desteğiyle çıkıyor yazısı ilk olarak Teknoloji haberleri – LOG üzerinde yayınlandı.