Daily Update App is a Full-Stack internal tool that helps individuals or teams track and reflect on their daily progress. Submit your daily logs, review historical updates, and gain insight with analytics like word trends and update volume β all in a clean and responsive dashboard.
Built with the T3 Stack (Next.js, TypeScript, Prisma).
- β Submit daily updates via a simple form
- β Dashboard with all previous updates
- β Simulated login with dynamic user ID
- β Logout support
- β Filter updates by user ID
- β Dark/light theme toggle
- β
Analytics: updates per day, total count, top words
- β Date range filtering for updates
- β Search updates by content
- β Calendar-based word tracking per day
- β Clear filters button with elegant UI
- β Infinite scrolling (when no filters applied)
- β
Refactored UI components:
- Introduced reusable
PrimaryButton,ThemeToggle,AppHeaderTitlefor better UI consistency. - Extracted
NavBar,WordStatsByDay,UpdatesList, andUpdateIteminto reusable components. - Refined Dashboard structure: Cleaned up logic and made it more modular.
- Introduced reusable
- β Improved layout for better readability and organization in the Dashboard view.
- β Footer component added with links to personal portfolio, GitHub, LinkedIn, etc.
- β Added footer information: Added rights, technologies used, and social media links to the footer.
- β
Automated testing workflow:
- GitHub Actions CI runs tests on every push and pull request.
- Ensures test coverage and code stability using
Vitestandpnpm.
- Next.js 15 (App Router)
- Tailwind CSS 4 (with custom dark mode)
- TypeScript
- Prisma + SQLite
- Recharts for data visualization
pnpm install
pnpm exec prisma migrate dev --name init
pnpm dev- Run the app:
pnpm dev - Enter any name to simulate login.
- Submit updates via the "+ Add Update" button.
- Try searching or filtering updates by date.
- Explore the analytics on the right side!
- Toggle between dark and light themes using the button in the navbar.
| Login Screen | Navbar with User |
|---|---|
![]() |
![]() |
| Update Form | Form Code |
|---|---|
![]() |
![]() |
| Dashboard (Light) | Dashboard (Dark) |
|---|---|
![]() |
![]() |
| Date Filter & Search | Words by Day |
|---|---|
![]() |
![]() |
A lightweight login form asks the user for their name, which is saved in localStorage. All updates are filtered per user ID. Users can log out and switch users at any time.
/src/app: App Router structure/src/components: Reusable components
-
/src/components/DashboardView.tsx: Main dashboard logic and rendering
-
/src/context/AuthContext.tsx: Simulated auth logic
/src/hooks: Custom React hooks (e.g.,useDarkModefor theme toggling)/src/app/api/updates/route.ts: API route for creating and retrieving updates using Prisma/src/server/db.ts: Prisma client instance/prisma/schema.prisma: Prisma DB schema/img: Screenshots for README
This project uses a live PostgreSQL database hosted on Railway.
- Prisma ORM is used to manage the schema and database access.
DATABASE_URLis injected as an environment variable in Vercel.- The schema is pushed to Railway on local development using:
pnpm prisma db pushOriginally developed with SQLite for local testing.
Switched to PostgreSQL for production deployment to enable persistent cloud storage and full Vercel compatibility.
π https://dailyupdate-mac.vercel.app
You can:
- β Simulate login with any name
- β Submit daily updates
- β Filter by date or content
- β Visualize analytics on word usage
- β Enjoy dark/light mode with persistence
- β Explore the code on GitHub
This project includes a complete test suite using Vitest and React Testing Library.
NavBar: displays user, logout, title, theme toggleDashboardView: full integration, rendering, filter logicLoginScreen: form validation and inputUpdatesList&UpdateItem: update rendering, structureUpdateFilters: interaction testing (search, date)AddUpdateButton: button behavior and iconPrimaryButton: reusable button stylingThemeToggle: dark/light theme logicSummaryCard: displays total word countTopWordsPanel: pie chart for top wordsMostVerboseDay: day with highest word countWordStatsByDay: calendar-based word statsUpdatesPerDayChart: area chart with tooltip rendering
pnpm vitestpnpm vitest devThis project uses GitHub Actions to run all Vitest tests on every push and pull request to the main branch. It ensures code quality and prevents regressions automatically.
Workflow: .github/workflows/ci.yml
- π Switched to PostgreSQL using Railway for persistent cloud database
- π Updated
.envand Prisma schema to support production environments - π Deployed final version to Vercel with public URL and working authentication
- β Added real-time updates saving, retrieval, filtering, and analytics
- π§Ό Fixed
NavBarrendering issue and theme toggle hydration glitch - π Custom favicon added for a polished production look
- π Fixed minor bugs to deploy on Vercel
- π§ͺ Full test coverage using Vitest and Testing Library:
- Added tests for all major components including:
NavBar,LoginScreen,UpdatesList,UpdateItem,ThemeToggle,TopWordsPanel,WordStatsByDay, and more. - Created
DashboardView.integration.test.tsxandDashboardView.smoke.test.tsxfor full render validation.
- Added tests for all major components including:
- β»οΈ Refactored test structure into
__tests__folder. - β
Improved
AuthContextanduseDarkModemocks for consistent rendering. - π Fixed multiple failing test cases (e.g.,
NavBar,Log outbutton, dark/light icons). - β Improved test reliability by addressing async rendering issues and DOM role errors.
- β»οΈ Component refactoring:
- Refactored
DashboardViewwith separate logic for updates and filtering into isolated components. - Modularized and improved code with reusable components:
PrimaryButtonfor consistent button styling.ThemeTogglefor dark/light mode toggling.AppHeaderTitlefor standardized header titles.UpdateListandUpdateItemfor modular update list rendering.
- Refactored
- β Footer added with links to GitHub, LinkedIn, Portfolio, and more.
- β Improved scroll behavior by making the footer responsive and hiding it when not in use.
- β»οΈ Component refactoring:
- Introduced reusable
PrimaryButtoncomponent for consistent button styles. - Extracted
ThemeToggleinto a standalone component. - Extracted
AppHeaderTitleinto a dedicated component. - Simplified and cleaned up
NavBarby using the new reusable components.
- Introduced reusable
- β Confirmed all existing tests pass.
- β Improved structure and readability of UI logic.
- β
Refactored dashboard update list into:
UpdatesList: handles update list rendering.UpdateItem: handles individual update item.
- β Improved separation of concerns for better readability and testability.
- β Separated date filtering logic into isolated test file
- β
Added tests for:
- Filtering updates by date range
- Combining search and date filters
- Navigation bar (NavBar) component behavior
- β
Improved test structure and reliability for
DashboardView - β Minor structural refinements in testing logic
- β Refactored dashboard to support date range filtering
- β Added search bar for content filtering
- β Built "Words by Day" calendar widget
- β Created "Clear Filters" button with polished UI
- β Enabled infinite scrolling when no filters are applied
- β Fixed filtering logic to properly combine date + search
- β Visual adjustments and layout improvements
- β
Added analytics widgets:
- Updates per day (area chart)
- Top 5 words (pie chart)
- Most verbose day
- β Visual polish: transitions, hover states, shadows
- β Core app logic
- β Submit updates with user simulation
- β View update history
- β Dark/light theme with localStorage persistence
This project is licensed under the MIT License Β© 2025 Marcos Astudillo







