This episode covers the operational readiness of Dart applications: runbooks for deployment, monitoring, and incident response, logging and error reporting, release management and versioning, and maintaining long-lived Dart applications.

An application that can't be operated is an application that fails. Episode 19 covers operational readiness: preparing runbooks, monitoring service health, handling incidents, managing releases, and maintaining Dart applications over the long term.
Great code still needs process: how to deploy without fear, how to know a service is sick before users complain, and how to update dependencies without breaking production. These are the skills that separate a hobby project from a production system.
A runbook is a step-by-step document that guides operations. The deployment section should cover:
dart compile exe or flutter build.dart compile exe bin/server.dart -o bin/server
docker build -t myapp:1.4.0 .
docker push registry.example.com/myapp:1.4.0docker build -t myapp:1.4.0 . tags the image with a specific version so releases can be tracked and rolled back precisely.
Monitor service health before users are affected:
/healthz that verifies critical dependencies.An incident runbook defines who gets contacted, triage steps, and escalation — so when the alarm goes off, the team doesn't have to think from scratch.
Good logs are structured, not just strings:
import 'package:logging/logging.dart';
void main() {
final log = Logger('aplikasi');
log.info('Server dimulai', {'port': 8080});
log.warning('Latensi tinggi', {'ms': 1200});
}log.info('Server dimulai', {'port': 8080}) records a message with structured data that's easy to search and filter in a logging system. Avoid logging sensitive data like tokens.
Don't let exceptions vanish into logs. Send them to an error tracking service like Sentry, which groups errors, captures stack traces, and provides release context. Integrating via package:sentry takes minutes and gives far better visibility.
Combine runtime metrics — memory, heap, and throughput — with a dashboard. A Dart server can expose Prometheus metrics, while Flutter uses Firebase Performance or a similar solution to track frame time and startup.
Follow Semantic Versioning so users know the impact of an update:
For applications, integrate with git tags and CI: each v1.4.0 tag triggers an image build with the same label.
Automation makes releases consistent and free of manual errors:
git tag v1.4.0
git push origin v1.4.0git tag v1.4.0 marks a specific commit as a release. A pipeline that listens for tags can automatically build the image, run tests, and deploy — making a release a boring, reliable event.
Long-lived applications need regular maintenance:
dart pub outdateddart pub outdated shows packages that are behind on versions. Set a schedule for dependency updates, and always run the full test suite after dart pub upgrade.
The Dart ecosystem keeps moving: old APIs are retired, new features arrive. Monitor the breaking change list in SDK releases and plan gradual migrations. dart analyze will flag usage of deprecated APIs, helping you prepare early.
Maintainable code is code others understand (including you, six months from now): small functions, clear names, tests that describe behavior, and enough documentation. This investment pays off every time the application changes.
Key takeaways:
dart pub outdated keeps dependencies fresh.In the next episode 20, we'll cover real-world use cases and patterns — mobile, web, backend, and CLI use cases, the MVC, Clean Architecture, and reactive architecture patterns, data flow and state management patterns, and deployment and runtime models.