From df6f488ccd084d0eec192a76a1d2be04b563d4f1 Mon Sep 17 00:00:00 2001 From: SauravDhakal Date: Wed, 1 Apr 2026 08:06:08 +0545 Subject: [PATCH] feat: Init with clean layout --- .gitignore | 21 + CUSTOMIZATION.md | 532 ++++++++++++++++++ assets/css/extended/custom.css | 53 +- content/notes/_index.md | 4 + content/notes/demo.md | 15 +- content/posts/_index.md | 4 + .../posts/seperation-of-concern-in-nextjs.md | 141 ----- content/search.md | 11 +- hugo.yaml | 31 +- layouts/notes/list.html | 30 + public/404.html | 2 +- ...3f9b918c48d08dac9a2e1ef0a7ca49d1f18ddb.css | 7 - .../categories/backend-development/index.html | 3 - .../categories/backend-development/index.xml | 20 - .../backend-development/page/1/index.html | 1 - public/categories/index.html | 2 +- public/categories/index.xml | 21 +- public/categories/nestjs/index.html | 3 - public/categories/nestjs/index.xml | 20 - public/categories/nestjs/page/1/index.html | 1 - public/index.html | 5 +- public/index.json | 2 +- public/index.xml | 19 +- public/notes/demo/index.html | 7 +- public/notes/index.html | 5 +- public/notes/index.xml | 15 +- public/notes/page/1/index.html | 1 - public/page/1/index.html | 2 +- public/posts/index.html | 4 +- public/posts/index.xml | 14 +- public/posts/page/1/index.html | 2 +- .../index.html | 32 -- public/robots.txt | 2 +- public/search/index.html | 2 +- public/sitemap.xml | 41 +- public/tags/architecture/index.html | 3 - public/tags/architecture/index.xml | 20 - public/tags/architecture/page/1/index.html | 1 - public/tags/index.html | 2 +- public/tags/index.xml | 30 +- public/tags/nestjs/index.html | 3 - public/tags/nestjs/index.xml | 20 - public/tags/nestjs/page/1/index.html | 1 - public/tags/typescript/index.html | 3 - public/tags/typescript/index.xml | 20 - public/tags/typescript/page/1/index.html | 1 - 46 files changed, 747 insertions(+), 432 deletions(-) create mode 100644 .gitignore create mode 100644 CUSTOMIZATION.md create mode 100644 content/notes/_index.md create mode 100644 content/posts/_index.md delete mode 100644 content/posts/seperation-of-concern-in-nextjs.md create mode 100644 layouts/notes/list.html delete mode 100644 public/assets/css/stylesheet.1819d1b52fd9f2af4d88316fde3f9b918c48d08dac9a2e1ef0a7ca49d1f18ddb.css delete mode 100644 public/categories/backend-development/index.html delete mode 100644 public/categories/backend-development/index.xml delete mode 100644 public/categories/backend-development/page/1/index.html delete mode 100644 public/categories/nestjs/index.html delete mode 100644 public/categories/nestjs/index.xml delete mode 100644 public/categories/nestjs/page/1/index.html delete mode 100644 public/notes/page/1/index.html delete mode 100644 public/posts/seperation-of-concern-in-nextjs/index.html delete mode 100644 public/tags/architecture/index.html delete mode 100644 public/tags/architecture/index.xml delete mode 100644 public/tags/architecture/page/1/index.html delete mode 100644 public/tags/nestjs/index.html delete mode 100644 public/tags/nestjs/index.xml delete mode 100644 public/tags/nestjs/page/1/index.html delete mode 100644 public/tags/typescript/index.html delete mode 100644 public/tags/typescript/index.xml delete mode 100644 public/tags/typescript/page/1/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ddfab72 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# Hugo build output +public/ +resources/_gen/ + +# Hugo lock file +.hugo_build.lock + +# OS files +.DS_Store +Thumbs.db + +# Editor files +*.swp +*.swo +*~ +.idea/ +.vscode/ + +# Environment files +.env +.env.local diff --git a/CUSTOMIZATION.md b/CUSTOMIZATION.md new file mode 100644 index 0000000..ba55771 --- /dev/null +++ b/CUSTOMIZATION.md @@ -0,0 +1,532 @@ +# Hugo + PaperMod Customization Guide + +This guide covers how to customize your Hugo portfolio site using the PaperMod theme. + +--- + +## Table of Contents + +1. [Project Structure](#project-structure) +2. [Development Workflow](#development-workflow) +3. [Configuration (hugo.yaml)](#configuration-hugoyaml) +4. [Adding Content](#adding-content) +5. [Creating New Sections](#creating-new-sections) +6. [Customizing Styles (CSS)](#customizing-styles-css) +7. [Overriding Layouts](#overriding-layouts) +8. [Common Customizations](#common-customizations) +9. [Deployment](#deployment) + +--- + +## Project Structure + +``` +MyPortfolio/ +├── archetypes/ # Templates for new content +├── assets/ +│ └── css/ +│ └── extended/ +│ └── custom.css # YOUR custom CSS (this gets merged) +├── content/ +│ ├── posts/ # Long-form articles +│ │ └── _index.md # Section config +│ ├── notes/ # Short notes/TILs +│ │ └── _index.md # Section config +│ └── search.md # Search page +├── layouts/ +│ ├── partials/ # Override theme partials +│ │ └── footer.html # Custom footer +│ └── notes/ # Section-specific layouts +│ └── list.html # Custom notes list +├── static/ +│ └── files/ # Static files (CV.pdf, images, etc.) +├── themes/ +│ └── PaperMod/ # Theme (git submodule - DON'T edit) +├── hugo.yaml # Main configuration +└── .gitignore # Ignores public/, etc. +``` + +### Key Principle: Never Edit the Theme Directly + +The `themes/PaperMod/` folder is a git submodule. To customize: +- **CSS**: Add to `assets/css/extended/custom.css` +- **Layouts**: Copy the file from `themes/PaperMod/layouts/` to `layouts/` and modify +- **Config**: Everything in `hugo.yaml` + +--- + +## Development Workflow + +### Local Development + +```bash +# Start dev server (watches for changes) +hugo serve + +# With drafts visible +hugo serve -D + +# Build for production (outputs to public/) +hugo build --minify +``` + +### Why `public/` is Gitignored + +- `public/` is generated output - it's rebuilt fresh every time +- Your CI/CD (GitHub Actions) builds it during deployment +- Never commit build artifacts to git + +### Git Workflow + +```bash +# After making changes +git add . +git commit -m "Add new post about X" +git push origin master # Triggers deployment +``` + +--- + +## Configuration (hugo.yaml) + +### Key Sections + +#### Site Basics +```yaml +baseURL: "/" # Use "/" for relative URLs (works on localhost + prod) +relativeURLs: true # Makes all URLs relative +title: Saurav Dhakal +languageCode: en-us +theme: ["PaperMod"] +``` + +#### Menu (Header Navigation) +```yaml +menu: + main: + - identifier: posts # Internal ID + name: Posts # Display name + url: /posts/ # URL path + weight: 10 # Order (lower = first) + - identifier: notes + name: Notes + url: /notes/ + weight: 20 + - identifier: tags + name: Tags + url: /tags/ + weight: 30 + - identifier: search + name: Search + url: /search/ + weight: 40 +``` + +#### Home Page Info +```yaml +params: + homeInfoParams: + Title: "Hi there 👋, I'm Saurav!" + Content: > + I'm a software engineer... +``` + +#### Social Icons +```yaml +params: + socialIcons: + - name: github + url: "https://github.com/yourusername" + - name: linkedin + url: "https://linkedin.com/in/yourusername" + - name: x + url: "https://x.com/yourusername" +``` + +Available icons: github, linkedin, x, twitter, email, rss, youtube, instagram, facebook, stackoverflow, etc. + +--- + +## Adding Content + +### New Post + +```bash +hugo new posts/my-new-post.md +``` + +Or manually create `content/posts/my-new-post.md`: + +```markdown +--- +title: "My New Post" +date: 2025-08-20 +summary: "A brief description for the list view" +tags: ["tag1", "tag2"] +categories: ["Category"] +draft: false +ShowToc: true +TocOpen: false +--- + +Your content here... +``` + +### New Note + +Create `content/notes/my-note.md`: + +```markdown +--- +title: "Quick TIL" +date: 2025-08-20 +summary: "Today I learned about X" +tags: ["til"] +--- + +Short content here... +``` + +### Front Matter Options + +| Field | Description | +|-------|-------------| +| `title` | Post title | +| `date` | Publication date (YYYY-MM-DD) | +| `summary` | Short description for list views | +| `tags` | Array of tags | +| `categories` | Array of categories | +| `draft` | If `true`, won't be published | +| `ShowToc` | Show table of contents | +| `TocOpen` | TOC expanded by default | +| `ShowReadingTime` | Override global setting | +| `ShowWordCount` | Override global setting | +| `cover.image` | Cover image path | + +--- + +## Creating New Sections + +### Example: Adding a "Projects" Section + +1. **Add to menu** in `hugo.yaml`: +```yaml +menu: + main: + # ... existing items + - identifier: projects + name: Projects + url: /projects/ + weight: 25 +``` + +2. **Create content directory**: +```bash +mkdir -p content/projects +``` + +3. **Create section index** `content/projects/_index.md`: +```markdown +--- +title: "Projects" +description: "Things I've built" +--- +``` + +4. **Add project pages** `content/projects/my-project.md`: +```markdown +--- +title: "My Cool Project" +date: 2025-01-15 +summary: "A brief description" +tags: ["golang", "cli"] +--- + +Project description... +``` + +5. **(Optional) Custom layout** - If you want projects to look different, create `layouts/projects/list.html` + +--- + +## Customizing Styles (CSS) + +### Where to Add CSS + +**Only edit**: `assets/css/extended/custom.css` + +PaperMod automatically includes this file. You don't need to import it anywhere. + +### CSS Variables (Theme Colors) + +PaperMod uses CSS variables. Override them in your custom.css: + +```css +:root { + /* Light mode */ + --primary: #282828; /* Main text */ + --secondary: #3c3836; /* Secondary text */ + --tertiary: rgb(214, 214, 214); /* Borders, etc */ + --theme: rgb(255, 255, 255); /* Background */ + --entry: rgb(255, 255, 255); /* Card background */ +} + +:root[data-theme="dark"] { + /* Dark mode */ + --primary: #fbf1c7; + --secondary: #ebdbb2; + --theme: #181818; + --entry: rgb(46, 46, 51); +} +``` + +### Common CSS Customizations + +#### Change fonts +```css +@import url("https://fonts.googleapis.com/css2?family=Your+Font&display=swap"); + +body { + font-family: "Your Font", sans-serif; +} +``` + +#### Style links +```css +main a { + text-decoration: underline; + text-decoration-color: var(--green); +} + +main a:hover { + background-color: var(--green); + color: white; +} +``` + +#### Customize post cards +```css +main .post-entry { + border: 2px solid #383838; + background-color: var(--entry); + border-radius: 8px; +} +``` + +--- + +## Overriding Layouts + +### How Layout Override Works + +Hugo looks for templates in this order: +1. `layouts/` (your overrides) +2. `themes/PaperMod/layouts/` (theme defaults) + +### To Override a Template + +1. Find the file in `themes/PaperMod/layouts/` +2. Copy it to the same path in `layouts/` +3. Modify your copy + +### Common Files to Override + +| File | Purpose | +|------|---------| +| `layouts/partials/header.html` | Site header/nav | +| `layouts/partials/footer.html` | Site footer | +| `layouts/partials/post_meta.html` | Post metadata (date, read time) | +| `layouts/_default/list.html` | List pages (posts, tags) | +| `layouts/_default/single.html` | Individual post/page | + +### Example: Simpler Footer + +Your `layouts/partials/footer.html` already overrides the theme's footer. + +### Section-Specific Layouts + +Create `layouts/SECTION_NAME/list.html` for a custom list layout for that section. + +Example: `layouts/notes/list.html` - custom compact layout for notes. + +--- + +## Common Customizations + +### Disable Reading Time for a Section + +In the section's `_index.md`: +```markdown +--- +title: "Notes" +ShowReadingTime: false +--- +``` + +Or per-post in front matter. + +### Add a Static Page (About, Contact) + +Create `content/about.md`: +```markdown +--- +title: "About" +layout: "single" +url: "/about/" +--- + +About me content... +``` + +Add to menu: +```yaml +menu: + main: + - identifier: about + name: About + url: /about/ + weight: 50 +``` + +### Add Favicon + +1. Place favicon files in `static/`: + - `static/favicon.ico` + - `static/favicon-16x16.png` + - `static/favicon-32x32.png` + - `static/apple-touch-icon.png` + +2. Update `hugo.yaml`: +```yaml +params: + assets: + favicon: "/favicon.ico" + favicon16x16: "/favicon-16x16.png" + favicon32x32: "/favicon-32x32.png" + apple_touch_icon: "/apple-touch-icon.png" +``` + +### Enable Comments (Disqus) + +```yaml +params: + comments: true + +disqusShortname: "your-disqus-shortname" +``` + +### Add Google Analytics + +Already configured in your `hugo.yaml`: +```yaml +googleAnalytics: "G-XXXXXXXXXX" +``` + +--- + +## Deployment + +### Current Setup (GitHub Actions → SSH/SCP) + +Your `.github/workflows/deploy.yml`: +1. Triggers on push to `master` +2. Builds site with `hugo build --minify` +3. Deploys `public/` via SCP to your server + +### Required GitHub Secrets + +Set these in your repo's Settings → Secrets: +- `SSH_HOST` - Your server hostname/IP +- `SSH_USER` - SSH username +- `SSH_KEY` - Private SSH key +- `SSH_PORT` - SSH port (usually 22) + +### Alternative: GitHub Pages + +If you want to use GitHub Pages instead: + +1. Change workflow to use `peaceiris/actions-gh-pages` +2. Set `baseURL` to `https://yourusername.github.io/repo-name/` + +### Alternative: Netlify/Vercel + +These platforms auto-detect Hugo and build for you: +1. Connect your GitHub repo +2. Set build command: `hugo --minify` +3. Set publish directory: `public` + +--- + +## Quick Reference + +### Useful Commands + +```bash +# Local dev +hugo serve -D # Serve with drafts + +# Create content +hugo new posts/title.md # New post +hugo new notes/title.md # New note + +# Build +hugo build --minify # Production build + +# Debug +hugo config # Show full config +hugo list all # List all content +``` + +### File Locations + +| What | Where | +|------|-------| +| Config | `hugo.yaml` | +| Custom CSS | `assets/css/extended/custom.css` | +| Posts | `content/posts/` | +| Notes | `content/notes/` | +| Static files | `static/` | +| Layout overrides | `layouts/` | + +--- + +## Troubleshooting + +### Links Go to Production URL in Dev + +Fixed by setting: +```yaml +baseURL: "/" +relativeURLs: true +``` + +### Changes Not Showing + +1. Hard refresh browser (Ctrl+Shift+R) +2. Clear `public/` folder: `rm -rf public/` +3. Restart hugo serve + +### Theme Not Loading + +```bash +git submodule update --init --recursive +``` + +### Search Not Working + +Ensure `hugo.yaml` has: +```yaml +outputs: + home: + - HTML + - RSS + - JSON # Required for search +``` + +--- + +## Resources + +- [Hugo Documentation](https://gohugo.io/documentation/) +- [PaperMod Wiki](https://github.com/adityatelange/hugo-PaperMod/wiki) +- [PaperMod Demo](https://adityatelange.github.io/hugo-PaperMod/) diff --git a/assets/css/extended/custom.css b/assets/css/extended/custom.css index f2f9dbb..a872c15 100644 --- a/assets/css/extended/custom.css +++ b/assets/css/extended/custom.css @@ -66,7 +66,7 @@ } body { - font-family: "Space Grotesk", sans-serif; + font-family: "Space Grotesk", monospace; } nav #menu span { @@ -139,3 +139,54 @@ main .post-entry { color: var(--post-entry-fg); border: 2px solid #383838; } + +/* * +* NOTES SECTION - Compact list style +* */ +.notes-list { + list-style: none; + padding: 0; + margin: 0; +} + +.note-item { + padding: 12px 0; + border-bottom: 1px solid var(--tertiary); +} + +.note-item:last-child { + border-bottom: none; +} + +.note-item a { + display: flex; + justify-content: space-between; + align-items: baseline; + text-decoration: none; + gap: 16px; +} + +.note-item a:hover .note-title { + text-decoration: underline; + text-decoration-color: var(--green); + text-decoration-thickness: 2px; +} + +.note-title { + font-size: 1.1rem; + font-weight: 500; + color: var(--primary); +} + +.note-date { + font-size: 0.85rem; + color: var(--secondary); + white-space: nowrap; +} + +.note-summary { + margin: 4px 0 0 0; + font-size: 0.9rem; + color: var(--secondary); + line-height: 1.4; +} diff --git a/content/notes/_index.md b/content/notes/_index.md new file mode 100644 index 0000000..45afe4b --- /dev/null +++ b/content/notes/_index.md @@ -0,0 +1,4 @@ +--- +title: "Notes" +description: "Quick notes, TILs, and short thoughts" +--- diff --git a/content/notes/demo.md b/content/notes/demo.md index dab6919..09cbd4f 100644 --- a/content/notes/demo.md +++ b/content/notes/demo.md @@ -1,8 +1,11 @@ --- -title: "Search" # in any language you want -layout: "search" # necessary for search -# url: "/archive" -# description: "Description for Search" -summary: "search" -placeholder: "placeholder text in search input box" +title: "Sample Note" +date: 2025-08-20 +# summary: "This is a sample note to demonstrate the notes section" +tags: ["example"] +draft: false --- + +This is a sample note. Notes are meant to be short, quick thoughts or TILs (Today I Learned). + +Delete this file and add your own notes here! diff --git a/content/posts/_index.md b/content/posts/_index.md new file mode 100644 index 0000000..5adcb66 --- /dev/null +++ b/content/posts/_index.md @@ -0,0 +1,4 @@ +--- +title: "Posts" +description: "Long-form articles on software development, architecture, and engineering" +--- diff --git a/content/posts/seperation-of-concern-in-nextjs.md b/content/posts/seperation-of-concern-in-nextjs.md deleted file mode 100644 index b77201d..0000000 --- a/content/posts/seperation-of-concern-in-nextjs.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -author: ["Saurav Dhakal"] -title: "Understanding Separation of Concerns (SoC) in NestJS" -date: "2025-08-19" -summary: "A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers." -tags: ["nestjs", "typescript", "architecture"] -categories: ["Backend Development", "NestJS"] -series: ["NestJS"] -ShowToc: true -TocOpen: false ---- - -When building applications, one of the most important design principles to keep in mind is **Separation of Concerns (SoC)**. NestJS, with its modular architecture, makes applying SoC almost effortless — but understanding _why_ it matters and _how_ to use it properly will help you write cleaner, testable, and future-proof code. - -## What is Separation of Concerns and Why it Matters? - -The basic idea is: - -> A program should be divided into distinct sections, where each section addresses a single responsibility. - -In simpler terms: - -- Every part of the code should have **one clear job**. -- This makes the code easier to **understand, test, and maintain**. - -Lets take an analogy of a coffee shop to better understand this concept. A coffee shop has multiple employees with distinct roles: - -- The **cashier** handles payments. -- The **barista** makes coffee. -- The **inventory manager** tracks beans and supplies. - -If one person did everything, the system would collapse into chaos. The same goes for software. Each role has a single responsibility, and no one does everything. - -Suppose you’re building an **eCommerce platform**. Without SoC, all the logic might end up in one massive file — authentication, product catalog, payments, inventory, order processing. This quickly becomes **spaghetti code**: hard to read, impossible to test, and dangerous to modify. - -With **Separation of Concerns**, you break it down into modules: - -- **Auth Module** → Handles user registration, login, JWT tokens. -- **Products Module** → Manages product catalog and search. -- **Checkout Module** → Orchestrates payment and order creation. -- **Inventory Module** → Keeps track of stock levels. - -Each module **does one thing**. When you need to upgrade your payment provider or switch databases, you only touch the **Checkout Module** or **Inventory Module** — everything else continues to work. - -This approach of programming enhances: - -- **Readability:** Developers can understand a piece of code without knowing the whole system. -- **Maintainability:** Changing one part (like authentication) won’t break unrelated features. -- **Testability:** Smaller, focused components are easier to test in isolation. -- **Flexibility:** You can swap implementations (e.g., switch databases or auth providers) without rewriting the whole app. - ---- - -## Separation of Concerns in NestJS - -One of the reasons developers love NestJS is that it **bakes Separation of Concerns into its architecture**. By default, NestJS applications are structured around three core building blocks: **modules, services, and controllers**. Each of these naturally maps to a specific concern. - -### 1. **Modules** → Group related functionality - -- A module acts like a **container** for a specific domain or feature. -- Examples: `UsersModule`, `AuthModule`, `PostsModule`. -- A module owns everything related to its concern and can expose services for other modules to use. - -Think of modules as **departments in a company** — each department specializes in one thing but can collaborate with others when needed. - -### 2. **Services** → Handle business logic - -- Services handle the actual “work” of the application. -- Example: `UsersService` deals only with user data. -- Example: `AuthService` deals only with authentication and tokens. -- Services should **not depend on controllers** or contain HTTP logic. - -This makes them **reusable**. A service can be used in REST controllers, GraphQL resolvers, or even a CLI command without modification. - -### 3. **Controllers** → Handle HTTP requests - -- Controllers act as the **entry point** for requests. -- Their job is to **receive a request, delegate the work to a service, and return a response**. -- They should remain thin, containing no business logic. - -This ensures controllers are simple and services stay focused. - ---- - -## Example: Auth and Users in NestJS - -Let’s look at a real-world scenario: Implementing **authentication**. - -### UserService in UsersModule - -```tsx -@Injectable() -export class UsersService { - constructor(private prisma: PrismaService) {} - - findByEmail(email: string) { - return this.prisma.user.findUnique({ where: { email } }); - } - - create(data: any) { - return this.prisma.user.create({ data }); - } -} -``` - -UserService is only concerned with **managing user data**. It knows nothing about JWTs, passwords, or authentication. - -### AuthService in AuthModule - -```tsx -@Injectable() -export class AuthService { - constructor( - private usersService: UsersService, - private jwtService: JwtService, - ) {} - - async validateUser(email: string, password: string) { - const user = await this.usersService.findByEmail(email); - // validate password... - return user; - } - - login(user: any) { - return { access_token: this.jwtService.sign({ sub: user.id }) }; - } -} -``` - -AuthService handles **authentication logic**. It uses `UsersService`, to work with user data (findByEmail) but doesn’t leak authentication concerns back into it. -A clear boundary is maintained: `UsersService` manages user data, `AuthService` manages auth. - ---- - -## Conclusion - -Separation of Concerns isn’t just a design principle — it’s a mindset. By keeping each part of your application focused on a single responsibility, you reduce complexity, make testing easier, and keep your codebase flexible as your project grows. - -NestJS makes this natural with its **modules, services, and controllers**. If you embrace SoC from the start, you’ll end up with applications that are not only **scalable** but also a joy to maintain. - -(Proofread by ChatGPT) diff --git a/content/search.md b/content/search.md index dab6919..9edd52a 100644 --- a/content/search.md +++ b/content/search.md @@ -1,8 +1,7 @@ --- -title: "Search" # in any language you want -layout: "search" # necessary for search -# url: "/archive" -# description: "Description for Search" -summary: "search" -placeholder: "placeholder text in search input box" +title: "Search" +layout: "search" +url: "/search/" +summary: "Search posts and notes" +placeholder: "Search..." --- diff --git a/hugo.yaml b/hugo.yaml index d7e0c1b..b5aa4e9 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -1,5 +1,5 @@ -# DEmo -baseURL: "https://sauravdhakal.com.np/" +baseURL: "/" +relativeURLs: true languageCode: en-us title: Saurav Dhakal theme: ["PaperMod"] @@ -77,14 +77,12 @@ params: # home-info mode homeInfoParams: - Title: "Hi there \U0001F44B, I'm Saurav!" + Title: "Hi there \U0001F44B, I’m Saurav!" Content: > I’m a software engineer who enjoys building thoughtful systems and learning how things really work. -
+

