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.
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.