OMDB Terminal is a .NET-based CLI application and REST API designed to interact with the Open Movie Database (OMDb) API. Built with a focus on modern .NET architecture (.NET 10), performance, and developer experience. It serves as a proxy for movie data, has intelligent caching and OData search capabilities
The project is orchestrated using .NET Aspire, which handles containerization, telemetry, and infrastructure management, enabling feature implementation and easy setup
- OMDb API Integration: Search for movies by title or fetch detailed information using an IMDb ID
- Intelligent Caching (Cache-Aside Pattern): Movie details fetched from OMDb are automatically persisted to a local MySQL database. Subsequent requests for the same movie are served from the database - reducing API quota usage and improving response times
- Advanced Data Searching (OData): Perform complex, server-side filtering, sorting, and pagination on cached movie data directly via standard OData query strings (e.g.,
?$filter=contains(Title, 'Matrix')&$orderby=Year desc) - Complete Cache Management: Full CRUD (Create, Read, Update, Delete) operations available via a dedicated
CachedEntriescontroller
- Frontend (Terminal CLI): A standalone .NET console application - interacts with users and communicates with the backend via HTTP/OData
- Backend (REST API): A ASP.NET Core API providing endpoints for searching, fetching, and managing OMDB movie data
- .NET Aspire Orchestration: The entire solution (API, MySQL Database, and Telemetry) is managed by .NET Aspire, ensuring a one-click local setup with automatic container provisioning and connection string injection
- Entity Framework Core: Leverages EF Core with Pomelo MySQL for automated design-time migrations and data operations
- Service-Oriented Architecture: Strict separation of concerns, keeping Controllers thin by delegating business logic and database interactions to dedicated services (
IMovieService,ICachedEntriesService) - Dependency Injection: Utilizes a static
SimpleInjectorcontainer within the CLI for dependency resolution
The database relies on Entity Framework Core to manage relations between cached movies and their associated ratings
- MovieEntity: Stores comprehensive movie metadata (Title, Year, Plot, Poster, etc.) and tracks cache status (
IsDetailed,IsCustom) - RatingsEntity: Relies on a one-to-many relationship linking a movie to various rating sources (e.g., Internet Movie Database, Rotten Tomatoes, Metacritic)
- Swagger Integration: Full OpenAPI documentation with a custom Swagger filter (
ODataOperationFilter) to natively support OData parameter inputs within the Swagger UI - OpenTelemetry Dashboard: Real-time visibility into database queries, HTTP requests, and application logs via the .NET Aspire Dashboard
| .NET Aspire Dashboard | .NET Aspire Startup Logs |
![]() |
![]() |
| CLI Startup | Searching for Movies by Title |
![]() |
![]() |
| Opening a Searched Movie | Viewing Cached Entries |
![]() |
![]() |
| Opening a Cached Entry | Custom Cache Query |
![]() |
![]() |
| Custom Entry View | |
![]() |
Demo.mp4
| Searching for movies by title | Fetching and caching detailed movie data by IMDb ID |
![]() |
![]() |
Demo.mp4
As this project is designed primarily as a technical assessment, several intentional trade-offs were made to prioritize ease-of-use and rapid deployment:
- CLI/API Coupling: V1.1 featured tight UI/API coupling to establish a rapid MVP - V2 fully resolves this with a cleaner separation of concerns
- Automated Migrations: Entity Framework migrations run automatically on startup for ease of local testing - in production, these would be managed via secure, on-demand scripts to prevent data loss (among other issues)
- In-Repo API Key: A demo OMDb API key is deliberately included in the repository for a frictionless review process - exposing it here is safe as it exclusively accesses a free, read-only service
- .NET 10 SDK
- Docker Desktop (required for .NET Aspire to spin up MySQL)
- Git
Note: For ease of testing and review, this repository is pre-configured with a demo OMDb API key — you do not need to generate or configure your own to run the project. In a Real World Environment, this would not be the case!
Architecture Note:
.NET Aspire is a cloud-native orchestrator - it is designed to be deployed to cloud environments not run as a standalon desktop app
Because of this, you cannot simply run the standalone CLI executable without first spinning up the backend locally
The .NET SDK handles automatically provisioning the MySQL Docker containers and injecting the dynamic connection strings into the API proxy
Open your terminal and clone the repository to your local machine:
git clone https://github.com/JAllsop/Omdb-Terminal-CarTrack-JAllsop.git
cd Omdb-Terminal-CarTrack-JAllsopOpen a terminal in the root of the repository and run the setup script for your operating system
-
Windows
.\start-backend-windows.ps1
-
Mac/Linux
.\start-backend-windows.ps1
The scripts do the following:
- Check for and initalise .NET User Secrets
- Save the API key to .NET User Secrets - the included or user provided one
- Spin up the Aspire orchestrator (API & MySQL Database)
Leave the backend terminal running. Open a new terminal window, navigate to the CLI project, and run it:
cd OmdbTerminal/OmdbTerminal.Cli
dotnet runIf you prefer not to compile the frontend yourself using dotnet run, you can download the standalone CLI executable (available for Windows, macOS, and Linux) directly from the Releases tab
Important: You must still complete steps 1 & 2 above to run the Aspire backend infrastructure locally so the pre-compiled CLI has an API to connect to