This is my digital garden - notes, projects, and lessons along the way. - - -
- +

Checkout my [CV](files/CV.pdf) for my works and projects. socialIcons: @@ -123,16 +121,27 @@ params: menu: main: - identifier: posts - name: posts + name: Posts url: /posts/ weight: 10 - - identifier: tags - name: tags - url: /tags/ + - identifier: notes + name: Notes + url: /notes/ weight: 20 + - identifier: tags + name: Tags + url: /tags/ + weight: 30 + - identifier: search + name: Search + url: /search/ + weight: 40 # Read: https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#using-hugos-syntax-highlighter-chroma pygmentsUseClasses: true markup: + goldmark: + renderer: + unsafe: true highlight: noClasses: false # anchorLineNos: true diff --git a/layouts/notes/list.html b/layouts/notes/list.html new file mode 100644 index 0000000..9e9dce9 --- /dev/null +++ b/layouts/notes/list.html @@ -0,0 +1,30 @@ +{{- define "main" }} + + + +{{- $pages := .Pages }} + +{{- if .Site.Params.fuseOpts }} +
+{{- end }} + + + +{{- end }}{{/* end main */}} diff --git a/public/404.html b/public/404.html index 7d0dfd5..c216a62 100644 --- a/public/404.html +++ b/public/404.html @@ -1,2 +1,2 @@ -404 Page not found | Saurav Dhakal
404
+404 Page not found | Saurav Dhakal
404
\ No newline at end of file diff --git a/public/assets/css/stylesheet.1819d1b52fd9f2af4d88316fde3f9b918c48d08dac9a2e1ef0a7ca49d1f18ddb.css b/public/assets/css/stylesheet.1819d1b52fd9f2af4d88316fde3f9b918c48d08dac9a2e1ef0a7ca49d1f18ddb.css deleted file mode 100644 index f156ec0..0000000 --- a/public/assets/css/stylesheet.1819d1b52fd9f2af4d88316fde3f9b918c48d08dac9a2e1ef0a7ca49d1f18ddb.css +++ /dev/null @@ -1,7 +0,0 @@ -/* - PaperMod v8+ - License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE - Copyright (c) 2020 nanxiaobei and adityatelange - Copyright (c) 2021-2025 adityatelange -*/ -:root{--gap:24px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:rgb(30, 30, 30);--secondary:rgb(108, 108, 108);--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--code-block-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238);color-scheme:light}:root[data-theme=dark]{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--code-block-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51);color-scheme:dark}.list{background:var(--code-bg)}[data-theme=dark] .list{background:var(--theme)}*,::after,::before{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;overflow-y:scroll;-webkit-text-size-adjust:100%;text-size-adjust:100%}a,button,body,h1,h2,h3,h4,h5,h6{color:var(--primary)}body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,Oxygen,Ubuntu,Cantarell,open sans,helvetica neue,sans-serif;font-size:18px;line-height:1.6;word-break:break-word;background:var(--theme)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section,table{display:block}h1,h2,h3,h4,h5,h6{line-height:1.2}h1,h2,h3,h4,h5,h6,p{margin-top:0;margin-bottom:0}ul{padding:0}a{text-decoration:none}body,figure,ul{margin:0}table{width:100%;border-collapse:collapse;border-spacing:0;overflow-x:auto;word-break:keep-all}button,input,textarea{padding:0;font:inherit;background:0 0;border:0}input,textarea{outline:0}button,input[type=button],input[type=submit]{cursor:pointer}input:-webkit-autofill,textarea:-webkit-autofill{box-shadow:0 0 0 50px var(--theme)inset}img{display:block;max-width:100%}.not-found{position:absolute;left:0;right:0;display:flex;align-items:center;justify-content:center;height:80%;font-size:160px;font-weight:700}.archive-posts{width:100%;font-size:16px}.archive-year{margin-top:40px}.archive-year:not(:last-of-type){border-bottom:2px solid var(--border)}.archive-month{display:flex;align-items:flex-start;padding:10px 0}.archive-month-header{margin:25px 0;width:200px}.archive-month:not(:last-of-type){border-bottom:1px solid var(--border)}.archive-entry{position:relative;padding:5px;margin:10px 0}.archive-entry-title{margin:5px 0;font-weight:400}.archive-count,.archive-meta{color:var(--secondary);font-size:14px}.footer,.top-link{font-size:12px;color:var(--secondary)}.footer{max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:calc((var(--footer-height) - var(--gap))/2)var(--gap);text-align:center;line-height:24px}.footer span{margin-inline-start:1px;margin-inline-end:1px}.footer span:last-child{white-space:nowrap}.footer a{color:inherit;border-bottom:1px solid var(--secondary)}.footer a:hover{border-bottom:1px solid var(--primary)}.top-link{visibility:hidden;position:fixed;bottom:60px;right:30px;z-index:99;background:var(--tertiary);width:42px;height:42px;padding:12px;border-radius:64px;transition:visibility .5s,opacity .8s linear}.top-link,.top-link svg{filter:drop-shadow(0 0 0 var(--theme))}.footer a:hover,.top-link:hover{color:var(--primary)}.top-link:focus,#theme-toggle:focus{outline:0}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;max-width:calc(var(--nav-width) + var(--gap) * 2);margin-inline-start:auto;margin-inline-end:auto;line-height:var(--header-height)}.nav a{display:block}.logo,#menu{display:flex;margin:auto var(--gap)}.logo{flex-wrap:inherit}.logo a{font-size:24px;font-weight:700}.logo a img,.logo a svg{display:inline;vertical-align:middle;pointer-events:none;transform:translate(0,-10%);border-radius:6px;margin-inline-end:8px}button#theme-toggle{font-size:26px;margin:auto 4px}[data-theme=dark] #moon{display:none}[data-theme=light] #sun{display:none}#menu{list-style:none;word-break:keep-all;overflow-x:auto;white-space:nowrap}#menu li+li{margin-inline-start:var(--gap)}#menu a{font-size:16px}#menu .active{font-weight:500;border-bottom:2px solid}.lang-switch li,.lang-switch ul,.logo-switches{display:inline-flex;margin:auto 4px}.lang-switch{display:flex;flex-wrap:inherit}.lang-switch a{margin:auto 3px;font-size:16px;font-weight:500}.logo-switches{flex-wrap:inherit}.main{position:relative;min-height:calc(100vh - var(--header-height) - var(--footer-height));max-width:calc(var(--main-width) + var(--gap) * 2);margin:auto;padding:var(--gap)}.page-header h1{font-size:40px}.pagination{display:flex}.pagination a{color:var(--theme);font-size:13px;line-height:36px;background:var(--primary);border-radius:calc(36px/2);padding:0 16px}.pagination .next{margin-inline-start:auto}.social-icons a{display:inline-flex;padding:10px}.social-icons a svg{height:26px;width:26px}code{direction:ltr}div.highlight,pre{position:relative}.copy-code{display:none;position:absolute;top:4px;right:4px;color:rgba(255,255,255,.8);background:rgba(78,78,78,.8);border-radius:var(--radius);padding:0 5px;font-size:14px;user-select:none}div.highlight:hover .copy-code,pre:hover .copy-code{display:block}.first-entry{position:relative;display:flex;flex-direction:column;justify-content:center;min-height:320px;margin:var(--gap)0 calc(var(--gap) * 2)}.first-entry .entry-header{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.first-entry .entry-header h1{font-size:34px;line-height:1.3}.first-entry .entry-content{margin:14px 0;font-size:16px;-webkit-line-clamp:3}.first-entry .entry-footer{font-size:14px}.home-info .entry-content{-webkit-line-clamp:unset}.post-entry{position:relative;margin-bottom:var(--gap);padding:var(--gap);background:var(--entry);border-radius:var(--radius);transition:transform .1s;border:1px solid var(--border)}.post-entry:active{transform:scale(.96)}.tag-entry .entry-cover{display:none}.entry-header h2{font-size:24px;line-height:1.3}.entry-content{margin:8px 0;color:var(--secondary);font-size:14px;line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entry-footer{color:var(--secondary);font-size:13px}.entry-link{position:absolute;left:0;right:0;top:0;bottom:0}.entry-hint{color:var(--secondary)}.entry-hint-parent{display:flex;justify-content:space-between}.entry-cover{font-size:14px;margin-bottom:var(--gap);text-align:center}.entry-cover img{border-radius:var(--radius);width:100%;height:auto}.entry-cover a{box-shadow:0 1px 0 var(--primary)}.page-header,.post-header{margin:24px auto var(--content-gap)}.post-title{margin-bottom:2px;font-size:40px}.post-description{margin-top:10px;margin-bottom:5px}.post-meta,.breadcrumbs{color:var(--secondary);font-size:14px}.breadcrumbs{display:flex;flex-wrap:wrap;align-items:center}.i18n_list{display:inline-flex}.post-meta .i18n_list li{list-style:none;margin:auto 3px}.breadcrumbs a{font-size:16px}.post-content{color:var(--content);margin:30px 0}.post-content h3,.post-content h4,.post-content h5,.post-content h6{margin:24px 0 16px}.post-content h1{margin:40px auto 32px;font-size:40px}.post-content h2{margin:32px auto 24px;font-size:32px}.post-content h3{font-size:24px}.post-content h4{font-size:16px}.post-content h5{font-size:14px}.post-content h6{font-size:12px}.post-content a,.post-meta .i18n_list li a,.toc a:hover{box-shadow:0 1px;box-decoration-break:clone;-webkit-box-decoration-break:clone}.post-content a code{margin:auto 0;border-radius:0;box-shadow:0 -1px 0 var(--primary)inset}.post-content del{text-decoration:line-through}.post-content dl,.post-content ol,.post-content p,.post-content figure,.post-content ul{margin-bottom:var(--content-gap)}.post-content ol,.post-content ul{padding-inline-start:20px}.post-content li{margin-top:5px}.post-content li p{margin-bottom:0}.post-content dl{display:flex;flex-wrap:wrap;margin:0}.post-content dt{width:25%;font-weight:700}.post-content dd{width:75%;margin-inline-start:0;padding-inline-start:10px}.post-content dd~dd,.post-content dt~dt{margin-top:10px}.post-content table{margin-bottom:var(--content-gap)}.post-content table th,.post-content table:not(.highlighttable,.highlight table,.gist .highlight) td{min-width:80px;padding:8px 5px;line-height:1.5;border-bottom:1px solid var(--border)}.post-content table th{text-align:start}.post-content table:not(.highlighttable) td code:only-child{margin:auto 0}.post-content .highlight table{border-radius:var(--radius)}.post-content .highlight:not(table){margin:10px auto;background:var(--code-block-bg)!important;border-radius:var(--radius);direction:ltr}.post-content li>.highlight{margin-inline-end:0}.post-content ul pre{margin-inline-start:calc(var(--gap) * -2)}.post-content .highlight pre{margin:0}.post-content .highlighttable{table-layout:fixed}.post-content .highlighttable td:first-child{width:40px}.post-content .highlighttable td .linenodiv{padding-inline-end:0!important}.post-content .highlighttable td .highlight,.post-content .highlighttable td .linenodiv pre{margin-bottom:0}.post-content code{margin:auto 4px;padding:4px 6px;font-size:.78em;line-height:1.5;background:var(--code-bg);border-radius:2px}.post-content pre code{display:grid;margin:auto 0;padding:10px;color:#d5d5d6;background:var(--code-block-bg)!important;border-radius:var(--radius);overflow-x:auto;word-break:break-all}.post-content blockquote{margin:20px 0;padding:0 14px;border-inline-start:3px solid var(--primary)}.post-content hr{margin:30px 0;height:2px;background:var(--tertiary);border:0}.post-content iframe{max-width:100%}.post-content img{border-radius:4px;margin:1rem 0}.post-content img[src*="#center"]{margin:1rem auto}.post-content figure.align-center{text-align:center}.post-content figure>figcaption{color:var(--primary);font-size:16px;font-weight:700;margin:8px 0 16px}.post-content figure>figcaption>p{color:var(--secondary);font-size:14px;font-weight:400}.toc{margin-bottom:var(--content-gap);border:1px solid var(--border);background:var(--code-bg);border-radius:var(--radius);padding:.4em}[data-theme=dark] .toc{background:var(--entry)}.toc details summary{cursor:zoom-in;margin-inline-start:10px;user-select:none}.toc details[open] summary{cursor:zoom-out}.toc .details{display:inline;font-weight:500}.toc .inner{margin:5px 20px;padding:0 10px;opacity:.9}.toc li ul{margin-inline-start:var(--gap)}.toc summary:focus{outline:0}.post-footer{margin-top:var(--content-gap)}.post-footer>*{margin-bottom:10px}.post-tags{display:flex;flex-wrap:wrap;gap:10px}.post-tags li{display:inline-block}.post-tags a,.share-buttons,.paginav{border-radius:var(--radius);background:var(--code-bg);border:1px solid var(--border)}.post-tags a{display:block;padding:0 14px;color:var(--secondary);font-size:14px;line-height:34px;background:var(--code-bg)}.post-tags a:hover,.paginav a:hover{background:var(--border)}.share-buttons{padding:10px;display:flex;justify-content:center;overflow-x:auto;gap:10px}.share-buttons li,.share-buttons a{display:inline-flex}.share-buttons a:not(:last-of-type){margin-inline-end:12px}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,h5:hover .anchor,h6:hover .anchor{display:inline-flex;color:var(--secondary);margin-inline-start:8px;font-weight:500;user-select:none}.paginav{display:flex;line-height:30px}.paginav a{padding-inline-start:14px;padding-inline-end:14px;border-radius:var(--radius)}.paginav .title{letter-spacing:1px;text-transform:uppercase;font-size:small;color:var(--secondary)}.paginav .prev,.paginav .next{width:50%}.paginav span:hover:not(.title){box-shadow:0 1px}.paginav .next{margin-inline-start:auto;text-align:right}[dir=rtl] .paginav .next{text-align:left}h1>a>svg{display:inline}img.in-text{display:inline;margin:auto}.buttons,.main .profile{display:flex;justify-content:center}.main .profile{align-items:center;min-height:calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));text-align:center}.profile .profile_inner{display:flex;flex-direction:column;align-items:center;gap:10px}.profile img{border-radius:50%}.buttons{flex-wrap:wrap;max-width:400px}.button{background:var(--tertiary);border-radius:var(--radius);margin:8px;padding:6px;transition:transform .1s}.button-inner{padding:0 8px}.button:active{transform:scale(.96)}#searchbox input{padding:4px 10px;width:100%;color:var(--primary);font-weight:700;border:2px solid var(--tertiary);border-radius:var(--radius)}#searchbox input:focus{border-color:var(--secondary)}#searchResults li{list-style:none;border-radius:var(--radius);padding:10px;margin:10px 0;position:relative;font-weight:500}#searchResults{margin:10px 0;width:100%}#searchResults li:active{transition:transform .1s;transform:scale(.98)}#searchResults a{position:absolute;width:100%;height:100%;top:0;left:0;outline:none}#searchResults .focus{transform:scale(.98);border:2px solid var(--tertiary)}.terms-tags li{display:inline-block;margin:10px;font-weight:500}.terms-tags a{display:block;padding:3px 10px;background:var(--tertiary);border-radius:6px;transition:transform .1s}.terms-tags a:active{background:var(--tertiary);transform:scale(.96)}.bg{color:#cad3f5;background-color:#24273a}.chroma{color:#cad3f5;background-color:#24273a}.chroma .x{}.chroma .err{color:#ed8796}.chroma .cl{}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#474733}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .line{display:flex}.chroma .k{color:#c6a0f6}.chroma .kc{color:#f5a97f}.chroma .kd{color:#ed8796}.chroma .kn{color:#8bd5ca}.chroma .kp{color:#c6a0f6}.chroma .kr{color:#c6a0f6}.chroma .kt{color:#ed8796}.chroma .n{}.chroma .na{color:#8aadf4}.chroma .nb{color:#91d7e3}.chroma .bp{color:#91d7e3}.chroma .nc{color:#eed49f}.chroma .no{color:#eed49f}.chroma .nd{color:#8aadf4;font-weight:700}.chroma .ni{color:#8bd5ca}.chroma .ne{color:#f5a97f}.chroma .nf{color:#8aadf4}.chroma .fm{color:#8aadf4}.chroma .nl{color:#91d7e3}.chroma .nn{color:#f5a97f}.chroma .nx{}.chroma .py{color:#f5a97f}.chroma .nt{color:#c6a0f6}.chroma .nv{color:#f4dbd6}.chroma .vc{color:#f4dbd6}.chroma .vg{color:#f4dbd6}.chroma .vi{color:#f4dbd6}.chroma .vm{color:#f4dbd6}.chroma .l{}.chroma .ld{}.chroma .s{color:#a6da95}.chroma .sa{color:#ed8796}.chroma .sb{color:#a6da95}.chroma .sc{color:#a6da95}.chroma .dl{color:#8aadf4}.chroma .sd{color:#6e738d}.chroma .s2{color:#a6da95}.chroma .se{color:#8aadf4}.chroma .sh{color:#6e738d}.chroma .si{color:#a6da95}.chroma .sx{color:#a6da95}.chroma .sr{color:#8bd5ca}.chroma .s1{color:#a6da95}.chroma .ss{color:#a6da95}.chroma .m{color:#f5a97f}.chroma .mb{color:#f5a97f}.chroma .mf{color:#f5a97f}.chroma .mh{color:#f5a97f}.chroma .mi{color:#f5a97f}.chroma .il{color:#f5a97f}.chroma .mo{color:#f5a97f}.chroma .o{color:#91d7e3;font-weight:700}.chroma .ow{color:#91d7e3;font-weight:700}.chroma .p{}.chroma .c{color:#6e738d;font-style:italic}.chroma .ch{color:#6e738d;font-style:italic}.chroma .cm{color:#6e738d;font-style:italic}.chroma .c1{color:#6e738d;font-style:italic}.chroma .cs{color:#6e738d;font-style:italic}.chroma .cp{color:#6e738d;font-style:italic}.chroma .cpf{color:#6e738d;font-weight:700;font-style:italic}.chroma .g{}.chroma .gd{color:#ed8796;background-color:#363a4f}.chroma .ge{font-style:italic}.chroma .gr{color:#ed8796}.chroma .gh{color:#f5a97f;font-weight:700}.chroma .gi{color:#a6da95;background-color:#363a4f}.chroma .go{}.chroma .gp{}.chroma .gs{font-weight:700}.chroma .gu{color:#f5a97f;font-weight:700}.chroma .gt{color:#ed8796}.chroma .gl{text-decoration:underline}.chroma .w{}.chroma{background-color:unset!important}.chroma .hl{display:flex}.chroma .lnt{padding:0 0 0 12px}.highlight pre.chroma code{padding:8px 0}.highlight pre.chroma .line .cl,.chroma .ln{padding:0 10px}.chroma .lntd:last-of-type{width:100%}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--tertiary);border:5px solid var(--theme);border-radius:var(--radius)}[data-theme=light] .list::-webkit-scrollbar-thumb{border:5px solid var(--code-bg)}::-webkit-scrollbar-thumb:hover{background:var(--secondary)}::-webkit-scrollbar:not(.highlighttable,.highlight table,.gist .highlight){background:var(--theme)}.post-content .highlighttable td .highlight pre code::-webkit-scrollbar{display:none}.post-content :not(table) ::-webkit-scrollbar-thumb{border:2px solid var(--code-block-bg);background:#717175}.post-content :not(table) ::-webkit-scrollbar-thumb:hover{background:#a3a3a5}.gist table::-webkit-scrollbar-thumb{border:2px solid #fff;background:#adadad}.gist table::-webkit-scrollbar-thumb:hover{background:#707070}.post-content table::-webkit-scrollbar-thumb{border-width:2px}@media screen and (min-width:768px){::-webkit-scrollbar{width:19px;height:11px}}@media screen and (max-width:768px){:root{--gap:14px}.profile img{transform:scale(.85)}.first-entry{min-height:260px}.archive-month{flex-direction:column}.archive-year{margin-top:20px}.footer{padding:calc((var(--footer-height) - var(--gap) - 10px)/2)var(--gap)}}@media screen and (max-width:900px){.list .top-link{transform:translateY(-5rem)}}@media screen and (max-width:340px){.share-buttons{justify-content:unset}}@media(prefers-reduced-motion){.terms-tags a:active,.button:active,.post-entry:active,.top-link,#searchResults .focus,#searchResults li:active{transform:none}}@import "https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&family=Space+Grotesk:wght@300..700&display=swap";:root{--gap:24px;--content-gap:20px;--nav-width:1024px;--main-width:720px;--header-height:60px;--footer-height:60px;--radius:8px;--theme:rgb(255, 255, 255);--entry:rgb(255, 255, 255);--primary:#282828;--secondary:#3c3836;--tertiary:rgb(214, 214, 214);--content:rgb(31, 31, 31);--code-block-bg:rgb(28, 29, 33);--code-bg:rgb(245, 245, 245);--border:rgb(238, 238, 238);color-scheme:light;--red:#cc241d;--redl:#fb4934;--green:#98971a;--greenl:#b8bb26;--yellow:#d79921;--yellowl:#fabd2f;--blue:#458588;--bluel:#83a598;--purple:#b16286;--purplel:#d3869b;--aqua:#689d6a;--aqual:#8ec07c;--gray:#928374;--grayl:#a89984;--orange:#d65d0e;--orangel:#fe8019;--post-entry-bg:white;--post-entry-fg:#282828}:root[data-theme=dark]{--theme:#181818;--entry:rgb(46, 46, 51);--primary:#fbf1c7;--secondary:#ebdbb2;--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--code-block-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(151, 51, 51);color-scheme:dark;--post-entry-bg:#181818;--post-entry-fg:#ebdbb2}body{font-family:space grotesk,sans-serif}nav #menu span{padding:0 2px;text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:var(--green)}nav #menu span:hover{background-color:var(--green);color:#fff}nav #menu .active{border:0;color:var(--green);text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:var(--green)}main a{text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:var(--green)}main a:hover:not(.entry-link){background-color:var(--green);color:#fff}main h1{color:var(--green)}.share-buttons,.toc,.post-tags a{border:0}.anchor{text-decoration:none}main .post-entry{border:0;background-color:var(--post-entry-bg);color:var(--post-entry-fg);border:2px solid #383838} \ No newline at end of file diff --git a/public/categories/backend-development/index.html b/public/categories/backend-development/index.html deleted file mode 100644 index f30f1b1..0000000 --- a/public/categories/backend-development/index.html +++ /dev/null @@ -1,3 +0,0 @@ -Backend Development | Saurav Dhakal

