DevForward Internship 2025

During my internship at DevForward, I had the chance to dive deeper into modern full-stack development, learning both new frameworks and how to evaluate them critically.

BKKJS

1. Comparing Nuxt and Next.js

I started by learning Nuxt3 and NuxtUI, exploring how composable architecture and built-in SSR compared to my usual stack of Next.js and HeroUI. While Nuxt's developer experience felt a lot cleaner for state and routing, I found Next.js offered more maturity and flexibilities especially when it comes to the number of available libraries and React based component ecosystem. This comparison helped me better understand how Vue's reactivity and simplicity differ from React's expplicit dataflow and ecosystem depth.

2. Hands-On Experience with Nuxt

To get hands-on expereince with Nuxt, I built a couponing and OCR-based rewards app. Users can either upload their receipt photos or use the built-in camera to capture a photo of the receipt in realtime using JavaScript's getUserMedia function. Later, I implemented a spinning reward wheel using Vue3 Roulette library, complete with configurable reward probabilities, spin limits per user, and backend tracking - all according to my supervisor's specifications.

3. Backend Development with NestJS

After completing the Nuxt project, I got the chance to work extensively with NestJS and TypeORM, managing MySQL schemas, relationships, and query optimizations. I learned how Nest's dependency and modular design make large-scale backend systems cleaner and much easier to maintain. I also had the chance to work with Swagger to document the API endpoints and Jest to write unit tests.

4. PDF Generation Module with React-PDF

I also developed a PDF generation module using React-PDF to generate PDFs from HTML content (using NodeJS) to produce multilingual invoices and ensuring consistent typography and layout across all languages.

Although it was relatively easy to use, since React-PDF did not come with a built in table component, I had to manually build a table layout using <View> blocks - carefully calculating the widths, padding, and border alignment for every column. Pagination was also another challenge; when invoices had many line items, I needed to split the table across multiple pages, re-render the header, and maintain consistent spacing between pages. It took a mix of creative math, a lot of trial and error, and debugging the PDF render output using Postman API calls to get the desired result - but in the end, I was left with a fully dynamic, paginated invoices exported directly from the backend.