TimeVault was born from the struggle of digital information overload. We wanted to create a tool that doesn't just store data, but actually "understands" it, providing a bridge between raw information and meaningful memory.
The Inspiration
The project was inspired by the concept of a "Second Brain". We noticed that while we save countless bookmarks, notes, and images, we rarely revisit them because they lack context. We wanted to build a system where Artificial Intelligence acts as a curator, automatically summarizing content and making it searchable through natural language and visual analysis.
How We Built It
TimeVault is a multi-interface application (Web and Desktop) built with a shared Java backend.
The Tech Stack
Backend: Java 21 with Spring Boot 4.0.3.
Web UI: Vaadin 25, creating a "glass-morphism" aesthetic with modern CSS.
Desktop UI: JavaFX 21, following a strict layered architecture (DAO, BLL, GUI) with an observable AppModel.
Database: Microsoft SQL Server via JDBC and Spring Data JPA.
AI Engine: Google Gemini 2.0 Flash for text summarization and Gemini Vision for image analysis.
Architectural Approach
We utilized an observable pattern for the desktop application to ensure synchronization between the business logic and the UI.
The AppModel serves as the single source of truth, where properties like search text and selected type automatically trigger filtered views of the vault items.
What We Learned
AI Orchestration: Integrating the Gemini API taught us how to handle asynchronous AI responses and implement fallback mechanisms, such as local summarization, when API keys are missing.
Cross-Platform Consistency: Designing a shared service layer (VaultItemService) allowed us to keep business logic identical across the Vaadin web app and the JavaFX desktop app.
Database Schema Evolution: We learned to manage SQL schemas programmatically using a SchemaInitializer to ensure the database table is always ready for storage.
Challenges Faced
Port Conflicts: During development, we frequently encountered "Port 8080 already in use" errors, requiring us to manage active processes or reconfigure the Spring Boot server.
Environment Configuration: Managing sensitive data like the Gemini API key and database credentials required a robust properties-loading system that ignored local files via .gitignore to prevent security leaks.
JavaFX & IDEs: Running JavaFX directly from some IDEs can be difficult, which led us to create a dedicated DesktopLauncher class to bypass module path complexities.

Log in or sign up for Devpost to join the conversation.