Understanding Separation of Concerns (SoC) in NestJS

A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers.

August 19, 2025 · 4 min · 767 words · Saurav Dhakal
- \ No newline at end of file diff --git a/public/categories/backend-development/index.xml b/public/categories/backend-development/index.xml deleted file mode 100644 index ed0abb0..0000000 --- a/public/categories/backend-development/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Backend Development on Saurav Dhakal - https://sauravdhakal.com.np/categories/backend-development/ - Recent content in Backend Development on Saurav Dhakal - Hugo -- 0.152.2 - en-us - SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - - - Understanding Separation of Concerns (SoC) in NestJS - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers. - - - diff --git a/public/categories/backend-development/page/1/index.html b/public/categories/backend-development/page/1/index.html deleted file mode 100644 index f93a9a9..0000000 --- a/public/categories/backend-development/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://sauravdhakal.com.np/categories/backend-development/ \ No newline at end of file diff --git a/public/categories/index.html b/public/categories/index.html index 1cf41d3..827194f 100644 --- a/public/categories/index.html +++ b/public/categories/index.html @@ -1,2 +1,2 @@ -Categories | Saurav Dhakal
+Categories | Saurav Dhakal
\ No newline at end of file diff --git a/public/categories/index.xml b/public/categories/index.xml index 0ae8987..49b8177 100644 --- a/public/categories/index.xml +++ b/public/categories/index.xml @@ -2,26 +2,11 @@ Categories on Saurav Dhakal - https://sauravdhakal.com.np/categories/ + //localhost:1313/categories/ Recent content in Categories on Saurav Dhakal - Hugo -- 0.152.2 + Hugo -- 0.158.0 en-us SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - - - Backend Development - https://sauravdhakal.com.np/categories/backend-development/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/categories/backend-development/ - - - - NestJS - https://sauravdhakal.com.np/categories/nestjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/categories/nestjs/ - - + diff --git a/public/categories/nestjs/index.html b/public/categories/nestjs/index.html deleted file mode 100644 index ec6087f..0000000 --- a/public/categories/nestjs/index.html +++ /dev/null @@ -1,3 +0,0 @@ -NestJS | Saurav Dhakal

Understanding Separation of Concerns (SoC) in NestJS

A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers.

August 19, 2025 · 4 min · 767 words · Saurav Dhakal
- \ No newline at end of file diff --git a/public/categories/nestjs/index.xml b/public/categories/nestjs/index.xml deleted file mode 100644 index 1f618ef..0000000 --- a/public/categories/nestjs/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - NestJS on Saurav Dhakal - https://sauravdhakal.com.np/categories/nestjs/ - Recent content in NestJS on Saurav Dhakal - Hugo -- 0.152.2 - en-us - SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - - - Understanding Separation of Concerns (SoC) in NestJS - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers. - - - diff --git a/public/categories/nestjs/page/1/index.html b/public/categories/nestjs/page/1/index.html deleted file mode 100644 index f222d4a..0000000 --- a/public/categories/nestjs/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://sauravdhakal.com.np/categories/nestjs/ \ No newline at end of file diff --git a/public/index.html b/public/index.html index 907bba3..9f31497 100644 --- a/public/index.html +++ b/public/index.html @@ -1,4 +1,5 @@ -Saurav Dhakal

Hi there 👋, I’m Saurav!

I’m a software engineer who enjoys building thoughtful systems and learning how things really work. This is my digital garden - notes, projects, and lessons along the way.

Checkout my CV for my works and projects.

Sample Note

This is a sample note. Notes are meant to be short, quick thoughts or TILs (Today I Learned). +Delete this file and add your own notes here!

August 20, 2025 · 1 min · 27 words · saurav
\ No newline at end of file diff --git a/public/index.json b/public/index.json index 22b1de9..eb42f6e 100644 --- a/public/index.json +++ b/public/index.json @@ -1 +1 @@ -[{"content":"When building applications, one of the most important design principles to keep in mind is Separation of Concerns (SoC). NestJS, with its modular architecture, makes applying SoC almost effortless — but understanding why it matters and how to use it properly will help you write cleaner, testable, and future-proof code.\nWhat is Separation of Concerns and Why it Matters? The basic idea is:\nA program should be divided into distinct sections, where each section addresses a single responsibility.\nIn simpler terms:\nEvery part of the code should have one clear job. This makes the code easier to understand, test, and maintain. Lets take an analogy of a coffee shop to better understand this concept. A coffee shop has multiple employees with distinct roles:\nThe cashier handles payments. The barista makes coffee. The inventory manager tracks beans and supplies. If one person did everything, the system would collapse into chaos. The same goes for software. Each role has a single responsibility, and no one does everything.\nSuppose you’re building an eCommerce platform. Without SoC, all the logic might end up in one massive file — authentication, product catalog, payments, inventory, order processing. This quickly becomes spaghetti code: hard to read, impossible to test, and dangerous to modify.\nWith Separation of Concerns, you break it down into modules:\nAuth Module → Handles user registration, login, JWT tokens. Products Module → Manages product catalog and search. Checkout Module → Orchestrates payment and order creation. Inventory Module → Keeps track of stock levels. Each module does one thing. When you need to upgrade your payment provider or switch databases, you only touch the Checkout Module or Inventory Module — everything else continues to work.\nThis approach of programming enhances:\nReadability: Developers can understand a piece of code without knowing the whole system. Maintainability: Changing one part (like authentication) won’t break unrelated features. Testability: Smaller, focused components are easier to test in isolation. Flexibility: You can swap implementations (e.g., switch databases or auth providers) without rewriting the whole app. Separation of Concerns in NestJS One of the reasons developers love NestJS is that it bakes Separation of Concerns into its architecture. By default, NestJS applications are structured around three core building blocks: modules, services, and controllers. Each of these naturally maps to a specific concern.\n1. Modules → Group related functionality A module acts like a container for a specific domain or feature. Examples: UsersModule, AuthModule, PostsModule. A module owns everything related to its concern and can expose services for other modules to use. Think of modules as departments in a company — each department specializes in one thing but can collaborate with others when needed.\n2. Services → Handle business logic Services handle the actual “work” of the application. Example: UsersService deals only with user data. Example: AuthService deals only with authentication and tokens. Services should not depend on controllers or contain HTTP logic. This makes them reusable. A service can be used in REST controllers, GraphQL resolvers, or even a CLI command without modification.\n3. Controllers → Handle HTTP requests Controllers act as the entry point for requests. Their job is to receive a request, delegate the work to a service, and return a response. They should remain thin, containing no business logic. This ensures controllers are simple and services stay focused.\nExample: Auth and Users in NestJS Let’s look at a real-world scenario: Implementing authentication.\nUserService in UsersModule @Injectable() export class UsersService { constructor(private prisma: PrismaService) {} findByEmail(email: string) { return this.prisma.user.findUnique({ where: { email } }); } create(data: any) { return this.prisma.user.create({ data }); } } UserService is only concerned with managing user data. It knows nothing about JWTs, passwords, or authentication.\nAuthService in AuthModule @Injectable() export class AuthService { constructor( private usersService: UsersService, private jwtService: JwtService, ) {} async validateUser(email: string, password: string) { const user = await this.usersService.findByEmail(email); // validate password... return user; } login(user: any) { return { access_token: this.jwtService.sign({ sub: user.id }) }; } } AuthService handles authentication logic. It uses UsersService, to work with user data (findByEmail) but doesn’t leak authentication concerns back into it. A clear boundary is maintained: UsersService manages user data, AuthService manages auth.\nConclusion Separation of Concerns isn’t just a design principle — it’s a mindset. By keeping each part of your application focused on a single responsibility, you reduce complexity, make testing easier, and keep your codebase flexible as your project grows.\nNestJS makes this natural with its modules, services, and controllers. If you embrace SoC from the start, you’ll end up with applications that are not only scalable but also a joy to maintain.\n(Proofread by ChatGPT)\n","permalink":"https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/","summary":"A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers.","title":"Understanding Separation of Concerns (SoC) in NestJS"}] \ No newline at end of file +[{"content":"This is a sample note. Notes are meant to be short, quick thoughts or TILs (Today I Learned).\nDelete this file and add your own notes here!\n","permalink":"//localhost:1313/notes/demo/","summary":"\u003cp\u003eThis is a sample note. Notes are meant to be short, quick thoughts or TILs (Today I Learned).\u003c/p\u003e\n\u003cp\u003eDelete this file and add your own notes here!\u003c/p\u003e","title":"Sample Note"}] \ No newline at end of file diff --git a/public/index.xml b/public/index.xml index 2479fc0..190ccd9 100644 --- a/public/index.xml +++ b/public/index.xml @@ -2,19 +2,20 @@ Saurav Dhakal - https://sauravdhakal.com.np/ + //localhost:1313/ Recent content on Saurav Dhakal - Hugo -- 0.152.2 + Hugo -- 0.158.0 en-us SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - + Wed, 20 Aug 2025 00:00:00 +0000 + - Understanding Separation of Concerns (SoC) in NestJS - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers. + Sample Note + //localhost:1313/notes/demo/ + Wed, 20 Aug 2025 00:00:00 +0000 + //localhost:1313/notes/demo/ + <p>This is a sample note. Notes are meant to be short, quick thoughts or TILs (Today I Learned).</p> +<p>Delete this file and add your own notes here!</p> diff --git a/public/notes/demo/index.html b/public/notes/demo/index.html index a702e9d..28ec939 100644 --- a/public/notes/demo/index.html +++ b/public/notes/demo/index.html @@ -1,2 +1,5 @@ -Search | Saurav Dhakal
- \ No newline at end of file +Sample Note | Saurav Dhakal

Sample Note

This is a sample note. Notes are meant to be short, quick thoughts or TILs (Today I Learned).

Delete this file and add your own notes here!

+ \ No newline at end of file diff --git a/public/notes/index.html b/public/notes/index.html index 5db6e13..ccfff44 100644 --- a/public/notes/index.html +++ b/public/notes/index.html @@ -1,3 +1,4 @@ -Notes | Saurav Dhakal

Search

search

0 min · 0 words · saurav
+Notes | Saurav Dhakal
\ No newline at end of file diff --git a/public/notes/index.xml b/public/notes/index.xml index 9fc604e..5cf1caa 100644 --- a/public/notes/index.xml +++ b/public/notes/index.xml @@ -2,11 +2,20 @@ Notes on Saurav Dhakal - https://sauravdhakal.com.np/notes/ + //localhost:1313/notes/ Recent content in Notes on Saurav Dhakal - Hugo -- 0.152.2 + Hugo -- 0.158.0 en-us SauravDhakal - + Wed, 20 Aug 2025 00:00:00 +0000 + + + Sample Note + //localhost:1313/notes/demo/ + Wed, 20 Aug 2025 00:00:00 +0000 + //localhost:1313/notes/demo/ + <p>This is a sample note. Notes are meant to be short, quick thoughts or TILs (Today I Learned).</p> +<p>Delete this file and add your own notes here!</p> + diff --git a/public/notes/page/1/index.html b/public/notes/page/1/index.html deleted file mode 100644 index f756c29..0000000 --- a/public/notes/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://sauravdhakal.com.np/notes/ \ No newline at end of file diff --git a/public/page/1/index.html b/public/page/1/index.html index 82e5b65..1540021 100644 --- a/public/page/1/index.html +++ b/public/page/1/index.html @@ -1 +1 @@ -https://sauravdhakal.com.np/ \ No newline at end of file +//localhost:1313/ \ No newline at end of file diff --git a/public/posts/index.html b/public/posts/index.html index c174d56..b58aa00 100644 --- a/public/posts/index.html +++ b/public/posts/index.html @@ -1,3 +1,3 @@ -Posts | Saurav Dhakal

Understanding Separation of Concerns (SoC) in NestJS

A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers.

August 19, 2025 · 4 min · 767 words · Saurav Dhakal
+Posts | Saurav Dhakal
\ No newline at end of file diff --git a/public/posts/index.xml b/public/posts/index.xml index cf9057b..780f088 100644 --- a/public/posts/index.xml +++ b/public/posts/index.xml @@ -2,19 +2,11 @@ Posts on Saurav Dhakal - https://sauravdhakal.com.np/posts/ + //localhost:1313/posts/ Recent content in Posts on Saurav Dhakal - Hugo -- 0.152.2 + Hugo -- 0.158.0 en-us SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - - - Understanding Separation of Concerns (SoC) in NestJS - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers. - + diff --git a/public/posts/page/1/index.html b/public/posts/page/1/index.html index d531752..7ce803b 100644 --- a/public/posts/page/1/index.html +++ b/public/posts/page/1/index.html @@ -1 +1 @@ -https://sauravdhakal.com.np/posts/ \ No newline at end of file +//localhost:1313/posts/ \ No newline at end of file diff --git a/public/posts/seperation-of-concern-in-nextjs/index.html b/public/posts/seperation-of-concern-in-nextjs/index.html deleted file mode 100644 index eb282f5..0000000 --- a/public/posts/seperation-of-concern-in-nextjs/index.html +++ /dev/null @@ -1,32 +0,0 @@ -Understanding Separation of Concerns (SoC) in NestJS | Saurav Dhakal

Understanding Separation of Concerns (SoC) in NestJS

When building applications, one of the most important design principles to keep in mind is Separation of Concerns (SoC). NestJS, with its modular architecture, makes applying SoC almost effortless — but understanding why it matters and how to use it properly will help you write cleaner, testable, and future-proof code.

What is Separation of Concerns and Why it Matters?

The basic idea is:

A program should be divided into distinct sections, where each section addresses a single responsibility.

In simpler terms:

  • Every part of the code should have one clear job.
  • This makes the code easier to understand, test, and maintain.

Lets take an analogy of a coffee shop to better understand this concept. A coffee shop has multiple employees with distinct roles:

  • The cashier handles payments.
  • The barista makes coffee.
  • The inventory manager tracks beans and supplies.

If one person did everything, the system would collapse into chaos. The same goes for software. Each role has a single responsibility, and no one does everything.

Suppose you’re building an eCommerce platform. Without SoC, all the logic might end up in one massive file — authentication, product catalog, payments, inventory, order processing. This quickly becomes spaghetti code: hard to read, impossible to test, and dangerous to modify.

With Separation of Concerns, you break it down into modules:

  • Auth Module → Handles user registration, login, JWT tokens.
  • Products Module → Manages product catalog and search.
  • Checkout Module → Orchestrates payment and order creation.
  • Inventory Module → Keeps track of stock levels.

Each module does one thing. When you need to upgrade your payment provider or switch databases, you only touch the Checkout Module or Inventory Module — everything else continues to work.

This approach of programming enhances:

  • Readability: Developers can understand a piece of code without knowing the whole system.
  • Maintainability: Changing one part (like authentication) won’t break unrelated features.
  • Testability: Smaller, focused components are easier to test in isolation.
  • Flexibility: You can swap implementations (e.g., switch databases or auth providers) without rewriting the whole app.

Separation of Concerns in NestJS

One of the reasons developers love NestJS is that it bakes Separation of Concerns into its architecture. By default, NestJS applications are structured around three core building blocks: modules, services, and controllers. Each of these naturally maps to a specific concern.

  • A module acts like a container for a specific domain or feature.
  • Examples: UsersModule, AuthModule, PostsModule.
  • A module owns everything related to its concern and can expose services for other modules to use.

Think of modules as departments in a company — each department specializes in one thing but can collaborate with others when needed.

2. Services → Handle business logic

  • Services handle the actual “work” of the application.
  • Example: UsersService deals only with user data.
  • Example: AuthService deals only with authentication and tokens.
  • Services should not depend on controllers or contain HTTP logic.

This makes them reusable. A service can be used in REST controllers, GraphQL resolvers, or even a CLI command without modification.

3. Controllers → Handle HTTP requests

  • Controllers act as the entry point for requests.
  • Their job is to receive a request, delegate the work to a service, and return a response.
  • They should remain thin, containing no business logic.

This ensures controllers are simple and services stay focused.


Example: Auth and Users in NestJS

Let’s look at a real-world scenario: Implementing authentication.

UserService in UsersModule

@Injectable()
-export class UsersService {
-  constructor(private prisma: PrismaService) {}
-
-  findByEmail(email: string) {
-    return this.prisma.user.findUnique({ where: { email } });
-  }
-
-  create(data: any) {
-    return this.prisma.user.create({ data });
-  }
-}
-

UserService is only concerned with managing user data. It knows nothing about JWTs, passwords, or authentication.

AuthService in AuthModule

@Injectable()
-export class AuthService {
-  constructor(
-    private usersService: UsersService,
-    private jwtService: JwtService,
-  ) {}
-
-  async validateUser(email: string, password: string) {
-    const user = await this.usersService.findByEmail(email);
-    // validate password...
-    return user;
-  }
-
-  login(user: any) {
-    return { access_token: this.jwtService.sign({ sub: user.id }) };
-  }
-}
-

AuthService handles authentication logic. It uses UsersService, to work with user data (findByEmail) but doesn’t leak authentication concerns back into it. -A clear boundary is maintained: UsersService manages user data, AuthService manages auth.


Conclusion

Separation of Concerns isn’t just a design principle — it’s a mindset. By keeping each part of your application focused on a single responsibility, you reduce complexity, make testing easier, and keep your codebase flexible as your project grows.

NestJS makes this natural with its modules, services, and controllers. If you embrace SoC from the start, you’ll end up with applications that are not only scalable but also a joy to maintain.

(Proofread by ChatGPT)

- \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt index 181fe09..ec92796 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,3 +1,3 @@ User-agent: * Disallow: -Sitemap: https://sauravdhakal.com.np/sitemap.xml +Sitemap: //localhost:1313/sitemap.xml diff --git a/public/search/index.html b/public/search/index.html index cca48d2..bf47ec9 100644 --- a/public/search/index.html +++ b/public/search/index.html @@ -1,2 +1,2 @@ -Search | Saurav Dhakal
+Search | Saurav Dhakal
\ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml index 362b0ba..8e3ba57 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,40 +2,25 @@ - https://sauravdhakal.com.np/tags/architecture/ - 2025-08-19T00:00:00+00:00 + //localhost:1313/tags/example/ + 2025-08-20T00:00:00+00:00 - https://sauravdhakal.com.np/categories/backend-development/ - 2025-08-19T00:00:00+00:00 + //localhost:1313/notes/ + 2025-08-20T00:00:00+00:00 - https://sauravdhakal.com.np/categories/ - 2025-08-19T00:00:00+00:00 + //localhost:1313/notes/demo/ + 2025-08-20T00:00:00+00:00 - https://sauravdhakal.com.np/tags/nestjs/ - 2025-08-19T00:00:00+00:00 + //localhost:1313/ + 2025-08-20T00:00:00+00:00 - https://sauravdhakal.com.np/categories/nestjs/ - 2025-08-19T00:00:00+00:00 + //localhost:1313/tags/ + 2025-08-20T00:00:00+00:00 - https://sauravdhakal.com.np/posts/ - 2025-08-19T00:00:00+00:00 + //localhost:1313/categories/ - https://sauravdhakal.com.np/ - 2025-08-19T00:00:00+00:00 + //localhost:1313/posts/ - https://sauravdhakal.com.np/tags/ - 2025-08-19T00:00:00+00:00 - - https://sauravdhakal.com.np/tags/typescript/ - 2025-08-19T00:00:00+00:00 - - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - 2025-08-19T00:00:00+00:00 - - https://sauravdhakal.com.np/notes/ - - https://sauravdhakal.com.np/notes/demo/ - - https://sauravdhakal.com.np/search/ + //localhost:1313/search/ diff --git a/public/tags/architecture/index.html b/public/tags/architecture/index.html deleted file mode 100644 index 58b6e9b..0000000 --- a/public/tags/architecture/index.html +++ /dev/null @@ -1,3 +0,0 @@ -Architecture | Saurav Dhakal

Understanding Separation of Concerns (SoC) in NestJS

A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers.

August 19, 2025 · 4 min · 767 words · Saurav Dhakal
- \ No newline at end of file diff --git a/public/tags/architecture/index.xml b/public/tags/architecture/index.xml deleted file mode 100644 index ad98440..0000000 --- a/public/tags/architecture/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Architecture on Saurav Dhakal - https://sauravdhakal.com.np/tags/architecture/ - Recent content in Architecture on Saurav Dhakal - Hugo -- 0.152.2 - en-us - SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - - - Understanding Separation of Concerns (SoC) in NestJS - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers. - - - diff --git a/public/tags/architecture/page/1/index.html b/public/tags/architecture/page/1/index.html deleted file mode 100644 index 20af8c2..0000000 --- a/public/tags/architecture/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://sauravdhakal.com.np/tags/architecture/ \ No newline at end of file diff --git a/public/tags/index.html b/public/tags/index.html index afaf713..fe2b92e 100644 --- a/public/tags/index.html +++ b/public/tags/index.html @@ -1,2 +1,2 @@ -Tags | Saurav Dhakal
+Tags | Saurav Dhakal
\ No newline at end of file diff --git a/public/tags/index.xml b/public/tags/index.xml index 868050b..963b680 100644 --- a/public/tags/index.xml +++ b/public/tags/index.xml @@ -2,32 +2,18 @@ Tags on Saurav Dhakal - https://sauravdhakal.com.np/tags/ + //localhost:1313/tags/ Recent content in Tags on Saurav Dhakal - Hugo -- 0.152.2 + Hugo -- 0.158.0 en-us SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - + Wed, 20 Aug 2025 00:00:00 +0000 + - Architecture - https://sauravdhakal.com.np/tags/architecture/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/tags/architecture/ - - - - Nestjs - https://sauravdhakal.com.np/tags/nestjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/tags/nestjs/ - - - - Typescript - https://sauravdhakal.com.np/tags/typescript/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/tags/typescript/ + Example + //localhost:1313/tags/example/ + Wed, 20 Aug 2025 00:00:00 +0000 + //localhost:1313/tags/example/ diff --git a/public/tags/nestjs/index.html b/public/tags/nestjs/index.html deleted file mode 100644 index cfbae99..0000000 --- a/public/tags/nestjs/index.html +++ /dev/null @@ -1,3 +0,0 @@ -Nestjs | Saurav Dhakal

Understanding Separation of Concerns (SoC) in NestJS

A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers.

August 19, 2025 · 4 min · 767 words · Saurav Dhakal
Copyright © 2026 SauravDhakal
- \ No newline at end of file diff --git a/public/tags/nestjs/index.xml b/public/tags/nestjs/index.xml deleted file mode 100644 index 68b5e10..0000000 --- a/public/tags/nestjs/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Nestjs on Saurav Dhakal - https://sauravdhakal.com.np/tags/nestjs/ - Recent content in Nestjs on Saurav Dhakal - Hugo -- 0.152.2 - en-us - SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - - - Understanding Separation of Concerns (SoC) in NestJS - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers. - - - diff --git a/public/tags/nestjs/page/1/index.html b/public/tags/nestjs/page/1/index.html deleted file mode 100644 index 36c7c08..0000000 --- a/public/tags/nestjs/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://sauravdhakal.com.np/tags/nestjs/ \ No newline at end of file diff --git a/public/tags/typescript/index.html b/public/tags/typescript/index.html deleted file mode 100644 index b9b8edd..0000000 --- a/public/tags/typescript/index.html +++ /dev/null @@ -1,3 +0,0 @@ -Typescript | Saurav Dhakal

Understanding Separation of Concerns (SoC) in NestJS

A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers.

August 19, 2025 · 4 min · 767 words · Saurav Dhakal
Copyright © 2026 SauravDhakal
- \ No newline at end of file diff --git a/public/tags/typescript/index.xml b/public/tags/typescript/index.xml deleted file mode 100644 index cff41ea..0000000 --- a/public/tags/typescript/index.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Typescript on Saurav Dhakal - https://sauravdhakal.com.np/tags/typescript/ - Recent content in Typescript on Saurav Dhakal - Hugo -- 0.152.2 - en-us - SauravDhakal - Tue, 19 Aug 2025 00:00:00 +0000 - - - Understanding Separation of Concerns (SoC) in NestJS - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - Tue, 19 Aug 2025 00:00:00 +0000 - https://sauravdhakal.com.np/posts/seperation-of-concern-in-nextjs/ - A guide to understanding Separation of Concerns in NestJS using modules, services, and controllers. - - - diff --git a/public/tags/typescript/page/1/index.html b/public/tags/typescript/page/1/index.html deleted file mode 100644 index c09f39b..0000000 --- a/public/tags/typescript/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://sauravdhakal.com.np/tags/typescript/ \ No newline at end of file