Merge branch 'master' of github.com:kamranahmedse/developer-roadmap into feat/dashboard

feat/dashboard
Kamran Ahmed 6 months ago
commit cf743ee618
  1. 2
      .astro/settings.json
  2. 35
      .github/workflows/deployment.yml
  3. 10
      .github/workflows/label-issue.yml
  4. 37
      .github/workflows/refresh-roadmap-content-json.yml
  5. 38
      .github/workflows/update-deps.yml
  6. 51
      .github/workflows/upgrade-dependencies.yml
  7. 206
      package-lock.json
  8. 2
      package.json
  9. BIN
      public/favicon.ico
  10. 30
      public/roadmap-content/android.json
  11. 696
      public/roadmap-content/angular.json
  12. 53
      public/roadmap-content/backend.json
  13. 2
      public/roadmap-content/computer-science.json
  14. 74
      public/roadmap-content/cyber-security.json
  15. 29
      public/roadmap-content/data-analyst.json
  16. 176
      public/roadmap-content/devops.json
  17. 200
      public/roadmap-content/frontend.json
  18. 51
      public/roadmap-content/full-stack.json
  19. 16
      public/roadmap-content/javascript.json
  20. 20
      public/roadmap-content/postgresql-dba.json
  21. 10
      public/roadmap-content/python.json
  22. 21
      public/roadmap-content/react.json
  23. 45
      public/roadmap-content/software-architect.json
  24. 880
      public/roadmap-content/sql.json
  25. 2
      public/roadmap-content/terraform.json
  26. 77
      public/roadmap-content/typescript.json
  27. 5
      public/roadmap-content/ux-design.json
  28. 15
      src/api/project.ts
  29. 2
      src/components/AuthenticationFlow/EmailLoginForm.tsx
  30. 17
      src/components/Projects/ProjectCard.tsx
  31. 10
      src/components/Projects/ProjectsList.tsx
  32. 8
      src/components/ReactIcons/TwitterIcon.tsx
  33. 16
      src/components/Roadmaps/RoadmapsPage.tsx
  34. 4
      src/components/ShareRoadmapButton.tsx
  35. 1
      src/components/TeamRoadmapsList/TeamRoadmaps.tsx
  36. 30
      src/components/TopicDetail/PaidResourceDisclaimer.tsx
  37. 24
      src/components/TopicDetail/TopicDetail.tsx
  38. 48
      src/data/projects/accessible-form-ui.md
  39. 30
      src/data/projects/accordion.md
  40. 2
      src/data/projects/basic-html-website.md
  41. 35
      src/data/projects/changelog-component.md
  42. 32
      src/data/projects/cookie-consent.md
  43. 30
      src/data/projects/custom-dropdown.md
  44. 36
      src/data/projects/datepicker-ui.md
  45. 39
      src/data/projects/github-random-repo.md
  46. 51
      src/data/projects/image-grid.md
  47. 54
      src/data/projects/portfolio-website.md
  48. 42
      src/data/projects/reddit-client.md
  49. 29
      src/data/projects/restricted-textarea.md
  50. 32
      src/data/projects/simple-tabs.md
  51. 49
      src/data/projects/single-page-cv.md
  52. 34
      src/data/projects/task-tracker-js.md
  53. 33
      src/data/projects/temperature-converter.md
  54. 37
      src/data/projects/testimonial-cards.md
  55. 34
      src/data/projects/tooltip-ui.md
  56. 7
      src/data/roadmaps/android/content/frame@Dp2DOX10u2xJUjB8Okhzh.md
  57. 9
      src/data/roadmaps/android/content/linear@U8iMGGOd2EgPxSuwSG39Z.md
  58. 9
      src/data/roadmaps/android/content/relative@yE0qAQZiEC9R8WvCdskpr.md
  59. 17
      src/data/roadmaps/angular/content/communication@19c7D-fWIJ3vYFT6h8ZfN.md
  60. 9
      src/data/roadmaps/angular/content/developer-tools@EbJib-XfZFF9bpCtL3aBs.md
  61. 9
      src/data/roadmaps/angular/content/locales-by-id@dVKl3Z2Rnf6IB064v19Mi.md
  62. 8
      src/data/roadmaps/angular/content/localize-package@W8OwpEw00xn0GxidlJjdc.md
  63. 2
      src/data/roadmaps/angular/content/pipes@j99WQxuTzGeBBVoReDp_y.md
  64. 12
      src/data/roadmaps/angular/content/testing@lLa-OnHV6GzkNFZu29BIT.md
  65. 15
      src/data/roadmaps/angular/content/transformation@kdMJHljMzGA3oRlh8Zvos.md
  66. 8
      src/data/roadmaps/angular/content/translation-files@jL5amGV1BAX_V5cyTIH7d.md
  67. 10
      src/data/roadmaps/angular/content/typed-forms@XC_K1Wahl2ySqOXoym4YU.md
  68. 7
      src/data/roadmaps/angular/content/using-libraries@YHV5oFwLwphXf1wJTDZuG.md
  69. 1
      src/data/roadmaps/aws/content/100-introduction/index.md
  70. 1
      src/data/roadmaps/backend/content/data-replication@wrl7HHWXOaxoKVlNZxZ6d.md
  71. 1
      src/data/roadmaps/backend/content/database-indexes@y-xkHFE9YzhNIX3EiWspL.md
  72. 14
      src/data/roadmaps/backend/content/javascript@8-lO-v6jCYYoklEJXULxN.md
  73. 1
      src/data/roadmaps/backend/content/orms@Z7jp_Juj5PffSxV7UZcBb.md
  74. 2
      src/data/roadmaps/computer-science/computer-science.json
  75. 0
      src/data/roadmaps/computer-science/content/processes-and-threads@ETEUA7jaEGyOEX8tAVNWs.md
  76. 8
      src/data/roadmaps/cyber-security/content/acl@35oCRzhzpVfitQPL4K9KC.md
  77. 39
      src/data/roadmaps/cyber-security/content/acls@8JM95sonFUhZCdaynUA_M.md
  78. 8
      src/data/roadmaps/cyber-security/content/antimalware@9QtY1hMJ7NKLFztYK-mHY.md
  79. 8
      src/data/roadmaps/cyber-security/content/antivirus@3140n5prZYySsuBHjqGOJ.md
  80. 8
      src/data/roadmaps/cyber-security/content/anyrun@GZHFR43UzN0WIIxGKZOdX.md
  81. 23
      src/data/roadmaps/cyber-security/content/apt@l0BvDtwWoRSEjm6O0WDPy.md
  82. 13
      src/data/roadmaps/cyber-security/content/arp@M52V7hmG4ORf4TIVw3W3J.md
  83. 13
      src/data/roadmaps/cyber-security/content/arp@fzdZF-nzIL69kaA7kwOCn.md
  84. 34
      src/data/roadmaps/cyber-security/content/arp@hkO3Ga6KctKODr4gos6qX.md
  85. 34
      src/data/roadmaps/cyber-security/content/autopsy@bIwpjIoxSUZloxDuQNpMu.md
  86. 54
      src/data/roadmaps/cyber-security/content/aws@0LztOTc3NG3OujCVwlcVU.md
  87. 42
      src/data/roadmaps/cyber-security/content/bash@tao0Bb_JR0Ubl62HO8plp.md
  88. 39
      src/data/roadmaps/cyber-security/content/basics-and-concepts-of-threat-hunting@_x3BgX93N-Pt1_JK7wk0p.md
  89. 61
      src/data/roadmaps/cyber-security/content/basics-of-computer-networking@T0aU8ZQGShmF9uXhWY4sD.md
  90. 21
      src/data/roadmaps/cyber-security/content/basics-of-ids-and-ips@FJsEBOFexbDyAj86XWBCc.md
  91. 37
      src/data/roadmaps/cyber-security/content/basics-of-nas-and-san@umbMBQ0yYmB5PgWfY6zfO.md
  92. 48
      src/data/roadmaps/cyber-security/content/basics-of-reverse-engineering@uoGA4T_-c-2ip_zfEUcJJ.md
  93. 54
      src/data/roadmaps/cyber-security/content/basics-of-subnetting@E8Z7qFFW-I9ivr0HzoXCq.md
  94. 42
      src/data/roadmaps/cyber-security/content/basics-of-threat-intel-osint@wN5x5pY53B8d0yopa1z8F.md
  95. 24
      src/data/roadmaps/cyber-security/content/basics-of-vulnerability-management@lcxAXtO6LoGd85nOFnLo8.md
  96. 43
      src/data/roadmaps/cyber-security/content/blue--red--purple-teams@7tDxTcKJNAUxbHLPCnPFO.md
  97. 21
      src/data/roadmaps/cyber-security/content/bluetooth@DbWf5LdqiByPiJa4xHtl_.md
  98. 23
      src/data/roadmaps/cyber-security/content/box@4Man3Bd-ySLFlAdxbLOHw.md
  99. 2
      src/data/roadmaps/cyber-security/content/brute-force-vs-password-spray@Q0i-plPQkb_NIvOQBVaDd.md
  100. 1
      src/data/roadmaps/cyber-security/content/buffer-overflow@n8ZOZxNhlnw7DpzoXe_f_.md
  101. Some files were not shown because too many files have changed in this diff Show More

@ -3,6 +3,6 @@
"enabled": false
},
"_variables": {
"lastUpdateCheck": 1724925726721
"lastUpdateCheck": 1725962974592
}
}

@ -1,24 +1,26 @@
name: Deploy to EC2
on:
workflow_dispatch: # allow manual run
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 2
- uses: actions/setup-node@v1
- uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v3.0.0
- uses: pnpm/action-setup@v4.0.0
with:
version: 8.15.6
version: 9
# --------------------
# -------------------
# Setup configuration
# --------------------
# -------------------
- name: Prepare configuration files
run: |
git clone https://${{ secrets.GH_PAT }}@github.com/roadmapsh/infra-config.git configuration --depth 1
@ -26,13 +28,14 @@ jobs:
run: |
cp configuration/dist/github/developer-roadmap.env .env
# --------------------
# Prepare the build
# --------------------
- name: Install dependencies
# -----------------
# Prepare the Build
# -----------------
- name: Install Dependencies
run: |
pnpm install
- name: Generate build
- name: Generate Production Build
run: |
git clone https://${{ secrets.GH_PAT }}@github.com/roadmapsh/web-draw.git .temp/web-draw --depth 1
npm run generate-renderer
@ -45,7 +48,7 @@ jobs:
- uses: webfactory/ssh-agent@v0.7.0
with:
ssh-private-key: ${{ secrets.EC2_PRIVATE_KEY }}
- name: Deploy app to EC2
- name: Deploy Application to EC2
run: |
rsync -apvz --delete --no-times --exclude "configuration" -e "ssh -o StrictHostKeyChecking=no" -p ./ ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/var/www/roadmap.sh/
- name: Restart PM2
@ -58,9 +61,9 @@ jobs:
cd /var/www/roadmap.sh
sudo pm2 restart web-roadmap
# --------------------
# ----------------------
# Clear cloudfront cache
# --------------------
# ----------------------
- name: Clear Cloudfront Caching
run: |
curl -L \

@ -1,13 +1,15 @@
name: Label Issue
on:
issues:
types: [ opened, edited ]
jobs:
label-topic-change-issue:
runs-on: ubuntu-latest
steps:
- name: Add roadmap slug to issue as label
uses: actions/github-script@v3
- name: Add Labels To Issue
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
@ -18,7 +20,7 @@ jobs:
if (issue.labels.some(label => label.name === 'topic-change')) {
if (roadmapUrl) {
const roadmapSlug = new URL(roadmapUrl[0]).pathname.replace(/\//, '');
github.issues.addLabels({
github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
@ -28,7 +30,7 @@ jobs:
// Close the issue if it has no roadmap URL
if (!roadmapUrl) {
github.issues.update({
github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,

@ -1,35 +1,35 @@
name: Refreshes roadmap content JSON
name: Refresh Roadmap Content JSON
on:
workflow_dispatch: # allow manual run
workflow_dispatch:
schedule:
- cron: '0 0 * * *' # every day at midnight
- cron: '0 0 * * *'
jobs:
upgrade-deps:
refresh-content:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/checkout@v4
- name: Setup pnpm
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
run_install: false
- name: Setup Node.js
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
cache: 'pnpm'
- name: Install dependencies and generate content JSON
- name: Install Dependencies and Generate Content JSON
run: |
pnpm install
npm run generate:roadmap-content-json
- name: Create PR
uses: peter-evans/create-pull-request@v4
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "chore/update-content-json"
@ -37,9 +37,16 @@ jobs:
labels: |
dependencies
automated pr
reviewers: kamranahmedse,arikchakma
reviewers: kamranahmedse
commit-message: "chore: update roadmap content json"
title: "Update roadmap content json"
title: "Updated Roadmap Content JSON - Automated"
body: |
Updates the roadmap content JSON files in the `public` folder.
Please review the changes and merge if everything looks good.
## Updated Roadmap Content JSON
> [!IMPORTANT]
> This PR Updates the Roadmap Content JSON files stored in the `public` directory.
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please Review the Changes and Merge the PR if everything is fine.**

@ -1,38 +0,0 @@
name: Update dependencies
on:
workflow_dispatch: # allow manual run
schedule:
- cron: '0 0 * * 0' # every sunday at midnight
jobs:
upgrade-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
with:
node-version: 18
- uses: pnpm/action-setup@v2.2.2
with:
version: 7.13.4
- name: Upgrade dependencies
run: |
pnpm install
npm run upgrade
pnpm install --lockfile-only
- name: Create PR
uses: peter-evans/create-pull-request@v4
with:
delete-branch: false
branch: "update-deps"
base: "master"
labels: |
dependencies
automated pr
reviewers: kamranahmedse
commit-message: "chore: update dependencies to latest"
title: "Upgrade dependencies to latest"
body: |
Updates all dependencies to latest versions.
Please review the changes and merge if everything looks good.

@ -0,0 +1,51 @@
name: Upgrade Dependencies
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * 0'
jobs:
upgrade-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install & Upgrade Dependencies
run: |
pnpm install
npm run upgrade
pnpm install --lockfile-only
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "update-deps"
base: "master"
labels: |
dependencies
automated pr
reviewers: kamranahmedse
commit-message: "chore: update dependencies to latest"
title: "Upgrade Dependencies To Latest - Automated"
body: |
## Updated all Dependencies to Latest Versions.
> [!IMPORTANT]
> This PR Upgrades the Dependencies to the Latest Their Versions.
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please Review the Changes and Merge the PR if everything is fine.**

206
package-lock.json generated

@ -18,7 +18,7 @@
"@resvg/resvg-js": "^2.6.2",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"astro": "^4.14.6",
"astro": "^4.15.4",
"clsx": "^2.1.1",
"dayjs": "^1.11.12",
"dom-to-image": "^2.6.0",
@ -506,9 +506,9 @@
}
},
"node_modules/@babel/types": {
"version": "7.25.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz",
"integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==",
"version": "7.25.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz",
"integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
"dependencies": {
"@babel/helper-string-parser": "^7.24.8",
"@babel/helper-validator-identifier": "^7.24.7",
@ -2266,13 +2266,21 @@
]
},
"node_modules/@shikijs/core": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.14.1.tgz",
"integrity": "sha512-KyHIIpKNaT20FtFPFjCQB5WVSTpLR/n+jQXhWHWVUMm9MaOaG9BGOG0MSyt7yA4+Lm+4c9rTc03tt3nYzeYSfw==",
"version": "1.16.3",
"resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.16.3.tgz",
"integrity": "sha512-yETIvrETCeC39gSPIiSADmjri9FwKmxz0QvONMtTIUYlKZe90CJkvcjPksayC2VQOtzOJonEiULUa8v8crUQvA==",
"dependencies": {
"@types/hast": "^3.0.4"
"@shikijs/vscode-textmate": "^9.2.0",
"@types/hast": "^3.0.4",
"oniguruma-to-js": "0.3.3",
"regex": "4.3.2"
}
},
"node_modules/@shikijs/vscode-textmate": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz",
"integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg=="
},
"node_modules/@shuding/opentype.js": {
"version": "1.4.0-beta.0",
"resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz",
@ -2900,20 +2908,17 @@
}
},
"node_modules/astro": {
"version": "4.14.6",
"resolved": "https://registry.npmjs.org/astro/-/astro-4.14.6.tgz",
"integrity": "sha512-MIDyNhtu3L4uakHvlTprh21eQPehYOtZSuSLtd+r6xZcl3lB+mlBz/hs1W3iHEQAORyJnKArWSY/aVOBKUyflA==",
"version": "4.15.4",
"resolved": "https://registry.npmjs.org/astro/-/astro-4.15.4.tgz",
"integrity": "sha512-wqy+m3qygt9DmCSqMsckxyK4ccCUFtti2d/WlLkEpAlqHgyDIg20zRTLHO2v/H4YeSlJ8sAcN0RW2FhOeYbINg==",
"dependencies": {
"@astrojs/compiler": "^2.10.3",
"@astrojs/internal-helpers": "0.4.1",
"@astrojs/markdown-remark": "5.2.0",
"@astrojs/telemetry": "3.1.0",
"@babel/core": "^7.25.2",
"@babel/generator": "^7.25.5",
"@babel/parser": "^7.25.4",
"@babel/plugin-transform-react-jsx": "^7.25.2",
"@babel/traverse": "^7.25.4",
"@babel/types": "^7.25.4",
"@babel/types": "^7.25.6",
"@oslojs/encoding": "^0.4.1",
"@rollup/pluginutils": "^5.1.0",
"@types/babel__core": "^7.20.5",
@ -2936,8 +2941,8 @@
"es-module-lexer": "^1.5.4",
"esbuild": "^0.21.5",
"estree-walker": "^3.0.3",
"execa": "^8.0.1",
"fast-glob": "^3.3.2",
"fastq": "^1.17.1",
"flattie": "^1.1.1",
"github-slugger": "^2.0.0",
"gray-matter": "^4.0.3",
@ -2946,6 +2951,7 @@
"js-yaml": "^4.1.0",
"kleur": "^4.1.5",
"magic-string": "^0.30.11",
"magicast": "^0.3.5",
"micromatch": "^4.0.8",
"mrmime": "^2.0.0",
"neotraverse": "^0.6.18",
@ -2957,14 +2963,15 @@
"prompts": "^2.4.2",
"rehype": "^13.0.1",
"semver": "^7.6.3",
"shiki": "^1.14.1",
"shiki": "^1.16.1",
"string-width": "^7.2.0",
"strip-ansi": "^7.1.0",
"tsconfck": "^3.1.1",
"tinyexec": "^0.3.0",
"tsconfck": "^3.1.3",
"unist-util-visit": "^5.0.0",
"vfile": "^6.0.3",
"vite": "^5.4.2",
"vitefu": "^0.2.5",
"vitefu": "^1.0.2",
"which-pm": "^3.0.0",
"xxhash-wasm": "^1.0.2",
"yargs-parser": "^21.1.1",
@ -4040,28 +4047,6 @@
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
},
"node_modules/execa": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
"integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
"dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^8.0.1",
"human-signals": "^5.0.0",
"is-stream": "^3.0.0",
"merge-stream": "^2.0.0",
"npm-run-path": "^5.1.0",
"onetime": "^6.0.0",
"signal-exit": "^4.1.0",
"strip-final-newline": "^3.0.0"
},
"engines": {
"node": ">=16.17"
},
"funding": {
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@ -4325,17 +4310,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/get-stream": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
"integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/get-tsconfig": {
"version": "4.7.6",
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz",
@ -4720,14 +4694,6 @@
"node": ">= 0.8"
}
},
"node_modules/human-signals": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
"integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
"engines": {
"node": ">=16.17.0"
}
},
"node_modules/humanize-ms": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
@ -4927,17 +4893,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
"integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-unicode-supported": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz",
@ -5252,6 +5207,16 @@
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/magicast": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz",
"integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==",
"dependencies": {
"@babel/parser": "^7.25.4",
"@babel/types": "^7.25.4",
"source-map-js": "^1.2.0"
}
},
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@ -5526,11 +5491,6 @@
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
},
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
},
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@ -6118,17 +6078,6 @@
"node": ">= 0.6"
}
},
"node_modules/mimic-fn": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
"integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mimic-function": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
@ -6325,31 +6274,6 @@
"npm": ">=8.12.1"
}
},
"node_modules/npm-run-path": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
"integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
"dependencies": {
"path-key": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/npm-run-path/node_modules/path-key": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
"integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@ -6397,18 +6321,12 @@
"wrappy": "1"
}
},
"node_modules/onetime": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
"integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
"dependencies": {
"mimic-fn": "^4.0.0"
},
"engines": {
"node": ">=12"
},
"node_modules/oniguruma-to-js": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.3.3.tgz",
"integrity": "sha512-m90/WEhgs8g4BxG37+Nu3YrMfJDs2YXtYtIllhsEPR+wP3+K4EZk6dDUvy2v2K4MNFDDOYKL4/yqYPXDqyozTQ==",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/openai": {
@ -7256,6 +7174,11 @@
"node": ">=8.10.0"
}
},
"node_modules/regex": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/regex/-/regex-4.3.2.tgz",
"integrity": "sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw=="
},
"node_modules/rehype": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz",
@ -7792,11 +7715,12 @@
}
},
"node_modules/shiki": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-1.14.1.tgz",
"integrity": "sha512-FujAN40NEejeXdzPt+3sZ3F2dx1U24BY2XTY01+MG8mbxCiA2XukXdcbyMyLAHJ/1AUUnQd1tZlvIjefWWEJeA==",
"version": "1.16.3",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-1.16.3.tgz",
"integrity": "sha512-GypUE+fEd06FqDs63LSAVlmq7WsahhPQU62cgZxGF+TJT5LjD2k7HTxXj4/CKOVuMM3+wWQ1t4Y5oooeJFRRBQ==",
"dependencies": {
"@shikijs/core": "1.14.1",
"@shikijs/core": "1.16.3",
"@shikijs/vscode-textmate": "^9.2.0",
"@types/hast": "^3.0.4"
}
},
@ -8018,17 +7942,6 @@
"node": ">=0.10.0"
}
},
"node_modules/strip-final-newline": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
"integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/strip-outer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
@ -8250,6 +8163,11 @@
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
},
"node_modules/tinyexec": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz",
"integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg=="
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@ -8319,9 +8237,9 @@
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
},
"node_modules/tsconfck": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz",
"integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==",
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz",
"integrity": "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==",
"bin": {
"tsconfck": "bin/tsconfck.js"
},
@ -9111,9 +9029,9 @@
}
},
"node_modules/vitefu": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
"integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.2.tgz",
"integrity": "sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==",
"peerDependencies": {
"vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
},

@ -39,7 +39,7 @@
"@resvg/resvg-js": "^2.6.2",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"astro": "^4.14.6",
"astro": "^4.15.4",
"clsx": "^2.1.1",
"dayjs": "^1.11.12",
"dom-to-image": "^2.6.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@ -184,18 +184,36 @@
},
"Dp2DOX10u2xJUjB8Okhzh": {
"title": "Frame",
"description": "",
"links": []
"description": "**FrameLayout** is a simple ViewGroup subclass in Android that is designed to hold a single child view or a stack of overlapping child views. It positions each child in the top-left corner by default and allows them to overlap on top of each other, which makes it useful for situations where you need to layer views on top of one another.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Android developers: Frame Layout",
"url": "https://developer.android.com/reference/android/widget/FrameLayout",
"type": "article"
}
]
},
"U8iMGGOd2EgPxSuwSG39Z": {
"title": "Linear",
"description": "",
"links": []
"description": "**LinearLayout** is a view group that aligns all children in a single directioni, vertically or horizontally. You can specify the layout direction with the `android:orientation` attribute.\n\n**LinearLayout** was commonly used in earlier Android development, but with the introduction of ConstraintLayout, it’s less frequently used in modern apps.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Android developers: Linear Layout",
"url": "https://developer.android.com/develop/ui/views/layout/linear",
"type": "article"
}
]
},
"yE0qAQZiEC9R8WvCdskpr": {
"title": "Relative",
"description": "",
"links": []
"description": "A **RelativeLayout** in Android is a type of ViewGroup that allows you to position child views relative to each other or relative to the parent layout. It's a flexible layout where you can arrange the child views in relation to one another based on certain rules, making it suitable for creating complex UI designs.\n\n**RelativeLayout** was commonly used in earlier Android development, but with the introduction of `ConstraintLayout`, it's less frequently used in modern apps.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Android developers: Relative Layout",
"url": "https://developer.android.com/develop/ui/views/layout/relative",
"type": "article"
}
]
},
"3fFNMhQIuuh-NRzSXYpXO": {
"title": "Constraint",

@ -247,8 +247,34 @@
},
"19c7D-fWIJ3vYFT6h8ZfN": {
"title": "Communication",
"description": "",
"links": []
"description": "Angular components can communicate with each other using `@Input()` and `@Output()` decorators. These decorators facilitate data exchange between parent and child components.\n\n* **@Input()**: This decorator allows a parent component to pass data to a child component, enabling the child to receive and use the data.\n* **@Output()**: This decorator allows a child component to emit events to a parent component, enabling the parent to respond to changes or actions within the child component.\n\nAdditionally, **model inputs** are a special type of input that enable two-way data binding. This means that changes in the child component can be propagated back to the parent component, ensuring synchronization between the two. Model inputs automatically create a corresponding output, typically named by appending “Change” to the input’s name, to facilitate this two-way communication.\n\nTo facilitate communication between unrelated components, it’s most effective to trigger events using `EventEmitter` and have the components listen for these events. This approach ensures a decoupled and flexible architecture, allowing components to interact seamlessly without direct dependencies.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Website - Inputs",
"url": "https://angular.dev/guide/components/inputs",
"type": "article"
},
{
"title": "Angular Official Website - Outputs",
"url": "https://angular.dev/guide/components/outputs",
"type": "article"
},
{
"title": "Angular Official Docs - Model Inputs",
"url": "https://angular.dev/guide/signals/model",
"type": "article"
},
{
"title": "Custom events with outputs",
"url": "https://angular.dev/guide/components/outputs",
"type": "article"
},
{
"title": "Non-Related Component Communication | Angular Component & Directives",
"url": "https://www.youtube.com/watch?v=aIkGXMJFTzM",
"type": "video"
}
]
},
"TDyFjKrIZJnCjEZsojPNQ": {
"title": "Parent-Child Interaction",
@ -331,8 +357,34 @@
},
"tC5ETtOuuUcybj1jI4CuG": {
"title": "Dynamic Components",
"description": "",
"links": []
"description": "In addition to using a component directly in a template, you can also dynamically render components. There are two main ways to dynamically render a component: in a template with `NgComponentOutlet`, or in your TypeScript code with `ViewContainerRef`.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Programmatically rendering components",
"url": "https://angular.dev/guide/components/programmatic-rendering",
"type": "article"
},
{
"title": "New Input Binding for NgComponentOutlet",
"url": "https://medium.com/ngconf/new-input-binding-for-ngcomponentoutlet-cb18a86a739d",
"type": "article"
},
{
"title": "Render dynamic components in Angular using ViewContainerRef",
"url": "https://dev.to/railsstudent/render-dynamic-components-in-angular-using-viewcontainerref-160h",
"type": "article"
},
{
"title": "Dynamic Component in Angular (2024)",
"url": "https://www.youtube.com/watch?v=ncbftt3NWVo",
"type": "video"
},
{
"title": "Mastering ViewContainerRef for dynamic component loading in Angular17",
"url": "https://www.youtube.com/watch?v=Ra4PITCt8m0",
"type": "video"
}
]
},
"b_kdNS9PDupcUftslkf9i": {
"title": "Modules",
@ -606,11 +658,6 @@
}
]
},
"Wc2ybRw43uamEtno0FpDv": {
"title": "Template Ref Vars",
"description": "",
"links": []
},
"VsU6713jeIjAOEZnF6gWx": {
"title": "@Input & @Output",
"description": "`@Input()` and `@Output()` give a child component a way to communicate with its parent component. `@Input()` lets a parent component update data in the child component. Conversely, `@Output()` lets the child send data to a parent component.\n\nVisit the following resources to learn more:",
@ -640,8 +687,24 @@
},
"VsC7UmE_AumsBP8fC6to1": {
"title": "Template Syntax",
"description": "",
"links": []
"description": "In Angular, a _template_ is a chunk of HTML. Use special syntax within a template to build on many of Angular's features. Extend the HTML vocabulary of your applications with special Angular syntax in your templates. For example, Angular helps you get and set DOM (Document Object Model) values dynamically with features such as built-in template functions, variables, event listening, and data binding.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Template Syntax",
"url": "https://angular.dev/guide/templates",
"type": "article"
},
{
"title": "An Introduction to Angular Template Syntax",
"url": "https://angularstart.com/modules/basic-angular-concepts/3/",
"type": "article"
},
{
"title": "Craft Dynamic Templates with Angular's Template Syntax",
"url": "https://www.youtube.com/watch?v=uSnUTcf8adI",
"type": "video"
}
]
},
"U1Zy2T-2ki9pDkXn9hn-I": {
"title": "@if",
@ -793,7 +856,7 @@
"links": [
{
"title": "Understanding Pipes",
"url": "https://angular.dev/guide/pipes",
"url": "https://angular.dev/tutorials/learn-angular/22-pipes",
"type": "article"
},
{
@ -1018,7 +1081,7 @@
},
"YF_sG292HqawIX0siWhrv": {
"title": "Router Events",
"description": "The Angular Router raises events when it navigates from one route to another route. It raises several events such as `NavigationStart`, `NavigationEnd`, `NavigationCancel`, `NavigationError`, `ResolveStart`, etc. You can listen to these events and find out when the state of the route changes. Some of the useful events are route change start (NavigationStart) and route change end (NavigationEnd).",
"description": "The Angular Router raises events when it navigates from one route to another route. It raises several events such as `NavigationStart`, `NavigationEnd`, `NavigationCancel`, `NavigationError`, `ResolveStart`, etc. You can listen to these events and find out when the state of the route changes. Some of the useful events are route change start (NavigationStart) and route change end (NavigationEnd).\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Router reference - Router events",
@ -1029,6 +1092,11 @@
"title": "Router event - API",
"url": "https://angular.dev/api/router/RouterEvent",
"type": "article"
},
{
"title": "Router events in Angular",
"url": "https://medium.com/@gurunadhpukkalla/router-events-in-angular-3112a3968660",
"type": "article"
}
]
},
@ -1149,8 +1217,34 @@
},
"XC_K1Wahl2ySqOXoym4YU": {
"title": "Typed Forms",
"description": "",
"links": []
"description": "Since Angular 14, reactive forms are strictly typed by default. You don't have to define extra custom types or add a ton of type annotations to your form declarations to benefit from this extra type safety, as Angular will infer types from the default value of a form control. Non-typed forms are still supported. To use them, you must import the `Untyped` symbols from `@angular/forms`.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - @let",
"url": "https://angular.dev/api/core/@let",
"type": "article"
},
{
"title": "Angular Strictly Typed Forms (Complete Guide)",
"url": "https://blog.angular-university.io/angular-typed-forms/",
"type": "article"
},
{
"title": "Getting started with typed reactive forms in Angular",
"url": "https://www.youtube.com/watch?v=mT3UR0TdDnU",
"type": "video"
},
{
"title": "Angular TYPED Forms: Are You Using Them Correctly?",
"url": "https://www.youtube.com/watch?v=it2BZoIvBPc",
"type": "video"
},
{
"title": "Knowing this makes Angular typed forms WAY less awkward",
"url": "https://www.youtube.com/watch?v=xpRlijg6spo",
"type": "video"
}
]
},
"uDx4lPavwsJFBMzdQ70CS": {
"title": "Template-driven Forms",
@ -1307,8 +1401,29 @@
},
"lfp7PIjwITU5gBITQdirD": {
"title": "RxJS Basics",
"description": "Reactive Extensions for JavaScript, or RxJS, is a reactive library used to implement reactive programming to deal with async implementation, callbacks, and event-based programs.\n\nThe reactive paradigm can be used in many different languages through the use of reactive libraries. These libraries are downloaded APIs that provide functionalities for reactive tools like observers and operators. It can be used in your browser or with Node.js.",
"links": []
"description": "Reactive Extensions for JavaScript, or RxJS, is a reactive library used to implement reactive programming to deal with async implementation, callbacks, and event-based programs.\n\nThe reactive paradigm can be used in many different languages through the use of reactive libraries. These libraries are downloaded APIs that provide functionalities for reactive tools like observers and operators. It can be used in your browser or with Node.js.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "RxJS Docs",
"url": "https://rxjs.dev/guide/overview",
"type": "article"
},
{
"title": "Learn RxJS",
"url": "https://www.learnrxjs.io/",
"type": "article"
},
{
"title": "RxJs and Observables for Beginners: A Beginner Friendly Introduction",
"url": "https://blog.angular-university.io/functional-reactive-programming-for-angular-2-developers-rxjs-and-observables/",
"type": "article"
},
{
"title": "Beginner's RxJS Tutorial: Dive Deep with RxJS Crash Course!",
"url": "https://www.youtube.com/watch?v=yJdh1_FbtjU",
"type": "video"
}
]
},
"krXA6ua7E3m4IIpFkgQZe": {
"title": "Observable Pattern",
@ -1403,8 +1518,13 @@
},
"kdMJHljMzGA3oRlh8Zvos": {
"title": "Transformation",
"description": "In RxJS, \"transformation\" refers to the process of modifying or manipulating the data emitted by an Observable. There are a variety of methods available in RxJS that can be used to transform the data emitted by an Observable, including:\n\n* map: applies a function to each item emitted by the Observable and emits the resulting value\n* mergeMap: applies a function to each item emitted by the Observable, and then merges the resulting Observables into a single Observable\n* switchMap: applies a function to each item emitted by the Observable, and then switches to the latest resulting Observable\n* concatMap: applies a function to each item emitted by the Observable, and then concatenates the resulting Observables into a single Observable\n* exhaustMap: applies a function to each item emitted by the Observable, but ignores subsequent emissions until the current Observable completes\n\nThese are just a few examples of the many methods available in RxJS for transforming the data emitted by an Observable. Each method has its own specific use case, and the best method to use will depend on the requirements of your application.\n\nHere are the official documentation links for the RxJS transformation methods:\n\nYou can find more information and examples on these methods in the official RxJS documentation. Additionally, you can find more operators on [https://rxjs.dev/api/operators](https://rxjs.dev/api/operators) and you can also find more information on the library as a whole on [https://rxjs.dev/](https://rxjs.dev/)",
"description": "In RxJS, \"transformation\" refers to the process of modifying or manipulating the data emitted by an Observable. There are a variety of methods available in RxJS that can be used to transform the data emitted by an Observable, including:\n\n* **map**: applies a function to each item emitted by the Observable and emits the resulting value\n* **mergeMap**: applies a function to each item emitted by the Observable, and then merges the resulting Observables into a single Observable\n* **switchMap**: applies a function to each item emitted by the Observable, and then switches to the latest resulting Observable\n* **concatMap**: applies a function to each item emitted by the Observable, and then concatenates the resulting Observables into a single Observable\n* **exhaustMap**: applies a function to each item emitted by the Observable, but ignores subsequent emissions until the current Observable completes\n\nThese are just a few examples of the many methods available in RxJS for transforming the data emitted by an Observable. Each method has its own specific use case, and the best method to use will depend on the requirements of your application.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "RxJs Docs - Operators",
"url": "https://rxjs.dev/api/operators",
"type": "article"
},
{
"title": "map",
"url": "https://rxjs.dev/api/operators/map",
@ -1663,7 +1783,7 @@
},
"m4WBnx_9h01Jl6Q1sxi4Y": {
"title": "Zones",
"description": "Zone.js is a signaling mechanism that Angular uses to detect when an application state might have changed. It captures asynchronous operations like setTimeout, network requests, and event listeners. Angular schedules change detection based on signals from Zone.js.",
"description": "Zone.js is a signaling mechanism that Angular uses to detect when an application state might have changed. It captures asynchronous operations like setTimeout, network requests, and event listeners. Angular schedules change detection based on signals from Zone.js.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Resolving zone pollution",
@ -1679,6 +1799,11 @@
"title": "NgZone - API",
"url": "https://angular.dev/api/core/NgZone",
"type": "article"
},
{
"title": "WTF is \"Zone.js\" and is it making your app slow?",
"url": "https://www.youtube.com/watch?v=lmrf_gPIOZU",
"type": "video"
}
]
},
@ -1720,8 +1845,29 @@
},
"EbJib-XfZFF9bpCtL3aBs": {
"title": "Developer Tools",
"description": "",
"links": []
"description": "Angular offers a suite of powerful developer tools designed to streamline and enhance the development process. These include the Angular CLI for efficient project setup and management, the Angular DevTools extension for advanced debugging and profiling, and the Angular Language Service for improved code editing and completion. Leveraging these tools will significantly improve your ability to write high-quality Angular code.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "VS Code NG Language Service",
"url": "https://github.com/angular/vscode-ng-language-service",
"type": "opensource"
},
{
"title": "Angular Official Docs - devtools",
"url": "https://angular.dev/tools/devtools",
"type": "article"
},
{
"title": "Angular Official Docs - CLI",
"url": "https://angular.dev/tools/cli",
"type": "article"
},
{
"title": "Language Service Docs",
"url": "https://angular.dev/tools/language-service",
"type": "article"
}
]
},
"4YSk6I63Ew--zoXC3xmrC": {
"title": "Angular CLI",
@ -1751,18 +1897,106 @@
},
"FVH0lnbIZ2m5EfF2EJ2DW": {
"title": "Local Setup",
"description": "",
"links": []
"description": "To install Angular CLI on your local system, you need to install `Node.js`. Angular requires an active LTS or maintenance LTS version of Node. Angular CLI uses Node and its associated package manager, npm, to install and run JavaScript tools outside the browser. Once you have Node installed, you can run `npm install -g @angular/cli` to install the Angular CLI.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Local set-up",
"url": "https://angular.dev/tools/cli/setup-local",
"type": "article"
},
{
"title": "Angular Official Docs - Version compatibility guide",
"url": "https://angular.dev/reference/versions",
"type": "article"
},
{
"title": "How To Install Angular CLI In Windows 10 | In Under 2 Minutes!",
"url": "https://www.youtube.com/watch?v=vjgACKkPENg",
"type": "video"
},
{
"title": "How to Install Multiple Versions of Angular in Your Development Environment",
"url": "https://www.youtube.com/watch?v=LYNG3kcKRQ8",
"type": "video"
}
]
},
"1fVi9AK6aLjt5QgAFbnGX": {
"title": "Deployment",
"description": "",
"links": []
"description": "The Angular CLI command `ng deploy` executes the deploy CLI builder associated with your project. A number of third-party builders implement deployment capabilities to different platforms. You can add any of them to your project with `ng add`.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "NGX AWS Deploy",
"url": "https://github.com/Jefiozie/ngx-aws-deploy",
"type": "opensource"
},
{
"title": "Angular CLI GitHub Pages",
"url": "https://github.com/angular-schule/angular-cli-ghpages",
"type": "opensource"
},
{
"title": "Angular Official Docs - Deployment",
"url": "https://angular.dev/tools/cli/deployment",
"type": "article"
},
{
"title": "Firebase Hosting",
"url": "https://firebase.google.com/docs/hosting",
"type": "article"
},
{
"title": "Vercel: Angular Solutions",
"url": "https://vercel.com/solutions/angular",
"type": "article"
},
{
"title": "Netlify",
"url": "https://docs.netlify.com/frameworks/angular/",
"type": "article"
},
{
"title": "Cloudflare Pages",
"url": "https://developers.cloudflare.com/pages/framework-guides/deploy-an-angular-site/#create-a-new-project-using-the-create-cloudflare-cli-c3",
"type": "article"
},
{
"title": "AWS Amplify",
"url": "https://docs.amplify.aws/angular/",
"type": "article"
}
]
},
"yhNGhduk__ow8VTLc6inZ": {
"title": "End-to-End Testing",
"description": "",
"links": []
"description": "End-to-end or (E2E) testing is a form of testing used to assert your entire application works as expected from start to finish or \"end-to-end\". E2E testing differs from unit testing in that it is completely decoupled from the underlying implementation details of your code. It is typically used to validate an application in a way that mimics the way a user would interact with it. The `ng e2e` command will first check your project for the \"e2e\" target. If it can't locate it, the CLI will then prompt you which e2e package you would like to use and walk you through the setup.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - End to End Testing",
"url": "https://angular.dev/tools/cli/end-to-end",
"type": "article"
},
{
"title": "Cypress Official Docs - Your First Test with Cypress",
"url": "https://docs.cypress.io/guides/end-to-end-testing/writing-your-first-end-to-end-test",
"type": "article"
},
{
"title": "Nightwatch Official Docs - Writing Tests: Introduction",
"url": "https://nightwatchjs.org/guide/writing-tests/introduction.html",
"type": "article"
},
{
"title": "Webdriver Official Docs - Getting Started",
"url": "https://webdriver.io/docs/gettingstarted/",
"type": "article"
},
{
"title": "Puppeteer Angular Schematic",
"url": "https://pptr.dev/guides/ng-schematics/#getting-started",
"type": "article"
}
]
},
"Uvr0pRk_fOzwRwqn0dQ6N": {
"title": "Schematics",
@ -1798,8 +2032,24 @@
},
"TeWEy9I-hU6SH02Sy2S2S": {
"title": "CLI Builders",
"description": "",
"links": []
"description": "A number of Angular CLI commands run a complex process on your code, such as building, testing, or serving your application. The commands use an internal tool called `Architect` to run CLI builders, which invoke another tool (bundler, test runner, server) to accomplish the desired task. Custom builders can perform an entirely new task or to change which third-party tool is used by an existing command.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Builders",
"url": "https://github.com/just-jeb/angular-builders",
"type": "opensource"
},
{
"title": "Angular Official Docs - CLI Builders",
"url": "https://angular.dev/tools/cli/cli-builder",
"type": "article"
},
{
"title": "Angular Builders – Creating Custom Builder from Scratch",
"url": "https://www.youtube.com/watch?v=QbDkDLnXAZE",
"type": "video"
}
]
},
"MwtM1UAIfj4FJ-Y4CKDsP": {
"title": "AoT Compilation",
@ -1877,13 +2127,40 @@
},
"YHV5oFwLwphXf1wJTDZuG": {
"title": "Using Libraries",
"description": "",
"links": []
"description": "Libraries are published as `npm packages`, usually together with schematics that integrate them with the Angular CLI. To integrate reusable library code into an application, you need to install the package and import the provided functionality in the location you use it. For most published Angular libraries, use the `ng add <lib_name>` Angular CLI command. A published library typically provides a `README` file or other documentation on how to add that library to your application. A library is able to be updated by the publisher, and also has individual dependencies which need to be kept current. To check for updates to your installed libraries, use the `ng update` Angular CLI command.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Using Libraries",
"url": "https://angular.dev/tools/libraries/using-libraries",
"type": "article"
},
{
"title": "npm",
"url": "https://www.npmjs.com/",
"type": "article"
}
]
},
"A1mYMg7cbcj6p_VkDf-Tz": {
"title": "Creating Libraries",
"description": "",
"links": []
"description": "If you have developed features that are suitable for reuse, you can create your own libraries. These libraries can be used locally in your workspace, or you can publish them as npm packages to share with other projects or other Angular developers. Putting code into a separate library is more complex than simply putting everything in one application. It requires more of an investment in time and thought for managing, maintaining, and updating the library. This complexity can pay off when the library is being used in multiple applications.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "NG Packagr",
"url": "https://github.com/ng-packagr/ng-packagr",
"type": "opensource"
},
{
"title": "Angular Official Docs - Creating Libraries",
"url": "https://angular.dev/tools/libraries/creating-libraries",
"type": "article"
},
{
"title": "Angular Official Docs - File Structure: Library project files",
"url": "https://angular.dev/reference/configs/file-structure#library-project-files",
"type": "article"
}
]
},
"jfHaS8TqE4tcAo59K8Nkn": {
"title": "SSR",
@ -1908,8 +2185,24 @@
},
"b-0yQ74zHtAxI9aRLBohc": {
"title": "SSG",
"description": "SSG (Static Site Generator), helps in building the HTML full website, during the process of building and serving that HTML Page. This method helps to generate the HTML website on the client side before its being served on the server side. Therefore, whenever a user requests a HTML Page, firstly HTML page will be rendered and secondly, the angular app will be rendered. The SSG can be used only if your website is static (or) it's content doesn't changes frequently.",
"links": []
"description": "SSG (Static Site Generator) helps in building the HTML full website during the process of building and serving that HTML page. This method helps to generate the HTML website on the client side before it's served on the server side. Therefore, whenever a user requests a HTML page, the HTML page will be rendered, and secondly, the Angular app will be rendered. The SSG can be used only if your website is static or its content doesn't change frequently.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Air with Alyssa Nicoll - SSR, SSG, ISR, & SOS",
"url": "https://www.youtube.com/watch?v=b0pUU7RJbBQ",
"type": "podcast"
},
{
"title": "Angular Official Docs - Prerendering (SSG)",
"url": "https://angular.dev/guide/prerendering",
"type": "article"
},
{
"title": "Angular 16 Pre Rendering Static Pages - Static Site Generation SSG",
"url": "https://www.youtube.com/watch?v=vmOWJvm3apA",
"type": "video"
}
]
},
"kauQofxCmpktXPcnzid17": {
"title": "AnalogJS",
@ -2019,18 +2312,66 @@
},
"xH3RHPhsaqD9zIMms5OmX": {
"title": "HTTP Vulnerabilities",
"description": "",
"links": []
"description": "Angular has built-in support to help prevent two common HTTP vulnerabilities, cross-site request forgery (CSRF or XSRF) and cross-site script inclusion (XSSI). Both of these must be mitigated primarily on the server side, but Angular provides helpers to make integration on the client side easier.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Security",
"url": "https://angular.dev/best-practices/security",
"type": "article"
},
{
"title": "Angular | HackTricks",
"url": "https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/angular",
"type": "article"
}
]
},
"Z1DZBbFI4oU6-KQg3wqMm": {
"title": "Cross-site Request Forgery",
"description": "",
"links": []
"description": "Cross-site request forgery, also known as one-click attack or session riding and abbreviated as CSRF or XSRF, is a type of malicious exploit of a website or web application where unauthorized commands are submitted from a user that the web application trusts. There are many ways in which a malicious website can transmit such commands; specially-crafted image tags, hidden forms, and JavaScript fetch or XMLHttpRequests, for example, can all work without the user's interaction or knowledge. Unlike cross-site scripting (XSS), which exploits the trust a user has for a particular site, CSRF exploits the trust that a site has in a user's browser. In a CSRF attack, an innocent end user is tricked by an attacker into submitting a web request that they did not intend. This may cause actions to be performed on the website that can include inadvertent client or server data leakage, change of session state, or manipulation of an end user's account. Angular provides built-in protection against CSRF attacks through the `HttpClientXsrfModule` module. This module automatically adds a token to outgoing requests and validates it on the server side.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Cross Site Request Forgery",
"url": "https://angular.dev/best-practices/security#cross-site-request-forgery",
"type": "article"
},
{
"title": "HttpClientXsrfModule",
"url": "https://angular.dev/api/common/http/HttpClientXsrfModule",
"type": "article"
},
{
"title": "Configure the CSRF Protection With Spring Security 6 and Angular",
"url": "https://www.youtube.com/watch?v=tgjLsEmxcuY",
"type": "video"
},
{
"title": "Angular security - CSRF prevention using Double Submit Cookie",
"url": "https://www.youtube.com/watch?v=lZfF4MOTeNM",
"type": "video"
}
]
},
"m2aw8vb4rz4IjshpoMyNx": {
"title": "HttpClient CSRF",
"description": "",
"links": []
"description": "HttpClient includes a built-in mechanism to prevent XSRF attacks. When making HTTP requests, an interceptor reads a token from a cookie (default name: XSRF-TOKEN) and sets it as an HTTP header (X-XSRF-TOKEN). Since only code running on your domain can read this cookie, the backend can verify that the HTTP request originates from your client application and not from an attacker.\n\nHowever, HttpClient only handles the client-side aspect of XSRF protection. Your backend service must be configured to set the cookie for your page and verify that the header is present on all relevant requests. Without this backend configuration, Angular’s default XSRF protection will not be effective.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Security",
"url": "https://angular.dev/best-practices/security#httpclient-xsrf-csrf-security",
"type": "article"
},
{
"title": "How can you protect Angular Web app from cross site request forgery?",
"url": "https://www.linkedin.com/advice/3/how-can-you-protect-angular-web-app-from-cross-site-pyqwc",
"type": "article"
},
{
"title": "Cross Site Request Forgery: XSRF protection in Angular",
"url": "https://borstch.com/blog/development/cross-site-request-forgery-xsrf-protection-in-angular",
"type": "article"
}
]
},
"ni00edsphJd7uBLCn7-Vw": {
"title": "XSRF protection",
@ -2039,8 +2380,24 @@
},
"zd7YJGlcMFNFbsKUiW_XC": {
"title": "Cross-site Script Inclusion",
"description": "",
"links": []
"description": "Cross-site script inclusion, also known as JSON vulnerability, can allow an attacker's website to read data from a JSON API. The attack works on older browsers by overriding built-in JavaScript object constructors, and then including an API URL using a `<script>` tag. Angular's HttpClient library recognizes this convention and automatically strips the string \")\\]}',\\\\n\" from all responses before further parsing.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Cross Site Script Inclusion",
"url": "https://angular.dev/best-practices/security#cross-site-script-inclusion-xssi",
"type": "article"
},
{
"title": "XSSI Cross Site Script Inclusion",
"url": "https://book.hacktricks.xyz/pentesting-web/xssi-cross-site-script-inclusion",
"type": "article"
},
{
"title": "Testing for Cross Site Script Inclusion",
"url": "https://owasp.org/www-project-web-security-testing-guide/v41/4-Web_Application_Security_Testing/11-Client_Side_Testing/13-Testing_for_Cross_Site_Script_Inclusion",
"type": "article"
}
]
},
"VNG9DdXlS6R1OJ6Lrn4Lt": {
"title": "Accessibility",
@ -2208,28 +2565,118 @@
},
"pRSR5PEbkJXAJ1LPyK-EE": {
"title": "Zone Pollution",
"description": "",
"links": []
"description": "`Zone.js` is a signaling mechanism that Angular uses to detect when an application state might have changed. In some cases, scheduled tasks or microtasks don’t make any changes in the data model, which makes running change detection unnecessary. Common examples are `requestAnimationFrame`, `setTimeout` and `setInterval`. You can identify change detection with Angular DevTools, and you can run code outside the Angular zone to avoid unnecessary change detection calls.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Zone Pollution",
"url": "https://angular.dev/best-practices/zone-pollution",
"type": "article"
},
{
"title": "Angular Official Docs - DevTools",
"url": "https://angular.dev/tools/devtools",
"type": "article"
},
{
"title": "NgZone in Angular - Improve Performance by Running Code Outside Angular",
"url": "https://www.youtube.com/watch?v=7duYY9IFIuw",
"type": "video"
},
{
"title": "4 Runtime Performance Optimizations",
"url": "https://www.youtube.com/watch?v=f8sA-i6gkGQ",
"type": "video"
}
]
},
"yxUtSBzJPRcS-IuPsyp-W": {
"title": "Slow Computations",
"description": "",
"links": []
"description": "On every change detection cycle, Angular synchronously evaluates all template expressions in components based on their detection strategy and executes the `ngDoCheck`, `ngAfterContentChecked`, `ngAfterViewChecked`, and `ngOnChanges` lifecycle hooks. To remove slow computations, you can optimize algorithms, cache data with pure pipes or memoization, and limit lifecycle hook usage.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Slow Computations",
"url": "https://angular.dev/best-practices/slow-computations",
"type": "article"
},
{
"title": "Angular Performance Optimization",
"url": "https://davembush.medium.com/angular-performance-optimization-5ec630d2b8f1",
"type": "article"
}
]
},
"NY_MfBNgNmloiRGcIvfJ1": {
"title": "Hydration",
"description": "",
"links": []
"description": "Hydration is the process that restores the server-side rendered application on the client. This includes things like reusing the server rendered DOM structures, persisting the application state, transferring application data that was retrieved already by the server, and other processes. Hydration can be enabled for server-side rendered (SSR) applications only. You can enable hydration manually by visiting your main application component or module and importing `provideClientHydration` from `@angular/platform-browser`.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Hydration",
"url": "https://angular.dev/guide/hydration",
"type": "article"
},
{
"title": "Angular Official Docs - provideClientHydration",
"url": "https://angular.dev/api/platform-browser/provideClientHydration",
"type": "article"
},
{
"title": "Angular Hydration",
"url": "https://www.bacancytechnology.com/blog/angular-hydration",
"type": "article"
},
{
"title": "Angular SSR Deep Dive (With Client HYDRATION)",
"url": "https://www.youtube.com/watch?v=U1MP4uCuUVI",
"type": "video"
}
]
},
"lLa-OnHV6GzkNFZu29BIT": {
"title": "Testing",
"description": "In any software development process, Testing the application plays a vital role. If Bugs and crashes are not figured out and solved they can defame the development company as well as hurt the clients too. But, Angular’s architecture comes with built-in testability features. As soon as you create a new project with Angular CLI, two essential testing tools are installed.They are: Jasmine and Karma. Jasmine is the testing library which structures individual tests into specifications (“specs”) and suites. And Karma is the test runner, which enables the different browsers to run the tests mentioned by Jasmine and the browsers will finally report the test results back.",
"links": []
"description": "In any software development process, testing the application plays a vital role. If bugs and crashes are not figured out and solved they can defame the development company as well as hurt the clients too. But, Angular’s architecture comes with built-in testability features. As soon as you create a new project with Angular CLI, two essential testing tools are installed. They are: Jasmine and Karma. Jasmine is the testing library which structures individual tests into specifications (“specs”) and suites. And Karma is the test runner, which enables the different browsers to run the tests mentioned by Jasmine and the browsers will finally report the test results back.\n\nYou can also unit test an Angular application with other testing libraries and test runners. Each library and runner has its own distinctive installation procedures, configuration, and syntax.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Testing",
"url": "https://angular.dev/guide/testing",
"type": "article"
},
{
"title": "Jasmine Official Docs",
"url": "https://jasmine.github.io/",
"type": "article"
},
{
"title": "Karma Official Docs",
"url": "https://karma-runner.github.io/latest/index.html",
"type": "article"
},
{
"title": "Testing Angular - A Guide to Robust Angular Applications",
"url": "https://testing-angular.com/",
"type": "article"
},
{
"title": "Introduction | Angular Unit Testing Made Easy: A Comprehensive Introduction",
"url": "https://www.youtube.com/watch?v=emnwsVy8wRs",
"type": "video"
}
]
},
"HU1eTYB321C93qh_U7ioF": {
"title": "Testing Services",
"description": "",
"links": []
"description": "To ensure your services function as expected, you can write dedicated tests for them. Services are typically the easiest files to unit test. You can instantiate the service within a `beforeEach` block, invoke its methods, and assert the results.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Testing Services",
"url": "https://angular.dev/guide/testing/services",
"type": "article"
},
{
"title": "Step by Step implementation of the Calculator Service with Jasmine Specification",
"url": "https://www.youtube.com/watch?v=yoJDYEq8vSs",
"type": "video"
}
]
},
"rH13NBFG02hnn5eABSNCY": {
"title": "Testing Pipes",
@ -2254,12 +2701,28 @@
},
"4xt0m5jkUqB4Z-krcFBuL": {
"title": "Testing Requests",
"description": "",
"links": []
"description": "As for any external dependency, you must mock the HTTP backend so your tests can simulate interaction with a remote server. The `@angular/common/http/testing` library provides tools to capture requests made by the application, make assertions about them, and mock the responses to emulate your backend's behavior.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Testing Requests",
"url": "https://angular.dev/guide/http/testing",
"type": "article"
},
{
"title": "Import Http Client Testing Module and make Test call with the HttpClient",
"url": "https://www.youtube.com/watch?v=Sgy_RRXC9As",
"type": "video"
},
{
"title": "HTTP | Angular Unit Testing Made Easy: Comprehensive Guide to HTTP Testing",
"url": "https://www.youtube.com/watch?v=7rlwryYhGzs",
"type": "video"
}
]
},
"TGRZBizDy83JKg_MhnRdX": {
"title": "Services with Dependencies",
"description": "In an Angular application, Services are responsible for fetching, storing and processing data. Services are singletons, meaning there is only one instance of a Service during runtime. They are fit for central data storage, HTTP and WebSocket communication as well as data validation.\n\nVisit the following resources to learn more:",
"description": "When you add a dependency to your service, you must also include it in your tests. For isolated tests, pass an instance of the injectable dependency class into the service’s constructor. Using the `inject` function can add complexity. Injecting the real service is often impractical because dependent services can be difficult to create and control. Instead, mock the dependency, use a dummy value, or create a spy on the relevant service method. By using the TestBed testing utility, you can let Angular’s dependency injection handle service creation and manage constructor argument order.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Website",
@ -2272,9 +2735,19 @@
"type": "article"
},
{
"title": "Explore top posts about Testing",
"url": "https://app.daily.dev/tags/testing?ref=roadmapsh",
"type": "article"
"title": "Testing the Service which has another service injected through Dependency Injection",
"url": "https://www.youtube.com/watch?v=ACb8wqwgOV4",
"type": "video"
},
{
"title": "Testing Services which has HttpClient as dependency by using Jasmine Spy",
"url": "https://www.youtube.com/watch?v=15othucRXcI",
"type": "video"
},
{
"title": "Angular Unit Tests with the inject() function",
"url": "https://www.youtube.com/watch?v=Tvsa4OMUGXs",
"type": "video"
}
]
},
@ -2317,8 +2790,29 @@
},
"f5v74Uw54LsB4FgdN6eCd": {
"title": "Debugging Tests",
"description": "",
"links": []
"description": "If your tests aren't working as you expect them to, you can inspect and debug them in the browser. Be sure to set breakpoints to track your application's execution.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Debugging tests",
"url": "https://angular.dev/guide/testing/debugging",
"type": "article"
},
{
"title": "Angular Official Docs - Devtools",
"url": "https://angular.dev/tools/devtools",
"type": "article"
},
{
"title": "Debug Like a Pro: Essential Breakpoint Techniques in Angular",
"url": "https://www.youtube.com/watch?v=Be9Q1cchurQ",
"type": "video"
},
{
"title": "Debug Angular 17 Code in VS Code with Break Points and Extensions",
"url": "https://www.youtube.com/watch?v=r50UXhT9hc0",
"type": "video"
}
]
},
"0dYWO_Zvh9J5_6cRjRjvI": {
"title": "Component Templates",
@ -2385,23 +2879,87 @@
},
"W8OwpEw00xn0GxidlJjdc": {
"title": "Localize Package",
"description": "",
"links": []
"description": "To take advantage of the localization features of Angular, use the Angular CLI to add the `@angular/localize` package to your project. If `@angular/localize` is not installed and you try to build a localized version of your project (for example, while using the i18n attributes in templates), the Angular CLI will generate an error, which would contain the steps that you can take to enable i18n for your project.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Add the localize package",
"url": "https://angular.dev/guide/i18n/add-package",
"type": "article"
},
{
"title": "Learn to Internationalize Your Angular Apps with @angular/localize",
"url": "https://www.youtube.com/watch?v=5h7HPY1OMfU",
"type": "video"
},
{
"title": "Multi-Language Support in Angular: A Guide to Localization and Internationalization",
"url": "https://www.youtube.com/watch?v=ouI21AyJ9tE",
"type": "video"
}
]
},
"dVKl3Z2Rnf6IB064v19Mi": {
"title": "Locales by ID",
"description": "",
"links": []
"description": "Angular uses the Unicode locale identifier (Unicode locale ID) to find the correct locale data for internationalization of text strings. A locale ID specifies the language, country, and an optional code for further variants or subdivisions. A locale ID consists of the language identifier, a hyphen (-) character, and the locale extension. By default, Angular uses `en-US` as the source locale of your project.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular locales",
"url": "https://github.com/angular/angular/tree/main/packages/common/locales",
"type": "opensource"
},
{
"title": "Angular Official Docs - Refer to locales by ID",
"url": "https://angular.dev/guide/i18n/locale-id",
"type": "article"
},
{
"title": "Codes arranged alphabetically by alpha-3/ISO 639-2 Code",
"url": "https://www.loc.gov/standards/iso639-2/php/code_list.php",
"type": "article"
},
{
"title": "Unicode CLDR Specifications",
"url": "https://cldr.unicode.org/index/cldr-spec",
"type": "article"
}
]
},
"jL5amGV1BAX_V5cyTIH7d": {
"title": "Translation Files",
"description": "",
"links": []
"description": "After you prepare a component for translation, use the `extract-i18n` Angular CLI command to extract the marked text in the component into a source language file. The marked text includes text marked with `i18n`, attributes marked with `i18n`\\-attribute, and text tagged with `$localize`. The `extract-i18n` command creates a source language file named `messages.xlf` in the root directory of your project. If you have multiple language files, add the locale to the file name, like `messages.{locale}.xlf`.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Translation Files",
"url": "https://angular.dev/guide/i18n/translation-files",
"type": "article"
},
{
"title": "Angular Official Docs - Extract i18n",
"url": "https://angular.dev/cli/extract-i18n",
"type": "article"
},
{
"title": "Angular i18n: internationalization & localization with examples",
"url": "https://lokalise.com/blog/angular-i18n/",
"type": "article"
}
]
},
"9ISvaaJ815_cr_KW9vQhT": {
"title": "Multiple Locales",
"description": "",
"links": []
"description": "To deploy an Angular application with multiple locales, follow these steps:\n\n1. Place different versions of your app in locale-specific directories\n2. Use the HTML `<base>` tag with the `href` attribute to set the base URL for relative links.\n3. Deploy each language version in a different subdirectory. Redirect users to their preferred language based on the `Accept-Language` HTTP header.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Angular Official Docs - Deploy Multiple Locales",
"url": "https://angular.dev/guide/i18n/deploy",
"type": "article"
},
{
"title": "How Make Multi-Language Angular Websites - Full Guidance On Angular Localization",
"url": "https://www.youtube.com/watch?v=vSwYuyH4kMA",
"type": "video"
}
]
},
"rYJq59Q0YdfK6n3x740Em": {
"title": "Animation",

@ -191,41 +191,21 @@
},
"8-lO-v6jCYYoklEJXULxN": {
"title": "JavaScript",
"description": "Apart from being used in the browser, JavaScript is also used in backend e.g. using [Node.js](https://nodejs.org/) or [Deno](https://deno.land/) for writing server-side code in JavaScript.\n\nIf you pick up JavaScript for the Backend, my personal recommendation would be to learn [JavaScript](/javascript) and then go with [Node.js](/nodejs) as it is the most popular and widely used option. Also, I would recommend learning TypeScript later on as you continue with your backend development Journey; it's a superset of JavaScript and is used in many projects.\n\nVisit the following resources to learn more:",
"description": "JavaScript allows you to add interactivity to your pages. Common examples that you may have seen on the websites are sliders, click interactions, popups and so on.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "You Dont Know JS Yet (book series) ",
"url": "https://github.com/getify/You-Dont-Know-JS",
"type": "opensource"
},
{
"title": "Visit Dedicated JavaScript Roadmap",
"url": "/javascript",
"type": "article"
},
{
"title": "W3Schools – JavaScript Tutorial",
"url": "https://www.w3schools.com/js/",
"type": "article"
},
{
"title": "The Modern JavaScript Tutorial",
"url": "https://javascript.info/",
"type": "article"
},
{
"title": "Eloquent Javascript - Book",
"url": "https://eloquentjavascript.net/",
"type": "article"
},
{
"title": "Visit Dedicated Node.js Roadmap",
"url": "/nodejs",
"type": "article"
},
{
"title": "JavaScript Beginner Resources",
"url": "https://www.javascript.com/",
"title": "Build 30 Javascript projects in 30 days",
"url": "https://javascript30.com/",
"type": "article"
},
{
@ -235,17 +215,7 @@
},
{
"title": "JavaScript Crash Course for Beginners",
"url": "https://youtu.be/hdI2bqOjy3c",
"type": "video"
},
{
"title": "Node.js Crash Course",
"url": "https://www.youtube.com/watch?v=fBNz5xF-Kx4",
"type": "video"
},
{
"title": "Node.js Tutorial for Beginners",
"url": "https://www.youtube.com/watch?v=TlB_eWDSMt4",
"url": "https://youtu.be/hdI2bqOjy3c?t=2",
"type": "video"
}
]
@ -826,11 +796,6 @@
"url": "https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping",
"type": "article"
},
{
"title": "What is an ORM and how should I use it?",
"url": "https://stackoverflow.com/questions/1279613/what-is-an-orm-how-does-it-work-and-how-should-i-use-one",
"type": "article"
},
{
"title": "What is an ORM, how does it work, and how should I use one?",
"url": "https://stackoverflow.com/a/1279678",
@ -957,6 +922,11 @@
"title": "Database Indexes",
"description": "An index is a data structure that you build and assign on top of an existing table that basically looks through your table and tries to analyze and summarize so that it can create shortcuts.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Database index - Wikipedia",
"url": "https://en.wikipedia.org/wiki/Database_index",
"type": "article"
},
{
"title": "Explore top posts about Database",
"url": "https://app.daily.dev/tags/database?ref=roadmapsh",
@ -994,6 +964,11 @@
"title": "Data Replication",
"description": "Data replication is the process by which data residing on a physical/virtual server(s) or cloud instance (primary instance) is continuously replicated or copied to a secondary server(s) or cloud instance (standby instance). Organizations replicate data to support high availability, backup, and/or disaster recovery.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "What is data replication?",
"url": "https://www.ibm.com/topics/data-replication",
"type": "article"
},
{
"title": "What is Data Replication?",
"url": "https://youtu.be/fUrKt-AQYtE",

@ -3954,7 +3954,7 @@
]
},
"ETEUA7jaEGyOEX8tAVNWs": {
"title": "Porcesses and Threads",
"title": "Processes and Threads",
"description": "Processes and threads are the basic building blocks of a computer program. They are the smallest units of execution in a program. A process is an instance of a program that is being executed. A thread is a sequence of instructions within a process that can be executed independently of other code.\n\nVisit the following resources to learn more:",
"links": [
{

@ -1735,8 +1735,19 @@
},
"iolsTC-63d_1wzKGul-cT": {
"title": "DLP",
"description": "",
"links": []
"description": "Data Loss Prevention (DLP) refers to a set of strategies, tools, and processes used by organizations to ensure that sensitive data is not lost, accessed, or misused by unauthorized users. DLP solutions monitor, detect, and block the movement of critical information outside an organization’s network, helping to prevent data breaches, leaks, and other security incidents.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "What is data loss prevention (DLP)?",
"url": "https://www.techtarget.com/whatis/definition/data-loss-prevention-DLP",
"type": "article"
},
{
"title": "What is DLP (data loss prevention)?",
"url": "https://www.cloudflare.com/es-es/learning/access-management/what-is-dlp/",
"type": "article"
}
]
},
"35oCRzhzpVfitQPL4K9KC": {
"title": "ACL",
@ -1750,13 +1761,35 @@
},
"l5EnhOCnkN-RKvgrS9ylH": {
"title": "HIPS",
"description": "",
"links": []
"description": "A Host Intrusion Prevention System (HIPS) is a security solution designed to monitor and protect individual host devices, such as servers, workstations, or laptops, from malicious activities and security threats. HIPS actively monitors system activities and can detect, prevent, and respond to unauthorized or anomalous behavior by employing a combination of signature-based, behavior-based, and heuristic detection methods.\n\nHIPS operates at the host level, providing a last line of defense by securing the individual endpoints within a network. It is capable of preventing a wide range of attacks, including zero-day exploits, malware infections, unauthorized access attempts, and policy violations.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "What is an Intrusion Prevention System?",
"url": "https://www.paloaltonetworks.com/cyberpedia/what-is-an-intrusion-prevention-system-ips",
"type": "article"
},
{
"title": "What is Host intrusion prevention system (HIPS)?",
"url": "https://cyberpedia.reasonlabs.com/EN/host%20intrusion%20prevention%20system%20(hips).html",
"type": "article"
}
]
},
"LIPtxl_oKZRcbvXT4EdNf": {
"title": "NIDS",
"description": "",
"links": []
"description": "A Network Intrusion Detection System (NIDS) is a security solution designed to monitor and analyze network traffic for signs of suspicious activity or potential threats. NIDS operates by inspecting the data packets that flow through a network, looking for patterns that match known attack signatures or anomalies that could indicate malicious behavior. Unlike a Host Intrusion Detection System (HIDS), which focuses on individual host devices, NIDS provides a broader view by monitoring network traffic across multiple systems and devices.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "What is an Intrusion Detection System?",
"url": "https://www.paloaltonetworks.com/cyberpedia/what-is-an-intrusion-detection-system-ids",
"type": "article"
},
{
"title": "What is a Network Intrusion Detection system (NIDS)?",
"url": "https://bunny.net/academy/security/what-is-network-intrusion-detection-nids/",
"type": "article"
}
]
},
"7w9qj16OD4pUzq-ItdxeK": {
"title": "NIPS",
@ -1785,7 +1818,7 @@
},
"MBnDE0VyVh2u2p-r90jVk": {
"title": "WPA vs WPA2 vs WPA3 vs WEP",
"description": "",
"description": "WEP (Wired Equivalent Privacy): WEP is the oldest and least secure of the protocols listed. It uses a static 64-bit or 128-bit key for encryption, which is vulnerable to various attacks due to weak encryption and poor key management. It's considered obsolete and should not be used.\n\nWPA (Wi-Fi Protected Access): WPA improved upon WEP by introducing TKIP (Temporal Key Integrity Protocol), which dynamically changes encryption keys and provides better security. However, it still has vulnerabilities and is considered less secure compared to WPA2 and WPA3.\n\nWPA2 (Wi-Fi Protected Access 2): WPA2 introduced AES (Advanced Encryption Standard) for stronger encryption, replacing TKIP. It provides improved security compared to WPA by using more robust encryption and authentication methods. It is generally considered secure but has some known vulnerabilities, especially in implementation.\n\nWPA3 (Wi-Fi Protected Access 3): WPA3 is the most current standard and offers enhanced security features. It uses SAE (Simultaneous Authentication of Equals) for more secure password-based authentication and improved encryption. WPA3 provides stronger protection against brute-force attacks and ensures better security for both personal and enterprise networks. It also includes forward secrecy, which helps protect past communications from future compromises.\n\nVisit the following resources to learn more:\n\n* \\[@article@wep-vs-wpa-vs-wpa2-vs-wpa3\\][https://community.fs.com/article/wep-vs-wpa-vs-wpa2-vs-wpa3.html](https://community.fs.com/article/wep-vs-wpa-vs-wpa2-vs-wpa3.html)\n* \\[@article@Wifi Protected Access (WPA)\\][https://www.geeksforgeeks.org/wifi-protected-access-wpa/](https://www.geeksforgeeks.org/wifi-protected-access-wpa/)",
"links": []
},
"w6V4JOtXKCMPAkKIQxvMg": {
@ -1861,8 +1894,14 @@
},
"lMiW2q-b72KUl-2S7M6Vb": {
"title": "urlscan",
"description": "",
"links": []
"description": "**[urlscan.io](http://urlscan.io)** is a free service to scan and analyze websites. When a URL is submitted to [urlscan.io](http://urlscan.io), an automated process will browse to the URL like a regular user and record the activity that this page navigation creates. This includes the domains and IPs contacted, the resources (JavaScript, CSS, etc) requested from those domains, as well as additional information about the page itself. [urlscan.io](http://urlscan.io) will take a screenshot of the page, record the DOM content, JavaScript global variables, cookies created by the page, and a myriad of other observations. If the site is targeting the users one of the more than 900 brands tracked by [urlscan.io](http://urlscan.io), it will be highlighted as potentially malicious in the scan results.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "urlscan.io",
"url": "https://urlscan.io/",
"type": "article"
}
]
},
"-RnlvUltJ9IDtH0HEnMbN": {
"title": "WHOIS",
@ -2143,7 +2182,7 @@
},
"nOND14t7ISgSH3zNpV3F8": {
"title": "Memory Leak",
"description": "",
"description": "A Memory Leak occurs when a computer program consumes memory but fails to release it back to the operating system after it is no longer needed. Over time, this can lead to reduced system performance, increased memory usage, and, in severe cases, the program or system may crash due to the exhaustion of available memory.",
"links": []
},
"2jo1r9O_rCnDwRv1_4Wo-": {
@ -2196,8 +2235,19 @@
},
"sMuKqf27y4iG0GrCdF5DN": {
"title": "Pass the Hash",
"description": "",
"links": []
"description": "Pass the Hash (PtH) is a hacking technique that allows an attacker to authenticate to a remote server or service using the hashed value of a user's password, without needing to know the actual plaintext password. This method exploits weaknesses in the way some authentication protocols handle hashed credentials, particularly in Windows-based systems.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "What is a pass-the-hash attack?",
"url": "https://www.crowdstrike.com/cybersecurity-101/pass-the-hash/",
"type": "article"
},
{
"title": "Pass the Hash Attack",
"url": "https://www.netwrix.com/pass_the_hash_attack_explained.html",
"type": "article"
}
]
},
"L0ROYh2DNlkybNDO2ezJY": {
"title": "Directory Traversal",

@ -11,8 +11,29 @@
},
"Lsapbmg-eMIYJAHpV97nO": {
"title": "Types of Data Analytics",
"description": "Data Analytics has proven to be a critical part of decision-making in modern business ventures. It is responsible for discovering, interpreting, and transforming data into valuable information. Different types of data analytics look at past, present, or predictive views of business operations.\n\nData Analysts, as ambassadors of this domain, employ these types, which are namely Descriptive Analytics, Diagnostic Analytics, Predictive Analytics and Prescriptive Analytics, to answer various questions — What happened? Why did it happen? What could happen? And what should we do next? Understanding these types gives data analysts the power to transform raw datasets into strategic insights.",
"links": []
"description": "Data Analytics has proven to be a critical part of decision-making in modern business ventures. It is responsible for discovering, interpreting, and transforming data into valuable information. Different types of data analytics look at past, present, or predictive views of business operations.\n\nData Analysts, as ambassadors of this domain, employ these types, to answer various questions:\n\n* Descriptive Analytics _(what happened in the past?)_\n* Diagnostic Analytics _(why did it happened in the past?)_\n* Predictive Analytics _(what will happen in the future?)_\n* Prescriptive Analytics _(how can we make it happen?)_\n\nUnderstanding these types gives data analysts the power to transform raw datasets into strategic insights.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Data Analytics and its type",
"url": "https://www.geeksforgeeks.org/data-analytics-and-its-type/",
"type": "article"
},
{
"title": "The 4 Types of Data Analysis: Ultimate Guide",
"url": "https://careerfoundry.com/en/blog/data-analytics/different-types-of-data-analysis/",
"type": "article"
},
{
"title": "Descriptive vs Diagnostic vs Predictive vs Prescriptive Analytics: What's the Difference?",
"url": "https://www.youtube.com/watch?v=QoEpC7jUb9k",
"type": "video"
},
{
"title": "Types of Data Analytics",
"url": "https://www.youtube.com/watch?v=lsZnSgxMwBA",
"type": "video"
}
]
},
"hWDh0ooidbqZb000ENVok": {
"title": "Descriptive Analytics",
@ -136,12 +157,12 @@
"description": "The visualization of data is an essential skill in the toolkit of every data analyst. This practice is about transforming complex raw data into a graphical format that allows for an easier understanding of large data sets, trends, outliers, and important patterns. Whether pie charts, line graphs, bar graphs, or heat maps, data visualization techniques not only streamline data analysis, but also facilitate a more effective communication of the findings to others. This key concept underscores the importance of presenting data in a digestible and visually appealing manner to drive data-informed decision making in an organization.\n\nLearn more from the following resources:",
"links": [
{
"title": "Data visualisation beginner's guide",
"title": "Data visualization beginner's guide",
"url": "https://www.tableau.com/en-gb/learn/articles/data-visualization",
"type": "article"
},
{
"title": "Data Visualisation in 2024",
"title": "Data Visualization in 2024",
"url": "https://www.youtube.com/watch?v=loYuxWSsLNc",
"type": "video"
}

File diff suppressed because one or more lines are too long

@ -235,36 +235,11 @@
"title": "HTML",
"description": "HTML stands for HyperText Markup Language. It is used on the frontend and gives the structure to the webpage which you can style using CSS and make interactive using JavaScript.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Interactive HTML Course",
"url": "https://github.com/denysdovhan/learnyouhtml",
"type": "opensource"
},
{
"title": "W3Schools: Learn HTML",
"url": "https://www.w3schools.com/html/html_intro.asp",
"type": "article"
},
{
"title": "htmlreference.io: All HTML elements at a glance",
"url": "https://htmlreference.io/",
"type": "article"
},
{
"title": "HTML For Beginners The Easy Way",
"url": "https://html.com",
"type": "article"
},
{
"title": "Web Development Basics",
"url": "https://internetingishard.netlify.app/html-and-css/index.html",
"type": "article"
},
{
"title": "You don't need JavaScript for that",
"url": "https://www.htmhell.dev/adventcalendar/2023/2/",
"type": "article"
},
{
"title": "Explore top posts about HTML",
"url": "https://app.daily.dev/tags/html?ref=roadmapsh",
@ -279,11 +254,6 @@
"title": "HTML Full Course - Build a Website Tutorial",
"url": "https://www.youtube.com/watch?v=pQN-pnXPaVg",
"type": "video"
},
{
"title": "HTML Tutorial for Beginners: HTML Crash Course",
"url": "https://www.youtube.com/watch?v=qz0aGYrrlhU",
"type": "video"
}
]
},
@ -296,30 +266,15 @@
"url": "https://www.w3schools.com/html/html_intro.asp",
"type": "article"
},
{
"title": "MDN Docs: Getting Started with HTML ",
"url": "https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started",
"type": "article"
},
{
"title": "web.dev: Learn HTML",
"url": "https://web.dev/learn/html",
"type": "article"
},
{
"title": "HTML Cheatsheet",
"url": "https://htmlcheatsheet.com",
"type": "article"
},
{
"title": "HTML Full Course - Build a Website Tutorial",
"url": "https://www.youtube.com/watch?v=pQN-pnXPaVg",
"type": "video"
},
{
"title": "HTML Tutorial for Beginners: HTML Crash Course",
"url": "https://www.youtube.com/watch?v=qz0aGYrrlhU",
"type": "video"
}
]
},
@ -337,16 +292,6 @@
"url": "https://www.w3schools.com/html/html5_semantic_elements.asp",
"type": "article"
},
{
"title": "How To Write Semantic HTML",
"url": "https://hackernoon.com/how-to-write-semantic-html-dkq3ulo",
"type": "article"
},
{
"title": "Semantic HTML: What It Is and How It Improves Your Site",
"url": "https://blog.hubspot.com/website/semantic-html",
"type": "article"
},
{
"title": "Semantic Markup",
"url": "https://html.com/semantic-markup",
@ -356,11 +301,6 @@
"title": "Semantic HTML - web.dev",
"url": "https://web.dev/learn/html/semantic-html/",
"type": "article"
},
{
"title": "Explore top posts about HTML",
"url": "https://app.daily.dev/tags/html?ref=roadmapsh",
"type": "article"
}
]
},
@ -399,31 +339,11 @@
"url": "https://www.w3schools.com/accessibility/index.php",
"type": "article"
},
{
"title": "A Complete Guide To Accessible Front-End Components",
"url": "https://www.smashingmagazine.com/2021/03/complete-guide-accessible-front-end-components/",
"type": "article"
},
{
"title": "MDN Accessibility",
"url": "https://developer.mozilla.org/en-US/docs/Web/Accessibility",
"type": "article"
},
{
"title": "Accessibility for Developers by Google",
"url": "https://web.dev/accessibility",
"type": "article"
},
{
"title": "Web Accessibility by Udacity",
"url": "https://www.udacity.com/course/web-accessibility--ud891",
"type": "article"
},
{
"title": "Accessibility as an Essential Part of the Inclusive Developer Experience",
"url": "https://thenewstack.io/accessibility-as-an-essential-part-of-the-inclusive-developer-experience/",
"type": "article"
},
{
"title": "Explore top posts about Accessibility",
"url": "https://app.daily.dev/tags/accessibility?ref=roadmapsh",
@ -440,31 +360,11 @@
"title": "SEO Basics",
"description": "SEO or Search Engine Optimization is the technique used to optimize your website for better rankings on search engines such as Google, Bing etc.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "SEO Guide",
"url": "https://github.com/seo/guide",
"type": "opensource"
},
{
"title": "Google Search Central — SEO Docs",
"url": "https://developers.google.com/search/docs",
"type": "article"
},
{
"title": "8 Must-Know SEO Best Practices For Developers",
"url": "https://neilpatel.com/blog/seo-developers/",
"type": "article"
},
{
"title": "SEO for Developers",
"url": "https://medium.com/welldone-software/seo-for-developers-a-quick-overview-5b5b7ce34679",
"type": "article"
},
{
"title": "Learning SEO",
"url": "https://learningseo.io/",
"type": "article"
},
{
"title": "Explore top posts about SEO",
"url": "https://app.daily.dev/tags/seo?ref=roadmapsh",
@ -486,46 +386,16 @@
"title": "CSS",
"description": "CSS or Cascading Style Sheets is the language used to style the frontend of any website. CSS is a cornerstone technology of the World Wide Web, alongside HTML and JavaScript.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "The Odin Project",
"url": "https://www.theodinproject.com//",
"type": "article"
},
{
"title": "What The Flexbox!",
"url": "https://flexbox.io/",
"type": "article"
},
{
"title": "W3Schools — Learn CSS",
"url": "https://www.w3schools.com/css/",
"type": "article"
},
{
"title": "cssreference.io: All CSS properties at a glance",
"url": "https://cssreference.io/",
"type": "article"
},
{
"title": "Web.dev by Google — Learn CSS",
"url": "https://web.dev/learn/css/",
"type": "article"
},
{
"title": "Learn to Code HTML & CSS",
"url": "https://learn.shayhowe.com/html-css/building-your-first-web-page/",
"type": "article"
},
{
"title": "Joshw Comeaus CSS Hack Blog Posts",
"url": "https://www.joshwcomeau.com/",
"type": "article"
},
{
"title": "100 Days CSS Challenge",
"url": "https://100dayscss.com",
"type": "article"
},
{
"title": "Explore top posts about CSS",
"url": "https://app.daily.dev/tags/css?ref=roadmapsh",
@ -536,20 +406,10 @@
"url": "https://youtu.be/n4R2E7O-Ngo",
"type": "video"
},
{
"title": "CSS Crash Course For Absolute Beginners",
"url": "https://www.youtube.com/watch?v=yfoY53QXEnI",
"type": "video"
},
{
"title": "HTML and CSS Tutorial",
"url": "https://www.youtube.com/watch?v=D-h8L5hgW-w",
"type": "video"
},
{
"title": "CSS Masterclass - Tutorial & Course for Beginners",
"url": "https://www.youtube.com/watch?v=FqmB-Zj2-PA",
"type": "video"
}
]
},
@ -680,41 +540,16 @@
"title": "JavaScript",
"description": "JavaScript allows you to add interactivity to your pages. Common examples that you may have seen on the websites are sliders, click interactions, popups and so on.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "You Dont Know JS Yet (book series) ",
"url": "https://github.com/getify/You-Dont-Know-JS",
"type": "opensource"
},
{
"title": "Learn the basics of JavaScript",
"url": "https://github.com/workshopper/javascripting",
"type": "opensource"
},
{
"title": "Visit Dedicated JavaScript Roadmap",
"url": "/javascript",
"type": "article"
},
{
"title": "W3Schools – JavaScript Tutorial",
"url": "https://www.w3schools.com/js/",
"type": "article"
},
{
"title": "The Modern JavaScript Tutorial",
"url": "https://javascript.info/",
"type": "article"
},
{
"title": "Learn JavaScript: Covered many topics",
"url": "https://www.javascripttutorial.net/",
"type": "article"
},
{
"title": "Eloquent JavaScript textbook",
"url": "https://eloquentjavascript.net/",
"type": "article"
},
{
"title": "Build 30 Javascript projects in 30 days",
"url": "https://javascript30.com/",
@ -729,11 +564,6 @@
"title": "JavaScript Crash Course for Beginners",
"url": "https://youtu.be/hdI2bqOjy3c?t=2",
"type": "video"
},
{
"title": "Build a Netflix Landing Page Clone with HTML, CSS & JS",
"url": "https://youtu.be/P7t13SGytRk?t=22",
"type": "video"
}
]
},
@ -2086,36 +1916,11 @@
"url": "https://www.typescriptlang.org/",
"type": "article"
},
{
"title": "Official Docs for Deep Dives",
"url": "https://www.typescriptlang.org/docs/",
"type": "article"
},
{
"title": "The TypeScript Handbook",
"url": "https://www.typescriptlang.org/docs/handbook/intro.html",
"type": "article"
},
{
"title": "TypeScript Tutorial",
"url": "https://www.tutorialspoint.com/typescript/index.htm",
"type": "article"
},
{
"title": "What Is TypeScript?",
"url": "https://thenewstack.io/what-is-typescript/",
"type": "article"
},
{
"title": "TypeScript Tutorial: Go beyond ‘Hello, World!’",
"url": "https://thenewstack.io/typescript-tutorial-go-beyond-hello-world/",
"type": "article"
},
{
"title": "A Guide to Using the Programming Language",
"url": "https://thenewstack.io/typescript-tutorial-a-guide-to-using-the-programming-language/",
"type": "article"
},
{
"title": "Explore top posts about TypeScript",
"url": "https://app.daily.dev/tags/typescript?ref=roadmapsh",
@ -2665,6 +2470,11 @@
"url": "https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/",
"type": "article"
},
{
"title": "Building a simple offline-capable Notepad app ",
"url": "https://www.amitmerchant.com/Building-Simple-Offline-Notepad-Using-Service-Worker/",
"type": "article"
},
{
"title": "Explore top posts about Web Development",
"url": "https://app.daily.dev/tags/webdev?ref=roadmapsh",

@ -3,11 +3,6 @@
"title": "HTML",
"description": "HTML stands for HyperText Markup Language. It is used on the frontend and gives the structure to the webpage which you can style using CSS and make interactive using JavaScript.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Interactive HTML Course",
"url": "https://github.com/denysdovhan/learnyouhtml",
"type": "opensource"
},
{
"title": "W3Schools: Learn HTML",
"url": "https://www.w3schools.com/html/html_intro.asp",
@ -19,18 +14,13 @@
"type": "article"
},
{
"title": "HTML Full Course - Build a Website Tutorial",
"url": "https://www.youtube.com/watch?v=pQN-pnXPaVg",
"type": "video"
},
{
"title": "HTML Tutorial for Beginners: HTML Crash Course",
"url": "https://www.youtube.com/watch?v=qz0aGYrrlhU",
"title": "HTML Full Course for Beginners",
"url": "https://youtu.be/mJgBOIoGihA",
"type": "video"
},
{
"title": "HTML and CSS Full Course - Beginner To Pro",
"url": "https://youtu.be/a_iQb1lnAEQ",
"title": "HTML Full Course - Build a Website Tutorial",
"url": "https://www.youtube.com/watch?v=pQN-pnXPaVg",
"type": "video"
}
]
@ -45,13 +35,8 @@
"type": "article"
},
{
"title": "Learn to Code HTML & CSS",
"url": "https://learn.shayhowe.com/html-css/building-your-first-web-page/",
"type": "article"
},
{
"title": "What The Flexbox!",
"url": "https://flexbox.io/",
"title": "Web.dev by Google — Learn CSS",
"url": "https://web.dev/learn/css/",
"type": "article"
},
{
@ -60,29 +45,24 @@
"type": "article"
},
{
"title": "CSS Crash Course For Absolute Beginners",
"url": "https://www.youtube.com/watch?v=yfoY53QXEnI",
"title": "CSS Complete Course",
"url": "https://youtu.be/n4R2E7O-Ngo",
"type": "video"
},
{
"title": "HTML and CSS Tutorial",
"url": "https://www.youtube.com/watch?v=D-h8L5hgW-w",
"type": "video"
},
{
"title": "CSS Masterclass - Tutorial & Course for Beginners",
"url": "https://www.youtube.com/watch?v=FqmB-Zj2-PA",
"type": "video"
}
]
},
"T9PB6WQf-Fa9NXKKvVOy_": {
"title": "JavaScript",
"description": "JavaScript allows you to add interactivity to your pages. Common examples that you may have seen on the websites are sliders, click interactions, popups and so on.\n\nVisit the following resources to learn more:\n\nWe also have this [JavaScript roadmap](/javascript). You don't need to follow it right now, just learn from some courses and revisit the roadmap later in your journey.",
"description": "JavaScript allows you to add interactivity to your pages. Common examples that you may have seen on the websites are sliders, click interactions, popups and so on.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "W3Schools – JavaScript Tutorial",
"url": "https://www.w3schools.com/js/",
"title": "Visit Dedicated JavaScript Roadmap",
"url": "/javascript",
"type": "article"
},
{
@ -91,8 +71,8 @@
"type": "article"
},
{
"title": "Exploring JS: JavaScript books for programmers",
"url": "https://exploringjs.com/",
"title": "Build 30 Javascript projects in 30 days",
"url": "https://javascript30.com/",
"type": "article"
},
{
@ -104,11 +84,6 @@
"title": "JavaScript Crash Course for Beginners",
"url": "https://youtu.be/hdI2bqOjy3c?t=2",
"type": "video"
},
{
"title": "Build a Netflix Landing Page Clone with HTML, CSS & JS",
"url": "https://youtu.be/P7t13SGytRk",
"type": "video"
}
]
},

@ -429,6 +429,11 @@
"title": "String",
"url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String",
"type": "article"
},
{
"title": "JavaScript Strings",
"url": "https://javascript.info/string",
"type": "article"
}
]
},
@ -1831,11 +1836,16 @@
},
"dbercnxXVTJXMpYSDNGb2": {
"title": "bind",
"description": "The `bind()` method creates a new function with a given `this` value and arguments provided as an array. The original function is not called immediately but can be called later with the `new` keyword or as a normal function call.\n\nVisit the following resources to learn more:",
"description": "The `bind()` method in JavaScript allows you to create a new function with a specific context and optionally preset arguments. Unlike `call()` or `apply()`, `bind()` does not immediately invoke the function. Instead, it returns a new function that can be called later, either as a regular function or with additional arguments. This is particularly useful when you want to ensure that a function retains a specific context, regardless of how or when it's invoked.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "Understanding Explicit Binding in JavaScript: Call, Bind, and Apply Methods",
"url": "https://medium.com/@amitsharma_24072/understanding-explicit-binding-in-javascript-call-bind-and-apply-methods-7b6ed0107628",
"title": "bind()",
"url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind",
"type": "article"
},
{
"title": "Function binding",
"url": "https://javascript.info/bind",
"type": "article"
},
{

@ -2,7 +2,13 @@
"lDIy56RyC1XM7IfORsSLD": {
"title": "Introduction",
"description": "PostgreSQL is a powerful, open-source Object-Relational Database Management System (ORDBMS) that is known for its robustness, extensibility, and SQL compliance. It was initially developed at the University of California, Berkeley, in the 1980s and has since become one of the most popular open-source databases in the world.",
"links": []
"links": [
{
"title": "History of POSTGRES to PostgreSQL",
"url": "https://www.postgresql.org/docs/current/history.html",
"type": "article"
}
]
},
"soar-NBWCr4xVKj7ttfnc": {
"title": "What are Relational Databases?",
@ -98,11 +104,6 @@
"title": "Data Types",
"description": "PostgreSQL offers a rich and diverse set of data types, catering to a wide range of applications and ensuring data integrity and performance. These include standard numeric types such as integers, floating-point numbers, and serial types for auto-incrementing fields. Character types like VARCHAR and TEXT handle varying lengths of text, while DATE, TIME, and TIMESTAMP support a variety of temporal data requirements. PostgreSQL also supports a comprehensive set of Boolean, enumerated (ENUM), and composite types, enabling more complex data structures. Additionally, it excels with its support for JSON and JSONB data types, allowing for efficient storage and querying of semi-structured data. The inclusion of array types, geometric data types, and the PostGIS extension for geographic data further extends PostgreSQL's versatility, making it a powerful tool for a broad spectrum of data management needs.\n\nLearn more from the following resources:",
"links": [
{
"title": "",
"url": "https://www.instaclustr.com/blog/postgresql-data-types-mappings-to-sql-jdbc-and-java-data-types/",
"type": "article"
},
{
"title": "Data Types",
"url": "https://www.postgresql.org/docs/current/datatype.html",
@ -112,6 +113,11 @@
"title": "An introduction to PostgreSQL data types",
"url": "https://www.prisma.io/dataguide/postgresql/introduction-to-data-types",
"type": "article"
},
{
"title": "PostgreSQL® Data Types: Mappings to SQL, JDBC, and Java Data Types",
"url": "https://www.instaclustr.com/blog/postgresql-data-types-mappings-to-sql-jdbc-and-java-data-types/",
"type": "article"
}
]
},
@ -306,7 +312,7 @@
"description": "Multi-Version Concurrency Control (MVCC) is a technique used by PostgreSQL to allow multiple transactions to access the same data concurrently without conflicts or delays. It ensures that each transaction has a consistent snapshot of the database and can operate on its own version of the data.\n\nLearn more from the following resources:",
"links": [
{
"title": "",
"title": "Multiversion concurrency control - Wikipedia",
"url": "https://en.wikipedia.org/wiki/Multiversion_concurrency_control",
"type": "article"
},

@ -227,6 +227,16 @@
"title": "Loops in Python",
"url": "https://www.geeksforgeeks.org/loops-in-python/",
"type": "article"
},
{
"title": "Python \"while\" Loops (Indefinite Iteration)",
"url": "https://realpython.com/python-while-loop/",
"type": "article"
},
{
"title": "Python \"for\" Loops (Definite Iteration)",
"url": "https://realpython.com/python-for-loop/#the-guts-of-the-python-for-loop",
"type": "article"
}
]
},

@ -586,7 +586,7 @@
},
"w3bNp7OkehI1gjx8NzlC8": {
"title": "useMemo",
"description": "`useMemo` is a React hook that memorizes the result of a function. It is used to optimize performance by caching the result of a function and returning the cached result when the inputs to the function have not changed.\n\nLearn more from the following resources:",
"description": "`useMemo` is a React hook that memoizes the result of a function. It is used to optimize performance by caching the result of a function and returning the cached result when the inputs to the function have not changed.\n\nLearn more from the following resources:",
"links": [
{
"title": "useMemo Docs",
@ -1618,21 +1618,26 @@
},
"ElgRwv5LSVg5FXGx-2K2s": {
"title": "TypeScript",
"description": "TypeScript is a free and open-source high-level programming language developed by Microsoft that adds static typing with optional type annotations to JavaScript. It is designed for the development of large applications and transpiles to JavaScript. Because TypeScript is a superset of JavaScript, all JavaScript programs are syntactically valid TypeScript, but they can fail to type-check for safety reasons.\n\nTypeScript supports definition files that can contain type information of existing JavaScript libraries, much like C++ header files can describe the structure of existing object files. This enables other programs to use the values defined in the files as if they were statically typed TypeScript entities. There are third-party header files for popular libraries such as jQuery, MongoDB, and D3.js. TypeScript headers for the Node.js library modules are also available, allowing development of Node.js programs within TypeScript.\n\nVisit the following resources to learn more:",
"description": "TypeScript is a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "TypeScript Website",
"url": "https://typescriptlang.org/",
"title": "Official Website",
"url": "https://www.typescriptlang.org/",
"type": "article"
},
{
"title": "The TypeScript Handbook",
"url": "https://www.typescriptlang.org/docs/handbook/intro.html",
"type": "article"
},
{
"title": "TypeScript Docs",
"url": "https://typescriptlang.org/docs",
"title": "Explore top posts about TypeScript",
"url": "https://app.daily.dev/tags/typescript?ref=roadmapsh",
"type": "article"
},
{
"title": "Learn Typescript Basics in 12 Minutes",
"url": "https://www.youtube.com/watch?v=ahCwqrYpIuM&pp=ygULdHlwZXNjcnJpcHQ%3D",
"title": "TypeScript for Beginners",
"url": "https://www.youtube.com/watch?v=BwuLxPH8IDs",
"type": "video"
}
]

@ -1437,8 +1437,29 @@
},
"PKqwKvoffm0unwcFwpojk": {
"title": "Scrum",
"description": "",
"links": []
"description": "`Scrum` is a popular agile framework used for project management, particularly in software development. It emphasizes iterative development, collaboration, and flexibility to deliver high-quality products.\n\nKey elements of Scrum:\n\n* **Sprints**: Time-boxed iterations (usually 2-4 weeks) where teams work on specific goals.\n* **Product Backlog**: Prioritized list of features or requirements for the product.\n* **Sprint Backlog**: Selected items from the Product Backlog to be completed during a Sprint.\n* **Daily Scrum (Stand-up)**: Brief daily meeting where team members share progress, challenges, and plans for the day.\n* **Sprint Review**: Meeting at the end of a Sprint to demonstrate completed work and gather feedback.\n* **Sprint Retrospective**: Meeting to reflect on the Sprint, identify improvements, and adjust processes for the next Sprint.\n\nVisit the following resources to learn more:",
"links": [
{
"title": "What is scrum and how to get started",
"url": "https://www.atlassian.com/agile/scrum.",
"type": "article"
},
{
"title": "Scrum Methodology: The Complete Guide & Best Practices",
"url": "https://thedigitalprojectmanager.com/projects/pm-methodology/scrum-methodology-complete-guide/",
"type": "article"
},
{
"title": "Essential Topics for the Scrum Product Owner",
"url": "https://www.scrum.org/resources/blog/essential-topics-scrum-product-owner",
"type": "article"
},
{
"title": "Scrum • Topics - Thriving Technologist",
"url": "https://thrivingtechnologist.com/topics/scrum/",
"type": "article"
}
]
},
"7fL9lSu4BD1wRjnZy9tM9": {
"title": "XP",
@ -1479,8 +1500,24 @@
},
"UCCT7-E_QUKPg3jAsjobx": {
"title": "TCP/IP Model",
"description": "",
"links": []
"description": "The `TCP/IP model` defines how devices should transmit data between them and enables communication over networks and large distances. The model represents how data is exchanged and organized over networks. It is split into four layers, which set the standards for data exchange and represent how data is handled and packaged when being delivered between applications, devices, and servers.\n\n* **Network Access Layer**: The network access layer is a group of applications requiring network communications. This layer is responsible for generating the data and requesting connections.\n \n* **Internet Layer**: The internet layer is responsible for sending packets from a network and controlling their movement across a network to ensure they reach their destination.\n \n* **Transport Layer**: The transport layer is responsible for providing a solid and reliable data connection between the original application or device and its intended destination.\n \n* **Application Layer**: The application layer refers to programs that need TCP/IP to help them communicate with each other.\n \n\nVisit the following resources to learn more:",
"links": [
{
"title": "What is Transmission Control Protocol TCP/IP? - Fortinet",
"url": "https://www.fortinet.com/resources/cyberglossary/tcp-ip#:~:text=The%20TCP%2FIP%20model%20defines,exchanged%20and%20organized%20over%20networks.",
"type": "article"
},
{
"title": "TCP/IP Model",
"url": "https://www.geeksforgeeks.org/tcp-ip-model/",
"type": "article"
},
{
"title": "What is TCP/IP and How Does it Work?",
"url": "https://www.techtarget.com/searchnetworking/definition/TCP-IP",
"type": "article"
}
]
},
"Nq6o6Ty8VyNRsvg-UWp7D": {
"title": "HTTP, HTTPS",

File diff suppressed because it is too large Load Diff

@ -352,7 +352,7 @@
"description": "The lifecycle meta-argument in Terraform customizes the behavior of resources during creation, update, and deletion. It includes settings such as create\\_before\\_destroy, which ensures a new resource is created before the old one is destroyed, preventing downtime. prevent\\_destroy protects resources from accidental deletion, and ignore\\_changes specifies attributes to ignore during updates, allowing external modifications without triggering Terraform changes. These options provide fine-grained control over resource management, ensuring that the desired state of infrastructure is maintained with minimal disruption and precise handling of resource lifecycles.\n\nLearn more from the following resources:",
"links": [
{
"title": "Terraform Docs - for_each",
"title": "Terraform Docs - lifecycle",
"url": "https://developer.hashicorp.com/terraform/language/meta-arguments/lifecycle",
"type": "article"
},

@ -9,7 +9,7 @@
"type": "article"
},
{
"title": "TypeScript Handbook",
"title": "TypeScript Official Handbook",
"url": "https://www.typescriptlang.org/docs/handbook/typescript-from-scratch.html",
"type": "article"
},
@ -163,7 +163,7 @@
"description": "The TypeScript Playground is a great tool to learn TypeScript. It allows you to write TypeScript code and see the JavaScript output. It also allows you to share your code with others.\n\nLearn more from the following links:",
"links": [
{
"title": "TypeScript - Playground",
"title": "TypeScript Official - Playground",
"url": "https://www.typescriptlang.org/play",
"type": "article"
},
@ -349,7 +349,7 @@
"description": "The `never` type represents the type of values that never occur. For instance, `never` is the return type for a function expression or an arrow function expression that always throws an exception or one that never returns. Variables also acquire the type never when narrowed by any type guards that can never be `true`.\n\nThe never type is a subtype of, and assignable to, every type; however, no type is a subtype of, or assignable to, `never` (except `never` itself). Even any isn’t assignable to `never`.\n\nExamples of functions returning never:\n\n // Function returning never must not have a reachable end point\n function error(message: string): never {\n throw new Error(message);\n }\n \n // Inferred return type is never\n function fail() {\n return error('Something failed');\n }\n \n // Function returning never must not have a reachable end point\n function infiniteLoop(): never {\n while (true) {}\n }\n \n\nLearn more from the following links:",
"links": [
{
"title": "Never",
"title": "Never Type",
"url": "https://www.typescriptlang.org/docs/handbook/2/narrowing.html#the-never-type",
"type": "article"
}
@ -379,8 +379,14 @@
},
"afTNr36VqeXoJpHxm2IoS": {
"title": "as any",
"description": "`any` is a special type in TypeScript that represents a value of any type. When a value is declared with the any type, the compiler will not perform any type checks or type inference on that value.\n\nFor example:\n\n let anyValue: any = 42;\n \n // we can assign any value to anyValue, regardless of its type\n anyValue = 'Hello, world!';\n anyValue = true;",
"links": []
"description": "`any` is a special type in TypeScript that represents a value of any type. When a value is declared with the any type, the compiler will not perform any type checks or type inference on that value.\n\nFor example:\n\n let anyValue: any = 42;\n \n // we can assign any value to anyValue, regardless of its type\n anyValue = 'Hello, world!';\n anyValue = true;\n \n\nLearn more from the following links:",
"links": [
{
"title": "Arrays",
"url": "https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#any",
"type": "article"
}
]
},
"mjaL5ocLnM8VQlhUxW6KU": {
"title": "Non-null Assertion",
@ -398,7 +404,7 @@
"description": "TypeScript developers are often faced with a dilemma: we want to ensure that some expression matches some type, but also want to keep the most specific type of that expression for inference purposes.\n\nFor example:\n\n // Each property can be a string or an RGB tuple.\n const palette = {\n red: [255, 0, 0],\n green: '#00ff00',\n bleu: [0, 0, 255],\n // ^^^^ sacrebleu - we've made a typo!\n };\n \n // We want to be able to use array methods on 'red'...\n const redComponent = palette.red.at(0);\n \n // or string methods on 'green'...\n const greenNormalized = palette.green.toUpperCase();\n \n\nNotice that we’ve written `bleu`, whereas we probably should have written `blue`. We could try to catch that `bleu` typo by using a type annotation on palette, but we’d lose the information about each property.\n\n type Colors = 'red' | 'green' | 'blue';\n type RGB = [red: number, green: number, blue: number];\n \n const palette: Record<Colors, string | RGB> = {\n red: [255, 0, 0],\n green: '#00ff00',\n bleu: [0, 0, 255],\n // ~~~~ The typo is now correctly detected\n };\n // But we now have an undesirable error here - 'palette.red' \"could\" be a string.\n const redComponent = palette.red.at(0);\n \n\nThe `satisfies` operator lets us validate that the type of an expression matches some type, without changing the resulting type of that expression. As an example, we could use `satisfies` to validate that all the properties of palette are compatible with `string | number[]`:\n\n type Colors = 'red' | 'green' | 'blue';\n type RGB = [red: number, green: number, blue: number];\n \n const palette = {\n red: [255, 0, 0],\n green: '#00ff00',\n bleu: [0, 0, 255],\n // ~~~~ The typo is now caught!\n } satisfies Record<Colors, string | RGB>;\n \n // Both of these methods are still accessible!\n const redComponent = palette.red.at(0);\n const greenNormalized = palette.green.toUpperCase();\n \n\nLearn more from the following resources:",
"links": [
{
"title": "Satisfies Keyword",
"title": "satisfies Keyword",
"url": "https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html#the-satisfies-operator",
"type": "article"
}
@ -428,7 +434,7 @@
},
"qefnsugcveizVq2TORRgn": {
"title": "Combining Types",
"description": "In TypeScript, you can combine types using type union and type intersection.\n\n### Type Union:\n\nThe union operator `|` is used to combine two or more types into a single type that represents all the possible types. For example:\n\n type stringOrNumber = string | number;\n let value: stringOrNumber = 'hello';\n \n value = 42;\n \n\n### Type Intersection:\n\nThe intersection operator `&` is used to intersect two or more types into a single type that represents the properties of all the types. For example:\n\n interface A {\n a: string;\n }\n \n interface B {\n b: number;\n }\n \n type AB = A & B;\n let value: AB = { a: 'hello', b: 42 };\n \n\nLearn more from the following links:",
"description": "In TypeScript, you can combine types using type union and type intersection.\n\nType Union\n----------\n\nThe union operator `|` is used to combine two or more types into a single type that represents all the possible types. For example:\n\n type stringOrNumber = string | number;\n let value: stringOrNumber = 'hello';\n \n value = 42;\n \n\nType Intersection\n-----------------\n\nThe intersection operator `&` is used to intersect two or more types into a single type that represents the properties of all the types. For example:\n\n interface A {\n a: string;\n }\n \n interface B {\n b: number;\n }\n \n type AB = A & B;\n let value: AB = { a: 'hello', b: 42 };\n \n\nLearn more from the following links:",
"links": [
{
"title": "Union Types in TypeScript",
@ -490,7 +496,7 @@
"description": "The `keyof` operator in TypeScript is used to get the union of keys from an object type. Here's an example of how it can be used:\n\n interface User {\n name: string;\n age: number;\n location: string;\n }\n \n type UserKeys = keyof User; // \"name\" | \"age\" | \"location\"\n const key: UserKeys = 'name';\n \n\nIn this example, `UserKeys` is a type that represents the union of keys from the `User` interface, which is `\"name\"` | `\"age\"` | `\"location\"`. And a constant named `key` with the type `UserKeys` is declared with the value `\"name\"`.\n\nLearn more from the following links:",
"links": [
{
"title": "Keyof Type Operator",
"title": "keyof Type Operator",
"url": "https://www.typescriptlang.org/docs/handbook/2/keyof-types.html#handbook-content",
"type": "article"
}
@ -646,8 +652,14 @@
},
"lvtTSHH9yBTCiLng8btnI": {
"title": "Hybrid Types",
"description": "In TypeScript, a hybrid type is a type that combines multiple types into a single type. The resulting type is considered a union of those types. This allows you to specify that a value can have multiple types, rather than just one.\n\nFor example, you can create a hybrid type that can accept either a string or a number:\n\n type StringOrNumber = string | number;\n \n\nYou can also use hybrid types to create more complex types that can represent a combination of several different types of values. For example:\n\n type Education = {\n degree: string;\n school: string;\n year: number;\n };\n \n type User = {\n name: string;\n age: number;\n email: string;\n education: Education;\n };",
"links": []
"description": "In TypeScript, a hybrid type is a type that combines multiple types into a single type. The resulting type is considered a union of those types. This allows you to specify that a value can have multiple types, rather than just one.\n\nFor example, you can create a hybrid type that can accept either a string or a number:\n\n type StringOrNumber = string | number;\n \n\nYou can also use hybrid types to create more complex types that can represent a combination of several different types of values. For example:\n\n type Education = {\n degree: string;\n school: string;\n year: number;\n };\n \n type User = {\n name: string;\n age: number;\n email: string;\n education: Education;\n };\n \n\nLearn more from the following links:",
"links": [
{
"title": "Geeksforgeeks.org - Hybrid Types",
"url": "https://www.geeksforgeeks.org/what-are-hybrid-types-in-typescript/#:~:text=Hybrid%20types%20are%20a%20combination,properties%20like%20a%20regular%20object.",
"type": "article"
}
]
},
"ib0jfZzukYOZ42AdJqt_W": {
"title": "Classes",
@ -708,6 +720,11 @@
"title": "Inheritance vs Polymorphism",
"description": "Inheritance and polymorphism are two fundamental concepts in object-oriented programming, and they are supported in TypeScript as well.\n\nInheritance refers to a mechanism where a subclass inherits properties and methods from its parent class. This allows a subclass to reuse the code and behavior of its parent class while also adding or modifying its own behavior. In TypeScript, inheritance is achieved using the extends keyword.\n\nPolymorphism refers to the ability of an object to take on many forms. This allows objects of different classes to be treated as objects of a common class, as long as they share a common interface or inheritance hierarchy. In TypeScript, polymorphism is achieved through method overriding and method overloading.\n\n class Animal {\n makeSound(): void {\n console.log('Making animal sound');\n }\n }\n \n class Dog extends Animal {\n makeSound(): void {\n console.log('Bark');\n }\n }\n \n class Cat extends Animal {\n makeSound(): void {\n console.log('Meow');\n }\n }\n \n let animal: Animal;\n \n animal = new Dog();\n animal.makeSound(); // Output: Bark\n \n animal = new Cat();\n animal.makeSound(); // Output: Meow\n \n\nLearn more from the following resources:",
"links": [
{
"title": "Dev.to - Mastering OOP in TypeScript",
"url": "https://dev.to/rajrathod/mastering-object-oriented-programming-with-typescript-encapsulation-abstraction-inheritance-and-polymorphism-explained-c6p",
"type": "article"
},
{
"title": "Inheritance and Polymorphism In TypeScript",
"url": "https://www.youtube.com/watch?v=Sn6K57YSuwU",
@ -793,7 +810,7 @@
},
"gBTem9Dp3IQLAkqGX4fOF": {
"title": "Partial",
"description": "The Partial type in TypeScript allows you to make all properties of a type optional. This is useful when you need to create an object with only a subset of the properties of an existing type.\n\nHere's an example of using the Partial type in TypeScript:\n\n interface User {\n name: string;\n age: number;\n email: string;\n }\n \n function createUser(user: Partial<User>): User {\n return {\n name: 'John Doe',\n age: 30,\n email: 'john.doe@example.com',\n ...user,\n };\n }\n \n const newUser = createUser({ name: 'Jane Doe' });\n \n console.log(newUser);\n // Output: { name: 'Jane Doe', age: 30, email: 'john.doe@example.com' }\n \n\nLearn more from the following links:\n\n@article@Partial",
"description": "The Partial type in TypeScript allows you to make all properties of a type optional. This is useful when you need to create an object with only a subset of the properties of an existing type.\n\nHere's an example of using the Partial type in TypeScript:\n\n interface User {\n name: string;\n age: number;\n email: string;\n }\n \n function createUser(user: Partial<User>): User {\n return {\n name: 'John Doe',\n age: 30,\n email: 'john.doe@example.com',\n ...user,\n };\n }\n \n const newUser = createUser({ name: 'Jane Doe' });\n \n console.log(newUser);\n // Output: { name: 'Jane Doe', age: 30, email: 'john.doe@example.com' }\n \n\nLearn more from the following links:\n\n@official@Partial",
"links": []
},
"E88tHQvARkHURZwGaO02l": {
@ -820,7 +837,7 @@
},
"IuO9-O_DQdDYuAbdGWdgb": {
"title": "Readonly",
"description": "Readonly constructs a type with all properties of Type set to readonly, meaning the properties of the constructed type cannot be reassigned.\n\n interface Todo {\n title: string;\n }\n \n const todo: Readonly<Todo> = {\n title: 'Delete inactive users',\n };\n \n // Cannot assign to 'title' because it is a read-only property.\n todo.title = 'Hello';\n \n\nLearn more from the following links:\n\n@article@Readonly",
"description": "Readonly constructs a type with all properties of Type set to readonly, meaning the properties of the constructed type cannot be reassigned.\n\n interface Todo {\n title: string;\n }\n \n const todo: Readonly<Todo> = {\n title: 'Delete inactive users',\n };\n \n // Cannot assign to 'title' because it is a read-only property.\n todo.title = 'Hello';\n \n\nLearn more from the following links:\n\n@official@Readonly",
"links": []
},
"DRdBmF5Dt_r09LoPOxOuq": {
@ -858,28 +875,40 @@
},
"_BAZlBEzE7ddr315OeHvl": {
"title": "NonNullable",
"description": "Non-Nullable constructs a type by excluding `null` and `undefined` from Type.\n\n type T0 = NonNullable<string | number | undefined>;\n // type T0 = string | number\n \n type T1 = NonNullable<string[] | null | undefined>;\n // type T1 = string[]\n \n\nLearn more from the following links:\n\n@article@NonNullable",
"description": "Non-Nullable constructs a type by excluding `null` and `undefined` from Type.\n\n type T0 = NonNullable<string | number | undefined>;\n // type T0 = string | number\n \n type T1 = NonNullable<string[] | null | undefined>;\n // type T1 = string[]\n \n\nLearn more from the following links:\n\n@official@NonNullable",
"links": []
},
"a7hl0iMZ-jcUACxqIYVqv": {
"title": "Parameters",
"description": "Parameters constructs a tuple type from the types used in the parameters of a function type Type.\n\n type T0 = Parameters<() => string>;\n // type T0 = []\n \n type T1 = Parameters<(s: string) => void>;\n // type T1 = [s: string]\n \n type T2 = Parameters<<T>(arg: T) => T>;\n // type T2 = [arg: unknown]\n \n declare function f1(arg: { a: number; b: string }): void;\n type T3 = Parameters<typeof f1>;\n // type T3 = [arg: {\n // a: number;\n // b: string;\n // }]\n \n type T4 = Parameters<any>;\n // type T4 = unknown[]\n \n type T5 = Parameters<never>;\n // type T5 = never\n \n type T6 = Parameters<string>;\n // ^ Type 'string' does not satisfy the constraint '(...args: any) => any'.\n \n type T7 = Parameters<Function>;\n // ^ Type 'Function' does not satisfy the constraint '(...args: any) => any'.\n \n\nLearn more from the following links:\n\n@article@Parameters",
"description": "Parameters constructs a tuple type from the types used in the parameters of a function type Type.\n\n type T0 = Parameters<() => string>;\n // type T0 = []\n \n type T1 = Parameters<(s: string) => void>;\n // type T1 = [s: string]\n \n type T2 = Parameters<<T>(arg: T) => T>;\n // type T2 = [arg: unknown]\n \n declare function f1(arg: { a: number; b: string }): void;\n type T3 = Parameters<typeof f1>;\n // type T3 = [arg: {\n // a: number;\n // b: string;\n // }]\n \n type T4 = Parameters<any>;\n // type T4 = unknown[]\n \n type T5 = Parameters<never>;\n // type T5 = never\n \n type T6 = Parameters<string>;\n // ^ Type 'string' does not satisfy the constraint '(...args: any) => any'.\n \n type T7 = Parameters<Function>;\n // ^ Type 'Function' does not satisfy the constraint '(...args: any) => any'.\n \n\nLearn more from the following links:\n\n@official@Parameters",
"links": []
},
"On75JR_UkiIlha0_qaSeu": {
"title": "ReturnType",
"description": "Return type constructs a type consisting of the return type of function Type.\n\n type T0 = ReturnType<() => string>;\n // type T0 = string\n \n type T1 = ReturnType<(s: string) => void>;\n // type T1 = void\n \n type T2 = ReturnType<<T>() => T>;\n // type T2 = unknown\n \n type T3 = ReturnType<<T extends U, U extends number[]>() => T>;\n // type T3 = number[]\n \n declare function f1(): { a: number; b: string };\n type T4 = ReturnType<typeof f1>;\n // type T4 = {\n // a: number;\n // b: string;\n // }\n \n type T5 = ReturnType<any>;\n // type T5 = any\n \n type T6 = ReturnType<never>;\n // type T6 = never\n \n type T7 = ReturnType<string>;\n // ^ Type 'string' does not satisfy the constraint '(...args: any) => any'.\n \n type T8 = ReturnType<Function>;\n // ^ Type 'Function' does not satisfy the constraint '(...args: any) => any'.\n \n\nLearn more from the following links:\n\n@article@ReturnType",
"description": "Return type constructs a type consisting of the return type of function Type.\n\n type T0 = ReturnType<() => string>;\n // type T0 = string\n \n type T1 = ReturnType<(s: string) => void>;\n // type T1 = void\n \n type T2 = ReturnType<<T>() => T>;\n // type T2 = unknown\n \n type T3 = ReturnType<<T extends U, U extends number[]>() => T>;\n // type T3 = number[]\n \n declare function f1(): { a: number; b: string };\n type T4 = ReturnType<typeof f1>;\n // type T4 = {\n // a: number;\n // b: string;\n // }\n \n type T5 = ReturnType<any>;\n // type T5 = any\n \n type T6 = ReturnType<never>;\n // type T6 = never\n \n type T7 = ReturnType<string>;\n // ^ Type 'string' does not satisfy the constraint '(...args: any) => any'.\n \n type T8 = ReturnType<Function>;\n // ^ Type 'Function' does not satisfy the constraint '(...args: any) => any'.\n \n\nLearn more from the following links:\n\n@official@ReturnType",
"links": []
},
"izGAjNtrh3BzQt3KiZX0W": {
"title": "InstanceType",
"description": "This type constructs a type consisting of the instance type of a constructor function in Type.\n\n class C {\n x = 0;\n y = 0;\n }\n \n type T0 = InstanceType<typeof C>;\n // type T0 = C\n \n type T1 = InstanceType<any>;\n // type T1 = any\n \n type T2 = InstanceType<never>;\n // type T2 = never\n \n type T3 = InstanceType<string>;\n // ^ Type 'string' does not satisfy the constraint 'abstract new (...args: any) => any'.\n \n type T4 = InstanceType<Function>;\n // ^ Type 'Function' does not satisfy the constraint 'abstract new (...args: any) => any'.\n \n\nLearn more from the following links:\n\n@article@InstanceType",
"links": []
"description": "This type constructs a type consisting of the instance type of a constructor function in Type.\n\n class C {\n x = 0;\n y = 0;\n }\n \n type T0 = InstanceType<typeof C>;\n // type T0 = C\n \n type T1 = InstanceType<any>;\n // type T1 = any\n \n type T2 = InstanceType<never>;\n // type T2 = never\n \n type T3 = InstanceType<string>;\n // ^ Type 'string' does not satisfy the constraint 'abstract new (...args: any) => any'.\n \n type T4 = InstanceType<Function>;\n // ^ Type 'Function' does not satisfy the constraint 'abstract new (...args: any) => any'.\n \n\nLearn more from the following links:",
"links": [
{
"title": "InstanceType<Type>",
"url": "https://www.typescriptlang.org/docs/handbook/utility-types.html#instancetypetype",
"type": "article"
}
]
},
"aEhI_9mFWXRIZh1ZxTuzu": {
"title": "Awaited",
"description": "This type is meant to model operations like await in async functions, or the `.then()` method on Promises - specifically, the way that they recursively unwrap Promises.\n\n type A = Awaited<Promise<string>>;\n // type A = string\n \n type B = Awaited<Promise<Promise<number>>>;\n // type B = number\n \n type C = Awaited<boolean | Promise<number>>;\n // type C = number | boolean\n \n\nLearn more from the following links:\n\n@article@Awaited",
"links": []
"description": "This type is meant to model operations like await in async functions, or the `.then()` method on Promises - specifically, the way that they recursively unwrap Promises.\n\n type A = Awaited<Promise<string>>;\n // type A = string\n \n type B = Awaited<Promise<Promise<number>>>;\n // type B = number\n \n type C = Awaited<boolean | Promise<number>>;\n // type C = number | boolean\n \n\nLearn more from the following links:",
"links": [
{
"title": "Awaited<Type>",
"url": "https://www.typescriptlang.org/docs/handbook/utility-types.html#awaitedtype",
"type": "article"
}
]
},
"2F7vOL__v9dLBohA263aj": {
"title": "Advanced Types",
@ -948,8 +977,14 @@
},
"N8xBTJ74xv1E5hSLYZtze": {
"title": "Recursive Types",
"description": "Recursive types in TypeScript are a way to define a type that references itself. Recursive types are used to define complex data structures, such as trees or linked lists, where a value can contain one or more values of the same type.\n\nFor example, the following is a recursive type that represents a linked list:\n\n type LinkedList<T> = {\n value: T;\n next: LinkedList<T> | null;\n };\n \n let list: LinkedList<number> = {\n value: 1,\n next: { value: 2, next: { value: 3, next: null } },\n };\n \n\nIn this example, the `LinkedList` type is defined as a type that extends `T` and contains a property `next` of the same type `LinkedList<T>`. This allows us to create a linked list where each node contains a value of type `T` and a reference to the next node in the list.",
"links": []
"description": "Recursive types in TypeScript are a way to define a type that references itself. Recursive types are used to define complex data structures, such as trees or linked lists, where a value can contain one or more values of the same type.\n\nFor example, the following is a recursive type that represents a linked list:\n\n type LinkedList<T> = {\n value: T;\n next: LinkedList<T> | null;\n };\n \n let list: LinkedList<number> = {\n value: 1,\n next: { value: 2, next: { value: 3, next: null } },\n };\n \n\nIn this example, the `LinkedList` type is defined as a type that extends `T` and contains a property `next` of the same type `LinkedList<T>`. This allows us to create a linked list where each node contains a value of type `T` and a reference to the next node in the list.\n\nLearn more from the following links:",
"links": [
{
"title": "Recursive Types in TypeScript",
"url": "https://www.typescriptlang.org/play/3-7/types-and-code-flow/recursive-type-references.ts.html",
"type": "article"
}
]
},
"sE9lqkkqwnsVJxTJv37YZ": {
"title": "TypeScript Modules",

@ -24,11 +24,6 @@
"url": "https://www.businessballs.com/improving-workplace-performance/nudge-theory/",
"type": "article"
},
{
"title": "Nudge Theory Explained with Examples (on YouTube)",
"url": "https://www.youtube.com/watch?v=u3yxxteiyya&ab_channel=epm",
"type": "video"
},
{
"title": "Nudge Theory Explained in less than 10 minutes",
"url": "https://youtu.be/fA5eGIMZTRQ",

@ -0,0 +1,15 @@
import { type APIContext } from 'astro';
import { api } from './api.ts';
export function projectApi(context: APIContext) {
return {
listProjectsUserCount: async function (projectIds: string[]) {
return api(context).post<Record<string, number>>(
`${import.meta.env.PUBLIC_API_URL}/v1-list-projects-user-count`,
{
projectIds,
},
);
},
};
}

@ -59,6 +59,7 @@ export function EmailLoginForm(props: EmailLoginFormProps) {
Email address
</label>
<input
id="email"
name="email"
type="email"
autoComplete="email"
@ -72,6 +73,7 @@ export function EmailLoginForm(props: EmailLoginFormProps) {
Password
</label>
<input
id="password"
name="password"
type="password"
autoComplete="current-password"

@ -3,9 +3,12 @@ import type {
ProjectDifficultyType,
ProjectFileType,
} from '../../lib/project.ts';
import { Users } from 'lucide-react';
import { formatCommaNumber } from '../../lib/number.ts';
type ProjectCardProps = {
project: ProjectFileType;
userCount?: number;
};
const badgeVariants: Record<ProjectDifficultyType, string> = {
@ -15,7 +18,7 @@ const badgeVariants: Record<ProjectDifficultyType, string> = {
};
export function ProjectCard(props: ProjectCardProps) {
const { project } = props;
const { project, userCount = 0 } = props;
const { frontmatter, id } = project;
@ -31,8 +34,18 @@ export function ProjectCard(props: ProjectCardProps) {
/>
<Badge variant={'grey'} text={frontmatter.nature} />
</span>
<span className="mb-1 mt-2.5 font-medium">{frontmatter.title}</span>
<span className="my-3 flex flex-col">
<span className="mb-1 font-medium">{frontmatter.title}</span>
<span className="text-sm text-gray-500">{frontmatter.description}</span>
</span>
<span className="flex items-center gap-2 text-xs text-gray-400">
<Users className="inline-block size-3.5" />
{userCount > 0 ? (
<>{formatCommaNumber(userCount)} Started</>
) : (
<>Be the first to solve!</>
)}
</span>
</a>
);
}

@ -40,10 +40,11 @@ function DifficultyButton(props: DifficultyButtonProps) {
type ProjectsListProps = {
projects: ProjectFileType[];
userCounts: Record<string, number>;
};
export function ProjectsList(props: ProjectsListProps) {
const { projects } = props;
const { projects, userCounts } = props;
const { difficulty: urlDifficulty } = getUrlParams();
const [difficulty, setDifficulty] = useState<
@ -127,9 +128,10 @@ export function ProjectsList(props: ProjectsListProps) {
.sort((a, b) => {
return a.frontmatter.sort - b.frontmatter.sort;
})
.map((matchingProject) => (
<ProjectCard project={matchingProject} />
))}
.map((matchingProject) => {
const count = userCounts[matchingProject?.id] || 0;
return <ProjectCard project={matchingProject} userCount={count} />;
})}
</div>
</div>
);

@ -1,9 +1,11 @@
interface TwitterIconProps {
className?: string;
boxColor?: string;
}
export function TwitterIcon(props: TwitterIconProps) {
const { className } = props;
const { className, boxColor = 'transparent' } = props;
return (
<svg
width="23"
@ -13,10 +15,10 @@ export function TwitterIcon(props: TwitterIconProps) {
xmlns="http://www.w3.org/2000/svg"
className={className}
>
<rect width="23" height="23" rx="3" fill="currentColor" />
<rect width="23" height="23" rx="3" fill={boxColor} />
<path
d="M12.9285 10.3522L18.5135 4H17.1905L12.339 9.5144L8.467 4H4L9.8565 12.3395L4 19H5.323L10.443 13.1754L14.533 19H19M5.8005 4.97619H7.833L17.1895 18.0718H15.1565"
fill="#E5E5E5"
fill='currentColor'
/>
</svg>
);

@ -3,6 +3,11 @@ import { cn } from '../../lib/classname.ts';
import { Filter, X } from 'lucide-react';
import { CategoryFilterButton } from './CategoryFilterButton.tsx';
import { useOutsideClick } from '../../hooks/use-outside-click.ts';
import {
deleteUrlParam,
getUrlParams,
setUrlParams,
} from '../../lib/browser.ts';
const groupNames = [
'Absolute Beginners',
@ -468,6 +473,15 @@ export function RoadmapsPage() {
]);
}, [activeGroup]);
useEffect(() => {
const { g } = getUrlParams() as { g: AllowGroupNames };
if (!g) {
return;
}
setActiveGroup(g);
}, []);
return (
<div className="border-t bg-gray-100">
<button
@ -502,6 +516,7 @@ export function RoadmapsPage() {
onClick={() => {
setActiveGroup('');
setIsFilterOpen(false);
deleteUrlParam('g');
}}
category={'All Roadmaps'}
selected={activeGroup === ''}
@ -514,6 +529,7 @@ export function RoadmapsPage() {
setActiveGroup(group.group);
setIsFilterOpen(false);
document?.getElementById('filter-button')?.scrollIntoView();
setUrlParams({ g: group.group });
}}
category={group.group}
selected={activeGroup === group.group}

@ -70,7 +70,7 @@ export function ShareRoadmapButton(props: ShareRoadmapButtonProps) {
</button>
{isDropdownOpen && (
<div className="absolute right-0 z-[999] mt-1 w-40 rounded-md bg-slate-800 text-sm text-white shadow-lg ring-1 ring-black ring-opacity-5">
<div className="absolute right-0 z-[999] mt-1 w-40 rounded-md bg-slate-800 text-sm text-white shadow-lg ring-1 ring-black ring-opacity-5 w-[175px]">
<div className="flex flex-col px-1 py-1">
<button
onClick={() => {
@ -103,7 +103,7 @@ export function ShareRoadmapButton(props: ShareRoadmapButtonProps) {
target={'_blank'}
className="mt-1 flex w-full items-center gap-2 rounded-sm px-2 py-2 text-sm text-slate-100 hover:bg-slate-700"
>
<div className="flex w-[20px] items-center justify-center">
<div className="flex w-[20px] flex-shrink-0 items-center justify-center">
<TwitterIcon className="h-[16px] text-slate-400" />
</div>
Twitter

@ -307,6 +307,7 @@ export function TeamRoadmaps() {
{pickRoadmapOptionModal}
{addRoadmapModal}
{createRoadmapModal}
{confirmationContentIdModal}
<RoadmapIcon className="mb-4 h-24 w-24 opacity-10" />

@ -0,0 +1,30 @@
import { useState } from 'react';
import { X } from 'lucide-react';
type PaidResourceDisclaimerProps = {
onClose: () => void;
};
export function PaidResourceDisclaimer(props: PaidResourceDisclaimerProps) {
const { onClose } = props;
return (
<div className="relative ml-3 mt-4 rounded-md bg-gray-100 p-3 px-3 text-xs text-gray-500">
<button className="absolute right-1 top-1" onClick={onClose}>
<X size={16} className="absolute right-2 top-2 cursor-pointer" />
</button>
<p className="mb-1 font-medium text-gray-800">
Note on Premium Resources
</p>
<p className="mb-1">
These are optional paid resources vetted by the roadmap team.
</p>
<p>
If you purchase a resource, we may receive a small commission at no
extra cost to you. This helps us offset the costs of running this site
and keep it free for everyone.
</p>
</div>
);
}

@ -22,7 +22,7 @@ import type {
RoadmapContentDocument,
} from '../CustomRoadmap/CustomRoadmap';
import { markdownToHtml, sanitizeMarkdown } from '../../lib/markdown';
import { Ban, FileText, HeartHandshake, Star, X } from 'lucide-react';
import { Ban, Coins, FileText, HeartHandshake, Star, X } from 'lucide-react';
import { getUrlParams, parseUrl } from '../../lib/browser';
import { Spinner } from '../ReactIcons/Spinner';
import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';
@ -32,6 +32,7 @@ import { resourceTitleFromId } from '../../lib/roadmap.ts';
import { lockBodyScroll } from '../../lib/dom.ts';
import { TopicDetailLink } from './TopicDetailLink.tsx';
import { ResourceListSeparator } from './ResourceListSeparator.tsx';
import { PaidResourceDisclaimer } from './PaidResourceDisclaimer.tsx';
type TopicDetailProps = {
resourceId?: string;
@ -71,6 +72,8 @@ async function fetchRoadmapPaidResources(roadmapId: string) {
return response;
}
const PAID_RESOURCE_DISCLAIMER_HIDDEN = 'paid-resource-disclaimer-hidden';
export function TopicDetail(props: TopicDetailProps) {
const {
canSubmitContribution,
@ -92,6 +95,9 @@ export function TopicDetail(props: TopicDetailProps) {
const [links, setLinks] = useState<RoadmapContentDocument['links']>([]);
const toast = useToast();
const [showPaidResourceDisclaimer, setShowPaidResourceDisclaimer] =
useState(false);
const { secret } = getUrlParams() as { secret: string };
const isGuest = useMemo(() => !isLoggedIn(), []);
const topicRef = useRef<HTMLDivElement>(null);
@ -116,6 +122,10 @@ export function TopicDetail(props: TopicDetailProps) {
return;
}
setShowPaidResourceDisclaimer(
localStorage.getItem(PAID_RESOURCE_DISCLAIMER_HIDDEN) !== 'true',
);
fetchRoadmapPaidResources(defaultResourceId).then((resources) => {
setPaidResources(resources);
});
@ -475,6 +485,18 @@ export function TopicDetail(props: TopicDetailProps) {
);
})}
</ul>
{showPaidResourceDisclaimer && (
<PaidResourceDisclaimer
onClose={() => {
localStorage.setItem(
PAID_RESOURCE_DISCLAIMER_HIDDEN,
'true',
);
setShowPaidResourceDisclaimer(false);
}}
/>
)}
</>
)}

@ -0,0 +1,48 @@
---
title: 'Accessible Form UI'
description: 'Create an accessible form UI using HTML and CSS.'
isNew: false
sort: 7
difficulty: 'beginner'
nature: 'Accessibility'
skills:
- 'HTML'
- 'CSS'
- 'Layouts'
- 'Positioning'
- 'Accessibility'
seo:
title: 'Create an Accessible Form UI for a Website Using HTML and CSS'
description: 'Learn how to create an accessible form component using HTML and CSS.'
keywords:
- 'accessible forms'
- 'css project idea'
- 'responsive design'
- 'html and css'
roadmapIds:
- 'frontend'
---
In this project, you are required to create a form UI using only HTML and CSS. The form will include fields for a full name, email, password, and confirm password, along with a button to toggle the visibility of the password text. Additionally, the form will feature a completeness progress bar and a checklist of requirements that must be met for the form to reach 100% completeness. While this version of the form won’t be functional, it will be a static UI component that can be enhanced with JavaScript in the future.
The goal of this project is to not only help you practice your HTML and CSS but also to focus on creating an accessible form that is easy to use for all users, including those with disabilities. Given below is the rough mockup of the form UI that you need to create:
[![Form UI](https://assets.roadmap.sh/guest/form-components-7t4b3.png)](https://assets.roadmap.sh/guest/form-components-7t4b3.png)
## Accessibility Guidelines
You should read up on accessibility guidelines and best practices before starting this project. However, here are some key points to keep in mind while creating an accessible form UI:
- **Labeling**: Ensure that each form field has a corresponding `<label>` element that is clearly associated with the field using the `for` attribute.
- **Focus State**: Style the focus state of each input field so that users navigating with a keyboard can easily see which field is currently active.
- **Error Messaging**: Consider adding space for error messages that can be displayed when a user inputs invalid data. These messages should be clearly associated with the relevant input field.
- **ARIA Attributes**: Use ARIA (Accessible Rich Internet Applications) attributes where necessary, such as `aria-required` for required fields and `aria-invalid` for fields with errors.
- **Color Contrast**: Ensure that the color contrast between text and background is sufficient to meet WCAG (Web Content Accessibility Guidelines) standards, making the form readable for users with visual impairments.
- **Interactive Elements**: Make sure that the button to show/hide the password is accessible via keyboard and screen readers, providing clear feedback on the current state (e.g., "Password is hidden" or "Password is visible").
Once done, you can test the form UI using a screen reader or browser extensions like Axe or Lighthouse to check for accessibility issues and make necessary adjustments.
---
After completing this project, you will have a solid foundation in creating accessible and well-structured forms using HTML and CSS. You can later enhance this form by adding JavaScript to make it fully functional and dynamic in future projects.

@ -0,0 +1,30 @@
---
title: 'Accordion'
description: 'Create an accordion component using HTML, CSS, and JavaScript.'
isNew: false
sort: 18
difficulty: 'beginner'
nature: 'JavaScript'
skills:
- 'HTML'
- 'CSS'
- 'JavaScript'
- 'DOM Manipulation'
seo:
title: 'Build an Accordion Component with JavaScript'
description: 'Learn how to create a responsive accordion component that allows users to toggle between different sections of content.'
keywords:
- 'accordion'
- 'javascript accordion'
- 'html and css'
roadmapIds:
- 'frontend'
---
You are required to create an accordion component that displays a list of questions or headings. When a user clicks on a question, its corresponding answer or content section will expand while collapsing any previously opened section. This allows only one section to be open at a time, keeping the UI clean and organized.
Given below is the mockup showing the accordion in its default and expanded states:
[![Accordion](https://assets.roadmap.sh/guest/accordion-rbvpo.png)](https://assets.roadmap.sh/guest/accordion-rbvpo.png)
This project will help you practice DOM manipulation, event handling, and implementing responsive design patterns using JavaScript.

@ -2,7 +2,7 @@
title: 'Basic HTML Website'
description: 'Create simple HTML only website with multiple pages.'
isNew: false
sort: 1
sort: 2
difficulty: 'beginner'
nature: 'HTML'
skills:

@ -0,0 +1,35 @@
---
title: 'Changelog Component'
description: 'Create a changelog component for a website using HTML and CSS.'
isNew: false
sort: 4
difficulty: 'beginner'
nature: 'CSS'
skills:
- 'HTML'
- 'Layouts'
- 'CSS'
- 'Flexbox'
seo:
title: 'Create a Changelog Component Website Using HTML and CSS'
description: 'Learn how to create a changelog component for a website using HTML and CSS.'
keywords:
- 'basic css'
- 'css project idea'
- 'responsive design'
- 'html and css'
roadmapIds:
- 'frontend'
---
In this project you are required to create a simple component for a website that displays a changelog. A changelog is a log or record of all notable changes made to a project or software. It is often used to keep users informed about the latest updates and improvements.
The goal of this project is to teach you about positioning and layout in CSS. You will create a simple HTML structure and use CSS to style it into a visually appealing and responsive changelog component. Given below is a rough mockup of the changelog component you need to create.
[![Changelog Component](https://assets.roadmap.sh/guest/changelog-component-1m86j.png)](https://assets.roadmap.sh/guest/changelog-component-1m86j.png)
Feel free to customize the design and layout of the component as you see fit. The focus should be on creating a well-structured and responsive component that can be easily integrated into a website.
---
After completing this project, you will have a good understanding of how to create simple layouts using HTML and CSS. You can further enhance your skills by exploring more complex layouts, such as grids and flexbox, in future projects.

@ -0,0 +1,32 @@
---
title: 'Cookie Consent'
description: 'Create a simple cookie consent banner using JavaScript.'
isNew: false
sort: 12
difficulty: 'beginner'
nature: 'JavaScript'
skills:
- 'HTML'
- 'CSS'
- 'JavaScript'
- 'DOM Manipulation'
seo:
title: 'Create a Cookie Consent Popup Using HTML, CSS, and JavaScript'
description: 'Learn how to build a cookie consent popup with basic JavaScript for managing user consent.'
keywords:
- 'cookie consent'
- 'javascript popup'
- 'html and css'
- 'javascript project'
roadmapIds:
- 'frontend'
---
This project is designed to introduce you to basic DOM manipulation and event handling in JavaScript.
Many websites display a cookie consent popup to inform users about the use of cookies and to obtain their consent. In this project, you will create a simple cookie consent popup that appears when the user visits the page. The popup will include a message and a button to accept the consent. Once accepted, the popup will disappear. Given below is an example of how the popup might look:
[![Cookie Consent Popup](https://assets.roadmap.sh/guest/cookie-consent-banner-07etz.png)](https://assets.roadmap.sh/guest/cookie-consent-banner-07etz.png)
Bonus points if you persist the user's consent using cookies or local storage and prevent the popup from appearing on subsequent visits.

@ -0,0 +1,30 @@
---
title: 'Custom Dropdown'
description: 'Create a custom dropdown using HTML, CSS, and JavaScript.'
isNew: false
sort: 19
difficulty: 'intermediate'
nature: 'JavaScript'
skills:
- 'HTML'
- 'CSS'
- 'JavaScript'
- 'DOM Manipulation'
seo:
title: 'Build a Custom Dropdown Menu with JavaScript'
description: 'Learn how to create a fully customizable dropdown menu that allows users to select an item and see the selection reflected in the dropdown.'
keywords:
- 'custom dropdown'
- 'javascript dropdown'
- 'html and css'
roadmapIds:
- 'frontend'
---
You will create a custom dropdown menu that lets users select an item from a list. The dropdown should have a default state showing a placeholder text, an open state revealing all options, and a selected state where the chosen item is displayed. When an item is selected, the dropdown closes, and the selected item is highlighted.
Given below is the mockup showing the dropdown in its default, open, and selected states:
[![Custom Dropdown](https://assets.roadmap.sh/guest/dropdown-1f4b3.png)](https://assets.roadmap.sh/guest/dropdown-1f4b3.png)
This project will help you practice DOM manipulation, event handling, and creating responsive and interactive elements with JavaScript.

@ -0,0 +1,36 @@
---
title: 'Datepicker UI'
description: 'Create a simple datepicker UI using HTML and CSS.'
isNew: false
sort: 6
difficulty: 'beginner'
nature: 'CSS'
skills:
- 'HTML'
- 'CSS'
- 'Layouts'
- 'Positioning'
seo:
title: 'Create a Datepicker UI for a Website Using HTML and CSS'
description: 'Learn how to create a datepicker component using HTML and CSS.'
keywords:
- 'basic css'
- 'css project idea'
- 'responsive design'
- 'html and css'
roadmapIds:
- 'frontend'
---
In this project, you are required to create a simple datepicker UI using only HTML and CSS. It will not be a functional datepicker, but a static UI component that you can later enhance with JavaScript.
The goal of this project is to help you practice positioning, layout, and styling techniques in CSS. Below is a rough mockup showing the datepicker UI you need to create.
[![Datepicker UI](https://assets.roadmap.sh/guest/datepicker-ui-7l480.png)](https://assets.roadmap.sh/guest/datepicker-ui-7l480.png)
Feel free to customize the colors, fonts, and overall design to match your style.
---
While this version won't be functional, it will provide a solid foundation for creating an interactive datepicker in a future project.

@ -0,0 +1,39 @@
---
title: 'GitHub Random Repository'
description: 'Create a GitHub random repository finder using GitHub API.'
isNew: false
sort: 25
difficulty: 'intermediate'
nature: 'API Integration'
skills:
- 'HTML'
- 'CSS'
- 'JavaScript'
- 'API Integration'
- 'DOM Manipulation'
seo:
title: 'Build a GitHub Repository Finder with JavaScript and GitHub API'
description: 'Learn how to create a dynamic application that fetches random GitHub repositories based on a chosen language and displays key information like stars, forks, and issues.'
keywords:
- 'github api'
- 'repository finder'
- 'javascript project'
roadmapIds:
- 'frontend'
---
This project is designed to introduce you to working with external APIs, handling asynchronous requests, and managing different UI states with JavaScript.
You will create a GitHub repository finder that allows users to select a programming language from a dropdown menu. The app will then use the GitHub Repository Search API to fetch and display a random repository that matches the selected language. The displayed information should include the repository name, description, number of stars, forks, and open issues. Users can fetch another random repository with a button click.
[![GitHub Random Repository](https://assets.roadmap.sh/guest/github-repo-finder-n2qz4.png)](https://assets.roadmap.sh/guest/github-repo-finder-n2qz4.png)
The application should handle loading, empty, and error states effectively. After successfully fetching a repository, a "Refresh" button should appear to allow users to get another random repository.
Here are the links to the resources you will need for this project:
- [GitHub Repository Search API](https://docs.github.com/en/rest/reference/search#search-repositories)
- [Programming Language Data](https://raw.githubusercontent.com/kamranahmedse/githunt/master/src/components/filters/language-filter/languages.json)
This project will help you practice API integration, managing asynchronous data, and enhancing user experience with responsive UI states.

@ -0,0 +1,51 @@
---
title: 'Image Grid Layout'
description: 'Create a grid layout of images using HTML and CSS.'
isNew: false
sort: 8
difficulty: 'beginner'
nature: 'CSS'
skills:
- 'HTML'
- 'CSS'
- 'Grid Layout'
- 'Responsive Design'
seo:
title: 'Create an Image Grid Layout for a Website Using HTML and CSS'
description: 'Learn how to create a responsive grid layout of images using HTML and CSS.'
keywords:
- 'css grid'
- 'image layout'
- 'responsive design'
- 'html and css'
roadmapIds:
- 'frontend'
---
In this project, you are required to create a grid layout using HTML and CSS. You will be provided with six images that need to be arranged in a grid pattern based on the provided mockup. The primary focus of this project is to help you learn and practice the CSS Grid layout technique, which is essential for creating responsive and flexible web layouts.
The goal of this project is to give you hands-on experience with CSS Grid, allowing you to create complex layouts with ease. Below is a rough mockup showing the grid layout you need to create along with the six images that you should use.
[![Grid Layout Mockup](https://assets.roadmap.sh/guest/image-grid.jpg)](https://assets.roadmap.sh/guest/image-grid.jpg)
You can use the same images provided in the mockup or replace them with your own images. The grid layout should be responsive, meaning it should adapt to different screen sizes and maintain a visually appealing design.
- [A foggy beach with a large rock formation in the foreground](https://unsplash.com/photos/a-foggy-beach-with-a-large-rock-formation-in-the-foreground-TTExgxV06KA)
- [A living room with a white couch and a round window](https://unsplash.com/photos/a-living-room-with-a-white-couch-and-a-round-window-Wuu6H3mI7UA)
- [A table topped with plates and bowls of food](https://unsplash.com/photos/a-table-topped-with-plates-and-bowls-of-food-zx8_8jwZ5m8)
- [A building with a red door and a tree in front of it](https://unsplash.com/photos/a-building-with-a-red-door-and-a-tree-in-front-of-it-uTd-kylh7bE)
- [A row of white apartment buildings next to a street](https://unsplash.com/photos/a-row-of-white-apartment-buildings-next-to-a-street-f1PzRPbqt0M)
- [A view of a beach from the top of a hill](https://unsplash.com/photos/a-view-of-a-beach-from-the-top-of-a-hill-SAyIShcE5rs)
Key learning objectives of this project include:
- **Grid Structure**: Understand the fundamentals of CSS Grid, including defining grid containers, rows, columns, and how to place items within the grid.
- **Responsive Design**: Learn how to make the grid layout responsive so that it adapts to different screen sizes. This might involve changing the number of columns or the layout of the images based on the viewport width.
- **Alignment and Spacing**: Explore how to align grid items and manage spacing between them to achieve a clean and visually appealing layout.
---
By completing this project, you will gain confidence in using CSS Grid to create flexible and responsive layouts. You can further apply these skills to more complex projects as you continue learning web design and development.

@ -0,0 +1,54 @@
---
title: 'Personal Portfolio'
description: 'Convert the previous simple HTML website into a personal portfolio.'
isNew: false
sort: 3
difficulty: 'beginner'
nature: 'CSS'
skills:
- 'CSS'
- 'Responsive Design'
- 'Box Model'
- 'Typography'
- 'Flexbox'
seo:
title: 'Create a Personal Portfolio Website Using HTML and CSS'
description: 'Learn how to style a website using CSS by converting a simple HTML website into a personal portfolio.'
keywords:
- 'basic css'
- 'css project idea'
- 'responsive design'
- 'html and css'
roadmapIds:
- 'frontend'
---
> The goal of this project is to teach you how to style a website using CSS. You will take the structure from the [previous HTML-only project](/projects/basic-html-website) and apply various CSS techniques to enhance its appearance and responsiveness.
In this project, you will style the HTML website structure you created previously [in a different project](/projects/basic-html-website). The focus will be on learning how to use CSS to create responsive layouts, apply color and typography, and enhance the overall design of your website.
Rough mockups of the website structure for mobile and desctop devices are given below. Do not worry about the design details i.e. colors backgrounds etc at this stage; we are not looking for a beautiful design, but a well-structured and responsive website. Just focus on making the layout same as the mockup and ensuring it looks good on different screen sizes.
[![Styled HTML Website](https://assets.roadmap.sh/guest/portfolio-template-xdhki.png)](https://assets.roadmap.sh/guest/portfolio-template-xdhki.png)
## Submission Requirements
Your submission should include:
- A fully styled, responsive website with the same structure as the previous project.
- Consistent use of a chosen color scheme and typography.
- Proper use of CSS techniques like Flexbox, media queries, and the box model.
- A responsive navigation bar and well-styled contact form.
## Bonus Points
For bonus points, you can:
- Use [Google Fonts](https://fonts.google.com/) to enhance the typography of your website.
- Look into [GitHub Pages](https://pages.github.com/) or [Cloudflare Pages](https://pages.cloudflare.com/) to host your website for free.
- Add support for dark mode using CSS variables.
---
After completing this project, you will have a solid understanding of how to style a basic HTML website using CSS. You can move on to more advanced topics, such as CSS animations, transitions, and grid layouts, in future projects.

@ -0,0 +1,42 @@
---
title: 'Reddit Client'
description: 'Create a Reddit client with customizable subreddit lanes.'
isNew: false
sort: 26
difficulty: 'intermediate'
nature: 'API Integration'
skills:
- 'HTML'
- 'CSS'
- 'JavaScript'
- 'API Integration'
- 'DOM Manipulation'
- 'Asynchronous Programming'
seo:
title: 'Build a Multi-Lane Reddit Client with JavaScript and Reddit API'
description: 'Learn how to create a dynamic browser-based Reddit client that allows users to add and view multiple subreddits in customizable lanes.'
keywords:
- 'reddit api'
- 'subreddit viewer'
- 'javascript project'
- 'multi-lane client'
roadmapIds:
- 'frontend'
---
You are required to create a browser-based Reddit client that displays multiple subreddits in separate, customizable lanes. You'll work with the Reddit JSON feed to fetch posts from different subreddits and display them in a dynamic, responsive layout.
The application will allow users to add new subreddit lanes by entering a subreddit name. It will verify the existence of the subreddit, fetch its posts, and display them in a new lane. Each lane will show the subreddit's posts, including titles, authors, and vote counts.
[![Multi-Lane Reddit Client](https://assets.roadmap.sh/guest/reddit-client-o876k.png)](https://assets.roadmap.sh/guest/reddit-client-o876k.png)
To fetch data from reddit, you can use the JSON feed available at the following URL. You can also use the Reddit API to fetch more details about the posts, such as comments, upvotes, and more.
```plaintext
https://www.reddit.com/r/{subreddit}.json
```
The application should handle loading states while fetching data, display error messages for invalid subreddits or API issues, and provide a smooth user experience when adding or removing lanes. You can use local storage to save the user's custom lanes and restore them when the application is reloaded.
This project will help you practice API integration, state management, asynchronous programming, and creating a responsive, dynamic user interface. It's an excellent opportunity to enhance your skills in frontend development and working with real-time data.

@ -0,0 +1,29 @@
---
title: 'Restricted Textarea'
description: 'Create a textarea with live character count and a max character limit.'
isNew: false
sort: 15
difficulty: 'beginner'
nature: 'JavaScript'
skills:
- 'HTML'
- 'CSS'
- 'JavaScript'
- 'DOM Manipulation'
seo:
title: 'Build a Restricted Textarea with JavaScript'
description: 'Learn how to create a textarea with live character count and a maximum limit, with visual feedback as the limit is reached.'
keywords:
- 'character count'
- 'textarea limit'
- 'javascript input'
- 'html and css'
roadmapIds:
- 'frontend'
---
You are required to create a textarea that tracks and displays the number of characters typed by the user, along with a maximum character limit. As the user types, the character count will update dynamically. Once the limit is reached, the textarea will prevent further input and the border will turn red to visually indicate the limit has been hit.
[![Restricted Textarea](https://assets.roadmap.sh/guest/textarea-input-vdclr.png)](https://assets.roadmap.sh/guest/textarea-input-vdclr.png)
This project will help you practice manipulating input elements with JavaScript, handling user input events, and providing real-time feedback to enhance user experience.

@ -0,0 +1,32 @@
---
title: 'Tabs'
description: 'Create a simple tabs component using HTML, CSS, and JavaScript.'
isNew: false
sort: 10
difficulty: 'beginner'
nature: 'JavaScript'
skills:
- 'HTML'
- 'CSS'
- 'JavaScript'
- 'DOM Manipulation'
seo:
title: 'Create a Tabs Functionality Using HTML, CSS, and JavaScript'
description: 'Learn how to build a tabs component with basic JavaScript for switching between content sections.'
keywords:
- 'javascript tabs'
- 'dynamic content'
- 'html and css'
- 'javascript project'
roadmapIds:
- 'frontend'
---
This project is designed to introduce you to basic DOM manipulation and event handling in JavaScript.
You are required to create a simple tabs functionality using HTML, CSS, and basic JavaScript. The page will have four tabs, with the first tab being active by default. When the user clicks on another tab, the content of the current tab will be hidden, and the content of the selected tab will be displayed.
[![Tabs Component Mockup](https://assets.roadmap.sh/guest/simple-tabs-8e6gy.png)](https://assets.roadmap.sh/guest/simple-tabs-8e6gy.png)
This project will help you practice selecting elements with JavaScript, listen for click events, and manipulate the dom to show or hide relevant tab content.

@ -0,0 +1,49 @@
---
title: 'Single-Page CV'
description: 'Create a single-page HTML CV to showcase your career history'
isNew: false
sort: 1
difficulty: 'beginner'
nature: 'HTML'
skills:
- 'HTML'
- 'Semantic HTML'
- 'Layout'
- 'SEO'
seo:
title: 'Single-Page HTML CV Project'
description: 'Create a simple single-page HTML CV that displays your education, skills, and career history.'
keywords:
- 'html cv'
- 'single-page cv'
- 'html resume'
roadmapIds:
- 'frontend'
---
> The goal of this project is to teach you how to create a structured, single-page CV using only HTML. You will focus on laying out your education, skills, and career history in a clean, semantic manner. Styling will be addressed in a later project.
In this project, you are required to create a single-page CV (Curriculum Vitae) using only HTML. Your webpage should look like the following image:
![Single-Page HTML CV](https://assets.roadmap.sh/guest/resume-template-zyl70.png)
Key requirements for this project:
- **Semantic HTML**: Use appropriate HTML tags to structure your CV.
- **SEO Meta Tags**: Include essential meta tags for SEO.
- **Open Graph (OG) Tags**: Add OG tags for better social media sharing.
- **Favicon**: Add a favicon for your CV page.
The structure of your CV should be easily understandable and ready for styling in a future project.
### Submission Checklist:
- Semantically correct HTML structure.
- Single-page layout with sections for education, skills, and career history.
- SEO meta tags in the head section.
- OG tags for better social media sharing.
- A favicon linked in the head section.
<hr />
By completing this project, you'll gain a solid understanding of how to create a single-page CV using HTML, apply basic SEO principles, and prepare your webpage for future styling. This foundation will enable you to move on to styling the CV using CSS in subsequent projects.

@ -0,0 +1,34 @@
---
title: 'Task Tracker'
description: 'Create a task tracker with a to-do list using JavaScript.'
isNew: false
sort: 22
difficulty: 'intermediate'
nature: 'JavaScript'
skills:
- 'HTML'
- 'CSS'
- 'JavaScript'
- 'DOM Manipulation'
seo:
title: 'Build a Task Tracker with JavaScript'
description: 'Learn how to create a dynamic task tracker that allows users to add, complete, and delete tasks with real-time updates.'
keywords:
- 'task tracker'
- 'to-do list'
- 'javascript project'
roadmapIds:
- 'frontend'
---
You are required to create a task tracker that lets users add new tasks, mark them as complete, or delete them. Completed tasks will be moved to the end of the list and will have strikethrough, and users can unmark tasks to return them to the pending list.
Here is the mockup of the task tracker:
[![Task Tracker](https://assets.roadmap.sh/guest/task-tracker-2diba.png)](https://assets.roadmap.sh/guest/task-tracker-2diba.png)
## Hint
Store your tasks in an array of objects, where each object represents a task with properties like description and status (completed or not). Whenever a new task is added, updated, deleted, or marked as complete/uncomplete, update the tasks array. Write a function `renderTasks` which will remove all tasks from the DOM and re-render them based on the updated tasks array.
This project will help you practice array manipulation, event handling, and dynamic DOM updates using JavaScript.

@ -0,0 +1,33 @@
---
title: Temperature Converter
description: Build a temperature converter that converts between different units.
isNew: false
sort: 27
difficulty: intermediate
nature: JavaScript
skills:
- HTML
- CSS
- JavaScript
- DOM Manipulation
seo:
- title: Build a Temperature Converter with JavaScript
- description: Learn how to create an interactive temperature converter that converts between Celsius, Fahrenheit, and Kelvin using JavaScript.
- keywords:
- 'temperature converter'
- 'javascript project'
- 'unit conversion'
- 'html and css'
roadmapIds:
- 'frontend'
---
This project is designed to help you practice DOM manipulation, form handling, and basic calculations in JavaScript.
You will create a temperature converter that allows users to enter a temperature value, select the unit they want to convert from, and select the unit they want to convert to. The "Convert" button should only be enabled when all three fields are filled in. Once the user clicks "Convert," the tool will display the converted temperature below the form.
Here is a mockup of what the temperature converter might look like:
[![Temperature Converter](https://assets.roadmap.sh/guest/temperature-converter-8omel.png)](https://assets.roadmap.sh/guest/temperature-converter-8omel.png)
This project will help you gain experience with handling user input, conditionally enabling form elements, and performing simple calculations using JavaScript.

@ -0,0 +1,37 @@
---
title: 'Testimonial Cards'
description: 'Create testimonial cards for a website using HTML and CSS.'
isNew: false
sort: 5
difficulty: 'beginner'
nature: 'CSS'
skills:
- 'HTML'
- 'CSS'
- 'Layouts'
- 'Flexbox'
- 'Positioning'
seo:
title: 'Create Testimonial Cards for a Website Using HTML and CSS'
description: 'Learn how to create testimonial components using HTML and CSS.'
keywords:
- 'basic css'
- 'css project idea'
- 'responsive design'
- 'html and css'
roadmapIds:
- 'frontend'
---
In this project, you are required to create a bunch of testimonial cards. Testimonials are quotes or statements from satisfied customers or users, often used on websites to build credibility and trust.
The goal of this project is to teach you about positioning and layout in CSS. Below is a rough mockup showing some testimonial cards. Each card is designed to help you understand different layout and positioning techniques.
[![Testimonials Component](https://assets.roadmap.sh/guest/testimonials-min-3j2j4.png)](https://assets.roadmap.sh/guest/testimonials-min-3j2j4.png)
Feel free to use any content and images you like for the testimonials.
---
After completing this project, you will have a good understanding of how to create layouts using HTML and CSS. You can further enhance your skills by exploring more complex projects as you progress.

@ -0,0 +1,34 @@
---
title: 'Tooltip UI'
description: 'Create a tooltip for navigation items using only HTML and CSS.'
isNew: false
sort: 9
difficulty: 'beginner'
nature: 'CSS'
skills:
- 'HTML'
- 'CSS'
- 'Positioning'
- 'Hover Effects'
seo:
title: 'Create a CSS Tooltip for Navigation Items'
description: 'Learn how to create a tooltip that appears above navigation items on hover using only HTML and CSS.'
keywords:
- 'css tooltip'
- 'hover effects'
- 'navigation menu'
- 'html and css'
roadmapIds:
- 'frontend'
---
In this project, you are required to create a tooltip that appears above navigation items when hovered, using only HTML and CSS. A tooltip is a small pop-up box that provides additional information about a navigation item when a user hovers over it. This project will focus on mastering CSS positioning, hover effects, and creating visually appealing tooltips without relying on JavaScript.
The goal of this project is to help you understand how to use CSS for dynamic UI effects. You will learn how to position elements relative to each other, create smooth transitions, and make your navigation more interactive and user-friendly. Below is a rough mockup showing the tooltip appearing above a navigation item.
[![Tooltip Mockup](https://assets.roadmap.sh/guest/tooltip-zh8gm.png)](https://assets.roadmap.sh/guest/tooltip-zh8gm.png)
Bonus points for different animations for the tooltip, such as fade-in, slide-in, or scale-in effects.
After completing this project, you will have a better understanding of CSS positioning, hover effects, and creating interactive UI elements without JavaScript.

@ -0,0 +1,7 @@
# Frame Layout
**FrameLayout** is a simple ViewGroup subclass in Android that is designed to hold a single child view or a stack of overlapping child views. It positions each child in the top-left corner by default and allows them to overlap on top of each other, which makes it useful for situations where you need to layer views on top of one another.
Visit the following resources to learn more:
- [@official@Android developers: Frame Layout](https://developer.android.com/reference/android/widget/FrameLayout)

@ -0,0 +1,9 @@
# LinearLayout
**LinearLayout** is a view group that aligns all children in a single directioni, vertically or horizontally. You can specify the layout direction with the `android:orientation` attribute.
**LinearLayout** was commonly used in earlier Android development, but with the introduction of ConstraintLayout, it’s less frequently used in modern apps.
Visit the following resources to learn more:
- [@official@Android developers: Linear Layout](https://developer.android.com/develop/ui/views/layout/linear)

@ -0,0 +1,9 @@
# RelativeLayout
A **RelativeLayout** in Android is a type of ViewGroup that allows you to position child views relative to each other or relative to the parent layout. It's a flexible layout where you can arrange the child views in relation to one another based on certain rules, making it suitable for creating complex UI designs.
**RelativeLayout** was commonly used in earlier Android development, but with the introduction of `ConstraintLayout`, it's less frequently used in modern apps.
Visit the following resources to learn more:
- [@official@Android developers: Relative Layout](https://developer.android.com/develop/ui/views/layout/relative)

@ -1 +1,18 @@
# Communication
Angular components can communicate with each other using `@Input()` and `@Output()` decorators. These decorators facilitate data exchange between parent and child components.
- **@Input()**: This decorator allows a parent component to pass data to a child component, enabling the child to receive and use the data.
- **@Output()**: This decorator allows a child component to emit events to a parent component, enabling the parent to respond to changes or actions within the child component.
Additionally, **model inputs** are a special type of input that enable two-way data binding. This means that changes in the child component can be propagated back to the parent component, ensuring synchronization between the two. Model inputs automatically create a corresponding output, typically named by appending “Change” to the input’s name, to facilitate this two-way communication.
To facilitate communication between unrelated components, it’s most effective to trigger events using `EventEmitter` and have the components listen for these events. This approach ensures a decoupled and flexible architecture, allowing components to interact seamlessly without direct dependencies.
Visit the following resources to learn more:
- [@official@Angular Official Website - Inputs](https://angular.dev/guide/components/inputs)
- [@official@Angular Official Website - Outputs](https://angular.dev/guide/components/outputs)
- [@official@Angular Official Docs - Model Inputs](https://angular.dev/guide/signals/model)
- [@official@Custom events with outputs](https://angular.dev/guide/components/outputs)
- [@video@Non-Related Component Communication | Angular Component & Directives](https://www.youtube.com/watch?v=aIkGXMJFTzM)

@ -1 +1,10 @@
# Developer Tools
Angular offers a suite of powerful developer tools designed to streamline and enhance the development process. These include the Angular CLI for efficient project setup and management, the Angular DevTools extension for advanced debugging and profiling, and the Angular Language Service for improved code editing and completion. Leveraging these tools will significantly improve your ability to write high-quality Angular code.
Visit the following resources to learn more:
- [@official@Angular Official Docs - devtools](https://angular.dev/tools/devtools)
- [@official@Angular Official Docs - CLI](https://angular.dev/tools/cli)
- [@official@Language Service Docs](https://angular.dev/tools/language-service)
- [@opensource@VS Code NG Language Service](https://github.com/angular/vscode-ng-language-service)

@ -1 +1,10 @@
# Locales by ID
Angular uses the Unicode locale identifier (Unicode locale ID) to find the correct locale data for internationalization of text strings. A locale ID specifies the language, country, and an optional code for further variants or subdivisions. A locale ID consists of the language identifier, a hyphen (-) character, and the locale extension. By default, Angular uses `en-US` as the source locale of your project.
Visit the following resources to learn more:
- [@official@Angular Official Docs - Refer to locales by ID](https://angular.dev/guide/i18n/locale-id)
- [@opensource@Angular locales](https://github.com/angular/angular/tree/main/packages/common/locales)
- [@official@Codes arranged alphabetically by alpha-3/ISO 639-2 Code](https://www.loc.gov/standards/iso639-2/php/code_list.php)
- [@official@Unicode CLDR Specifications](https://cldr.unicode.org/index/cldr-spec)

@ -1 +1,9 @@
# Localize Package
To take advantage of the localization features of Angular, use the Angular CLI to add the `@angular/localize` package to your project. If `@angular/localize` is not installed and you try to build a localized version of your project (for example, while using the i18n attributes in templates), the Angular CLI will generate an error, which would contain the steps that you can take to enable i18n for your project.
Visit the following resources to learn more:
- [@official@Angular Official Docs - Add the localize package](https://angular.dev/guide/i18n/add-package)
- [@video@Learn to Internationalize Your Angular Apps with @angular/localize](https://www.youtube.com/watch?v=5h7HPY1OMfU)
- [@video@Multi-Language Support in Angular: A Guide to Localization and Internationalization](https://www.youtube.com/watch?v=ouI21AyJ9tE)

@ -6,5 +6,5 @@ Use pipes to transform strings, currency amounts, dates, and other data for disp
Visit the following resources to learn more:
- [@official@Understanding Pipes](https://angular.dev/guide/pipes)
- [@official@Understanding Pipes](https://angular.dev/tutorials/learn-angular/22-pipes)
- [@article@BuiltIn Pipes - examples](https://codecraft.tv/courses/angular/pipes/built-in-pipes/)

@ -1,3 +1,13 @@
# Testing Angular Apps
In any software development process, Testing the application plays a vital role. If Bugs and crashes are not figured out and solved they can defame the development company as well as hurt the clients too. But, Angular’s architecture comes with built-in testability features. As soon as you create a new project with Angular CLI, two essential testing tools are installed.They are: Jasmine and Karma. Jasmine is the testing library which structures individual tests into specifications (“specs”) and suites. And Karma is the test runner, which enables the different browsers to run the tests mentioned by Jasmine and the browsers will finally report the test results back.
In any software development process, testing the application plays a vital role. If bugs and crashes are not figured out and solved they can defame the development company as well as hurt the clients too. But, Angular’s architecture comes with built-in testability features. As soon as you create a new project with Angular CLI, two essential testing tools are installed. They are: Jasmine and Karma. Jasmine is the testing library which structures individual tests into specifications (“specs”) and suites. And Karma is the test runner, which enables the different browsers to run the tests mentioned by Jasmine and the browsers will finally report the test results back.
You can also unit test an Angular application with other testing libraries and test runners. Each library and runner has its own distinctive installation procedures, configuration, and syntax.
Visit the following resources to learn more:
- [@official@Angular Official Docs - Testing](https://angular.dev/guide/testing)
- [@official@Jasmine Official Docs](https://jasmine.github.io/)
- [@official@Karma Official Docs](https://karma-runner.github.io/latest/index.html)
- [@article@Testing Angular - A Guide to Robust Angular Applications](https://testing-angular.com/)
- [@video@Introduction | Angular Unit Testing Made Easy: A Comprehensive Introduction](https://www.youtube.com/watch?v=emnwsVy8wRs)

@ -2,21 +2,20 @@
In RxJS, "transformation" refers to the process of modifying or manipulating the data emitted by an Observable. There are a variety of methods available in RxJS that can be used to transform the data emitted by an Observable, including:
- map: applies a function to each item emitted by the Observable and emits the resulting value
- mergeMap: applies a function to each item emitted by the Observable, and then merges the resulting Observables into a single Observable
- switchMap: applies a function to each item emitted by the Observable, and then switches to the latest resulting Observable
- concatMap: applies a function to each item emitted by the Observable, and then concatenates the resulting Observables into a single Observable
- exhaustMap: applies a function to each item emitted by the Observable, but ignores subsequent emissions until the current Observable completes
- **map**: applies a function to each item emitted by the Observable and emits the resulting value
- **mergeMap**: applies a function to each item emitted by the Observable, and then merges the resulting Observables into a single Observable
- **switchMap**: applies a function to each item emitted by the Observable, and then switches to the latest resulting Observable
- **concatMap**: applies a function to each item emitted by the Observable, and then concatenates the resulting Observables into a single Observable
- **exhaustMap**: applies a function to each item emitted by the Observable, but ignores subsequent emissions until the current Observable completes
These are just a few examples of the many methods available in RxJS for transforming the data emitted by an Observable. Each method has its own specific use case, and the best method to use will depend on the requirements of your application.
Here are the official documentation links for the RxJS transformation methods:
Visit the following resources to learn more:
- [@official@RxJs Docs - Operators](https://rxjs.dev/api/operators)
- [@official@map](https://rxjs.dev/api/operators/map)
- [@official@mergeMap](https://rxjs.dev/api/operators/mergeMap)
- [@official@switchMap](https://rxjs.dev/api/operators/switchMap)
- [@official@concatMap](https://rxjs.dev/api/operators/concatMap)
- [@official@exhaustMap](https://rxjs.dev/api/operators/exhaustMap)
- [@video@switchMap vs mergeMap vs concatMap vs exhaustMap practical guide](https://youtu.be/40pC5wHowWw)
You can find more information and examples on these methods in the official RxJS documentation. Additionally, you can find more operators on https://rxjs.dev/api/operators and you can also find more information on the library as a whole on https://rxjs.dev/

@ -1 +1,9 @@
# Translation Files
After you prepare a component for translation, use the `extract-i18n` Angular CLI command to extract the marked text in the component into a source language file. The marked text includes text marked with `i18n`, attributes marked with `i18n`-attribute, and text tagged with `$localize`. The `extract-i18n` command creates a source language file named `messages.xlf` in the root directory of your project. If you have multiple language files, add the locale to the file name, like `messages.{locale}.xlf`.
Visit the following resources to learn more:
- [@official@Angular Official Docs - Translation Files](https://angular.dev/guide/i18n/translation-files)
- [@official@Angular Official Docs - Extract i18n](https://angular.dev/cli/extract-i18n)
- [@article@Angular i18n: internationalization & localization with examples](https://lokalise.com/blog/angular-i18n/)

@ -1 +1,11 @@
# Typed Forms
Since Angular 14, reactive forms are strictly typed by default. You don't have to define extra custom types or add a ton of type annotations to your form declarations to benefit from this extra type safety, as Angular will infer types from the default value of a form control. Non-typed forms are still supported. To use them, you must import the `Untyped` symbols from `@angular/forms`.
Visit the following resources to learn more:
- [@official@Angular Official Docs - @let](https://angular.dev/api/core/@let)
- [@article@Angular Strictly Typed Forms (Complete Guide)](https://blog.angular-university.io/angular-typed-forms/)
- [@video@Getting started with typed reactive forms in Angular](https://www.youtube.com/watch?v=mT3UR0TdDnU)
- [@video@Angular TYPED Forms: Are You Using Them Correctly?](https://www.youtube.com/watch?v=it2BZoIvBPc)
- [@video@Knowing this makes Angular typed forms WAY less awkward](https://www.youtube.com/watch?v=xpRlijg6spo)

@ -1 +1,8 @@
# Using Libraries
Libraries are published as `npm packages`, usually together with schematics that integrate them with the Angular CLI. To integrate reusable library code into an application, you need to install the package and import the provided functionality in the location you use it. For most published Angular libraries, use the `ng add <lib_name>` Angular CLI command. A published library typically provides a `README` file or other documentation on how to add that library to your application. A library is able to be updated by the publisher, and also has individual dependencies which need to be kept current. To check for updates to your installed libraries, use the `ng update` Angular CLI command.
Visit the following resources to learn more:
- [@official@Angular Official Docs - Using Libraries](https://angular.dev/tools/libraries/using-libraries)
- [@official@npm](https://www.npmjs.com/)

@ -4,6 +4,7 @@ AWS (Amazon Web Services) offers a broad set of global cloud-based products incl
Learn more from the following links:
- [@article@How to create an AWS Account](https://grapplingdev.com/tutorials/how-to-create-aws-account)
- [@article@AWS Documentation](https://docs.aws.amazon.com/)
- [@article@Introduction of AWS](https://docs.aws.amazon.com/whitepapers/latest/aws-overview/introduction.html)
- [@video@AWS Tutorial for Beginners](https://www.youtube.com/watch?v=zA8guDqfv40)

@ -4,4 +4,5 @@ Data replication is the process by which data residing on a physical/virtual ser
Visit the following resources to learn more:
- [@article@What is data replication?](https://www.ibm.com/topics/data-replication)
- [@video@What is Data Replication?](https://youtu.be/fUrKt-AQYtE)

@ -4,5 +4,6 @@ An index is a data structure that you build and assign on top of an existing tab
Visit the following resources to learn more:
- [@article@Database index - Wikipedia](https://en.wikipedia.org/wiki/Database_index)
- [@video@Database Indexing Explained](https://www.youtube.com/watch?v=-qNSXK7s7_w)
- [@feed@Explore top posts about Database](https://app.daily.dev/tags/database?ref=roadmapsh)

@ -1,19 +1,11 @@
# JavaScript
Apart from being used in the browser, JavaScript is also used in backend e.g. using [Node.js](https://nodejs.org/) or [Deno](https://deno.land/) for writing server-side code in JavaScript.
If you pick up JavaScript for the Backend, my personal recommendation would be to learn [JavaScript](/javascript) and then go with [Node.js](/nodejs) as it is the most popular and widely used option. Also, I would recommend learning TypeScript later on as you continue with your backend development Journey; it's a superset of JavaScript and is used in many projects.
JavaScript allows you to add interactivity to your pages. Common examples that you may have seen on the websites are sliders, click interactions, popups and so on.
Visit the following resources to learn more:
- [@roadmap@Visit Dedicated JavaScript Roadmap](/javascript)
- [@article@W3Schools – JavaScript Tutorial](https://www.w3schools.com/js/)
- [@article@The Modern JavaScript Tutorial](https://javascript.info/)
- [@article@Eloquent Javascript - Book](https://eloquentjavascript.net/)
- [@opensource@You Dont Know JS Yet (book series) ](https://github.com/getify/You-Dont-Know-JS)
- [@video@JavaScript Crash Course for Beginners](https://youtu.be/hdI2bqOjy3c)
- [@roadmap@Visit Dedicated Node.js Roadmap](/nodejs)
- [@video@Node.js Crash Course](https://www.youtube.com/watch?v=fBNz5xF-Kx4)
- [@video@Node.js Tutorial for Beginners](https://www.youtube.com/watch?v=TlB_eWDSMt4)
- [@official@Official JavaScript Documentation](https://www.javascript.com/)
- [@video@JavaScript Crash Course for Beginners](https://youtu.be/hdI2bqOjy3c?t=2)
- [@article@Build 30 Javascript projects in 30 days](https://javascript30.com/)
- [@feed@Explore top posts about JavaScript](https://app.daily.dev/tags/javascript?ref=roadmapsh)

@ -5,6 +5,5 @@ Object-Relational Mapping (ORM) is a technique that lets you query and manipulat
Visit the following resources to learn more:
- [@article@Object Relational Mapping - Wikipedia](https://en.wikipedia.org/wiki/Object–relational_mapping)
- [@article@What is an ORM and how should I use it?](https://stackoverflow.com/questions/1279613/what-is-an-orm-how-does-it-work-and-how-should-i-use-one)
- [@article@What is an ORM, how does it work, and how should I use one?](https://stackoverflow.com/a/1279678)
- [@feed@Explore top posts about Backend Development](https://app.daily.dev/tags/backend?ref=roadmapsh)

@ -7157,7 +7157,7 @@
},
"selected": false,
"data": {
"label": "Porcesses and Threads",
"label": "Processes and Threads",
"style": {
"fontSize": 17,
"justifyContent": "flex-start",

@ -0,0 +1,8 @@
# ACL
An Access Control List (ACL) is a security mechanism used to define which users or system processes are granted access to objects, such as files, directories, or network resources, and what operations they can perform on those objects. ACLs function by maintaining a list of permissions attached to each object, specifying the access rights of various entities—like users, groups, or network traffic—thereby providing fine-grained control over who can read, write, execute, or modify the resources. This method is essential in enforcing security policies, reducing unauthorized access, and ensuring that only legitimate users can interact with sensitive data or systems.
Learn more from the following resources:
- [@article@Access Control List: Definition, Types & Usages](https://www.okta.com/uk/identity-101/access-control-list/)
- [@video@Access Control Lists](https://www.youtube.com/watch?v=IwLyr0mKK1w)

@ -1,39 +1,8 @@
# ACLs
Access Control Lists (ACLs) act as an essential part of an organization's security infrastructure by helping to manage access rights to resources and maintain security between users, groups, and systems.
An Access Control List (ACL) is a security mechanism used to define which users or system processes are granted access to objects, such as files, directories, or network resources, and what operations they can perform on those objects. ACLs function by maintaining a list of permissions attached to each object, specifying the access rights of various entities—like users, groups, or network traffic—thereby providing fine-grained control over who can read, write, execute, or modify the resources. This method is essential in enforcing security policies, reducing unauthorized access, and ensuring that only legitimate users can interact with sensitive data or systems.
In this section, we will discuss the following:
Learn more from the following resources:
- What are Access Control Lists
- Types of ACLs
- How to implement and administer ACLs
## What are Access Control Lists
Access Control Lists are rule sets that define which user, group, or system has access to specific resources and determine what type of access they have (e.g., read or write). ACLs act as a barrier to prevent unauthorized access to sensitive data and systems; this can help maintain confidentiality, integrity, and availability of your organization's critical assets.
## Types of ACLs
There are two primary types of ACLs: Discretionary and Mandatory.
- **Discretionary Access Control Lists (DACLs)**
DACLs allow the owner of a resource to determine who can gain access to the resource, and the level of access they can have. For example, a user or a group of users may have read access rights to a particular file, whereas another group may have full control over the file.
- **Mandatory Access Control Lists (MACLs)**
MACLs rely on predefined security labels or classifications to enforce access control. In this case, resources are assigned security labels, and users or systems are given security clearances. Access is granted only if the user's security clearance level matches the resource label.
## Implementing and Administering ACLs
Here are some best practices you can follow when implementing and administering Access Control Lists:
- **Define clear access policies**: Establish clear rules and guidelines for accessing resources, such as who can access specific resources and what type of access they can have.
- **Use Role-Based Access Control (RBAC)**: Assign permissions to roles instead of individual users. This will help simplify the ACL management process.
- **Regular audits and reviews**: Periodically review and update the ACLs to ensure that access permissions are aligned with business requirements and security policies.
- **Apply the principle of least privilege**: Grant users the minimum privileges they need to perform their tasks.
- **Maintain a change management process**: Document all changes to ACLs, including the date of change, the reason for the change, and the individual responsible for executing the change.
Remember that a well-implemented and maintained ACL system can significantly reduce the risks associated with unauthorized access to your organization's critical assets.
- [@article@Access Control List: Definition, Types & Usages](https://www.okta.com/uk/identity-101/access-control-list/)
- [@video@Access Control Lists](https://www.youtube.com/watch?v=IwLyr0mKK1w)

@ -0,0 +1,8 @@
# Anti-malware
Anti-malware is a type of software designed to detect, prevent, and remove malicious software, such as viruses, worms, trojans, ransomware, and spyware, from computer systems. By continuously scanning files, applications, and incoming data, anti-malware solutions protect devices from a wide range of threats that can compromise system integrity, steal sensitive information, or disrupt operations. Advanced anti-malware programs utilize real-time monitoring, heuristic analysis, and behavioral detection techniques to identify and neutralize both known and emerging threats, ensuring that systems remain secure against evolving cyber attacks.
Learn more from the following resources:
- [@video@How Does Antivirus and Antimalware Software Work?](https://www.youtube.com/watch?v=bTU1jbVXlmM)
- [@article@What is antimalware?](https://riskxchange.co/1006974/cybersecurity-what-is-anti-malware/)

@ -0,0 +1,8 @@
# Antivirus
Antivirus software is a specialized program designed to detect, prevent, and remove malicious software, such as viruses, worms, and trojans, from computer systems. It works by scanning files and programs for known malware signatures, monitoring system behavior for suspicious activity, and providing real-time protection against potential threats. Regular updates are essential for antivirus software to recognize and defend against the latest threats. While it is a critical component of cybersecurity, antivirus solutions are often part of a broader security strategy that includes firewalls, anti-malware tools, and user education to protect against a wide range of cyber threats.
Learn more from the following resources:
- [@video@What is an antivirus and how does it keep us safe?](https://www.youtube.com/watch?v=jW626WMWNAE)
- [@article@What is antivirus software?](https://www.webroot.com/gb/en/resources/tips-articles/what-is-anti-virus-software)

@ -0,0 +1,8 @@
# ANY.RUN
ANY.RUN is an interactive online malware analysis platform that allows users to safely execute and analyze suspicious files and URLs in a controlled, virtualized environment. This sandbox service provides real-time insights into the behavior of potentially malicious software, such as how it interacts with the system, what files it modifies, and what network connections it attempts to make. Users can observe and control the analysis process, making it a valuable tool for cybersecurity professionals to identify and understand new threats, assess their impact, and develop appropriate countermeasures. ANY.RUN is particularly useful for dynamic analysis, enabling a deeper understanding of malware behavior in real-time.
Learn more from the following resources:
- [@official@ANY.RUN Website](https://any.run/)
- [@video@Malware analysis with ANY.RUN](https://www.youtube.com/watch?v=QH_u7DHKzzI)

@ -2,26 +2,7 @@
Advanced Persistent Threats, or APTs, are a class of cyber threats characterized by their persistence over a long period, extensive resources, and high level of sophistication. Often associated with nation-state actors, organized cybercrime groups, and well-funded hackers, APTs are primarily focused on targeting high-value assets, such as critical infrastructure, financial systems, and government agencies.
## Key Aspects of APT
- **Persistence**: APTs are designed to maintain a low profile and operate under the radar for extended periods. Hackers use advanced techniques to maintain access and control over their targets, and continually adapt and evolve in order to avoid being discovered.
- **Sophistication**: APTs are known for employing a wide range of techniques and tactics to infiltrate and exploit their targets, including zero-day vulnerabilities, spear-phishing, social engineering, and advanced malware. The level of expertise behind APTs is typically higher than your average cybercriminal.
- **Motivation**: APTs often have significant resources behind them, which allows for sustained cyber campaigns against specific targets. The motivation can be monetary gain, espionage, or even maintaining a competitive edge in the marketplace. APTs can also be used to sow chaos and destabilize geopolitical rivals.
## Detecting and Mitigating APTs
Due to the sophisticated and persistent nature of APTs, they can be challenging to detect and protect against. However, implementing several best practices can help organizations mitigate the risk and impact of APTs:
- Adopt a proactive approach to cyber security, including continuous network monitoring, threat hunting, and regular assessments.
- Implement a robust set of defense-in-depth security measures, including intrusion detection systems (IDS), firewalls, and access controls.
- Train employees on cybersecurity awareness and how to spot and respond to cyber threats.
- Keep systems updated and patched to prevent exploitation of known vulnerabilities.
- Employ advanced threat intelligence solutions to identify and anticipate potential APT campaigns.
APT attacks can be damaging and disruptive to organizations, but understanding the nature of these threats and implementing a comprehensive security strategy can help minimize the risk and protect valuable assets. Remember, APTs are not just a concern for large enterprises and governments; organizations of all sizes can be targeted. Staying vigilant and proactive is key to staying safe from these advanced threats.
Learn more from the following resources:
- [@article@What Are Advanced Persistent Threats? - IBM](https://www.ibm.com/topics/advanced-persistent-threats)
- [@video@What is an Advanced Persistent Threat?](https://www.youtube.com/watch?v=sGthMsDlqew)
- [@article@Advanced Persistent Threat (APT)](https://www.crowdstrike.com/cybersecurity-101/advanced-persistent-threat-apt/)

@ -2,18 +2,11 @@
ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network.
## How It Works
When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address.
The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.
## Security Concerns
While ARP is crucial for the functioning of most networks, it also presents certain security risks. ARP poisoning, for example, occurs when an attacker sends fake ARP messages with the goal to associate their MAC address with the IP address of a target device. This can lead to Man-in-the-Middle (MITM) attacks where the attacker can intercept, modify, or block traffic intended for the target device.
To mitigate ARP poisoning attacks, organizations can implement security measures such as static ARP entries, dynamic ARP inspection, and ensuring that their network devices are updated with the latest security patches.
By understanding ARP and the potential security risks it presents, you can help protect your network by incorporating appropriate security solutions and staying vigilant against potential threats.
Learn more from the following resources:
- [@video@ARP Explained - Address Resolution Protocol](https://www.youtube.com/watch?v=cn8Zxh9bPio)
- [@video@ARP Explained](https://www.youtube.com/watch?v=cn8Zxh9bPio)
- [@article@What is Address Resolution Protocol?](https://www.fortinet.com/resources/cyberglossary/what-is-arp)

@ -2,18 +2,11 @@
ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network.
## How It Works
When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address.
The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.
## Security Concerns
While ARP is crucial for the functioning of most networks, it also presents certain security risks. ARP poisoning, for example, occurs when an attacker sends fake ARP messages with the goal to associate their MAC address with the IP address of a target device. This can lead to Man-in-the-Middle (MITM) attacks where the attacker can intercept, modify, or block traffic intended for the target device.
To mitigate ARP poisoning attacks, organizations can implement security measures such as static ARP entries, dynamic ARP inspection, and ensuring that their network devices are updated with the latest security patches.
By understanding ARP and the potential security risks it presents, you can help protect your network by incorporating appropriate security solutions and staying vigilant against potential threats.
Learn more from the following resources:
- [@video@ARP Explained - Address Resolution Protocol](https://www.youtube.com/watch?v=cn8Zxh9bPio)
- [@video@ARP Explained](https://www.youtube.com/watch?v=cn8Zxh9bPio)
- [@article@What is Address Resolution Protocol?](https://www.fortinet.com/resources/cyberglossary/what-is-arp)

@ -1,32 +1,12 @@
# arp
# ARP
ARP is a crucial network protocol used to map IP addresses to their corresponding MAC (Media Access Control) addresses. This mapping is crucial, as devices on a network use MAC addresses to communicate with one another. As IP addresses are easier to remember and utilize for humans, ARP helps in converting these logical addresses to physical addresses that devices can understand.
ARP is a protocol used by the Internet Protocol (IP) to map an IP address to a physical address, also known as a Media Access Control (MAC) address. ARP is essential for routing data between devices in a Local Area Network (LAN) as it allows for the translation of IP addresses to specific hardware on the network.
## Why ARP is important
When a device wants to communicate with another device on the same LAN, it needs to determine the corresponding MAC address for the target IP address. ARP helps in this process by broadcasting an ARP request containing the target IP address. All devices within the broadcast domain receive this ARP request and compare the target IP address with their own IP address. If a match is found, the device with the matching IP address sends an ARP reply which contains its MAC address.
In a network, when a device wants to send data to another device, it needs to know the recipient's MAC address. If the sender only knows the IP address, it can use ARP to determine the corresponding MAC address. The mapping is stored in the device's ARP cache, which holds a record of both the IP and MAC addresses. This allows devices to quickly identify and communicate with others on the network.
The device that initiated the ARP request can now update its ARP cache (a table that stores IP-to-MAC mappings) with the new information, and then proceed to send data to the target's MAC address.
## ARP Request and Reply
Learn more from the following resources:
Here are the basic steps involved in the ARP process:
- The sender creates an ARP request packet with its own IP and MAC addresses, and the recipient's IP address. The packet is broadcast to all devices on the local network.
- Each device on the network receives the ARP request, checks if the IP address is its own, and replies to the sender as needed.
- The sender receives the ARP reply containing the recipient's MAC address and updates its ARP cache with the new information.
- Finally, the sender uses the MAC address to transmit data packets to the intended recipient.
## Troubleshooting with ARP
If you're having issues with network communication or want to investigate your network, the ARP table can be a helpful tool. You can view your device's ARP cache using commands specific to your operating system:
- **Windows**: Open Command Prompt and type `arp -a`
- **Linux**: Open Terminal and type `arp`
- **macOS**: Open Terminal and type `arp -a`
The output will display the IP and MAC addresses of devices on the network that the system has interacted with.
## ARP Spoofing and Security Concerns
As crucial as ARP is, it can be exploited by attackers for malicious purposes. ARP spoofing, also known as ARP poisoning, is a form of cyberattack in which an attacker sends fake ARP requests to a network to link their MAC address with an IP address that legitimately belongs to another device. This enables the attacker to intercept and manipulate network traffic or launch denial-of-service (DoS) attacks.
To mitigate ARP spoofing, consider implementing security measures such as monitoring ARP traffic, using a static ARP table, or employing security solutions like intrusion detection and prevention systems. Additionally, maintaining a secure and up-to-date network infrastructure can help reduce potential vulnerabilities.
- [@video@ARP Explained](https://www.youtube.com/watch?v=cn8Zxh9bPio)
- [@article@What is Address Resolution Protocol?](https://www.fortinet.com/resources/cyberglossary/what-is-arp)

@ -2,35 +2,7 @@
Autopsy is a versatile and powerful open-source digital forensics platform that is primarily used for incident response, cyber security investigations, and data recovery. As an investigator, you can utilize Autopsy to quickly and efficiently analyze a compromised system, extract crucial artifacts, and generate comprehensive reports. Integrated with The Sleuth Kit and other plug-ins, Autopsy allows examiners to automate tasks and dig deep into a system's structure to discover the root cause of an incident.
## Features of Autopsy
Learn more from the following resources:
- **Central Repository**: Autopsy features a central repository that allows analysts to store and manage case data, ingest modules, and collaborate with other team members. This functionality streamlines the investigation process with effective communication, data sharing, and collaborative analysis.
- **Intuitive Interface**: Autopsy's graphical user interface (GUI) is user-friendly and well organized. It presents the results in a structured and easy-to-navigate layout, showcasing file systems, metadata, and text strings from binary files.
- **File System Support**: Autopsy natively supports multiple file systems like FAT12, FAT16, FAT32, NTFS, ext2, ext3, ext4, UFS1, UFS2, and more, making it an ideal solution for analyzing different storage devices.
- **Timeline Analysis**: The Timeline feature in Autopsy allows analysts to visualize and explore the chronological sequence of file system events. This can be essential in understanding the chain of events during an incident and identifying suspicious activities or anomalies.
- **Keyword Search**: Autopsy's keyword search function is an invaluable tool for locating artifacts of interest using keywords or regular expressions. Investigators can identify incriminating documents, emails or other files by searching for specific terms, phrases, or patterns.
- **Integration with Other Tools**: Autopsy's modular design enables seamless integration with various digital forensics tools, facilitating the analysis with specialized features and functions, such as Volatility for memory analysis or PLASO for log parsing.
## Installation and Usage
Autopsy is available for download from its official website, [www.autopsy.com/download/](https://www.autopsy.com/download/), and can be installed on Windows, Linux, and macOS platforms.
Once installed, creating a new case is easy. Follow these basic steps:
- Launch Autopsy.
- Click on the "New Case" button.
- Provide a case name, case number, examiner, and case directory.
- Add a data source (e.g., a disk image, local folder, or cloud storage) to the case.
- Configure data ingestion options and select specific modules of interest.
- Click on "Finish" to begin the data analysis.
As Autopsy completes its analysis, it will generate a comprehensive report that can be utilized for internal reporting, maintaining case records, or presenting evidence in legal proceedings.
## Conclusion
In conclusion, Autopsy is a valuable tool for incident response and digital forensics professionals. By mastering its functions and capabilities, you can enhance your capabilities in incident investigations, data recovery, and threat attribution.
- [@official@Autopsy Website](https://www.autopsy.com/)
- [@video@Disk analysis with Autopsy](https://www.youtube.com/watch?v=o6boK9dG-Lc&t=236s)

@ -2,56 +2,6 @@
Amazon Web Services (AWS) is a leading cloud computing platform provided by Amazon. Launched in 2006, AWS offers an extensive range of on-demand IT services, such as computing power, storage, databases, networking, and security, which enable organizations to develop, deploy, and scale applications and infrastructure quickly and cost-effectively.
## Key AWS Services
Learn more from the following resources:
AWS provides over 200 different services, with new ones being added regularly. Some of the most important and commonly used services include:
## Compute
- **EC2 (Elastic Compute Cloud):** A virtual server that can be customized to suit various workloads and applications. Instances can be scaled up or down as needed.
- **Lambda:** A serverless computing service that enables you to run your code in response to events or HTTP requests without provisioning or managing servers.
## Storage
- **S3 (Simple Storage Service):** A scalable object storage service that allows you to store and retrieve files, such as documents, images, and videos.
- **EBS (Elastic Block Store):** A block storage solution used with EC2 instances for persistent storage.
- **Glacier:** A low-cost archiving solution used for long-term storage and data backup.
## Databases
- **RDS (Relational Database Service):** A managed service for hosting, scaling, and backing up relational databases, such as MySQL, PostgreSQL, and Oracle.
- **DynamoDB:** A managed NoSQL database service, designed for applications that need fast, consistent performance at any scale.
## Networking
- **VPC (Virtual Private Cloud):** Provides a virtual network for your AWS resources, enabling you to control and isolate your cloud environment.
- **Route 53:** A Domain Name System (DNS) web service that allows you to manage domain registration and routing policies.
## Security, Identity, and Compliance
- **IAM (Identity and Access Management):** Provides centralized control over AWS resource access and user permissions, enabling secure access management for your resources.
- **Cognito:** A user identity and data synchronization service that allows you to authenticate and manage users in your applications.
## Benefits of AWS
There are several reasons why AWS is widely used and trusted:
- **Scalability:** AWS services are designed to scale with the growing needs of your business. You can adjust resources as needed without any upfront investment.
- **Flexibility:** AWS supports a wide array of operating systems, programming languages, and tools, making it easy to migrate existing applications or develop new ones.
- **Cost-effective:** AWS follows a pay-as-you-go model, allowing you to pay only for the services and resources you use, eliminating upfront expenses.
- **Security:** AWS has robust security features, such as data encryption, multi-factor authentication, and infrastructure security measures, ensuring that your data and applications remain secure.
- **Global Presence:** With data centers across the globe, AWS enables you to serve your customers with low latency and maintain business continuity.
As a part of your cybersecurity strategy, it’s crucial to understand and securely configure your AWS environment. Secure your cloud infrastructure by adhering to AWS best practices, implementing access controls, and regularly monitoring for vulnerabilities.
For more information on securing your AWS environment, refer to the [AWS Well-Architected Framework](https://aws.amazon.com/architecture/well-architected/) and the [AWS Security Best Practices](https://d1.awsstatic.com/whitepapers/Security/AWS_Security_Best_Practices.pdf) whitepapers.
- [@course@AWS Complete Tutorial](https://www.youtube.com/watch?v=B8i49C8fC3E)

@ -1,41 +1,9 @@
# Bash
Bash (**B**ourne **A**gain **Sh**ell) is a widely-used Unix shell and scripting language that acts as a command-line interface for executing commands and organizing files on your computer. It allows users to interact with the system's operating system by typing text commands, serving as an alternative to the graphical user interface (GUI). Bash, created as a free and improved version of the original Bourne Shell (`sh`), is the default shell in many Unix-based systems, including Linux, macOS, and the Windows Subsystem for Linux (WSL).
Bash (Bourne Again Shell) is a widely-used Unix shell and scripting language that acts as a command-line interface for executing commands and organizing files on your computer. It allows users to interact with the system's operating system by typing text commands, serving as an alternative to the graphical user interface (GUI). Bash, created as a free and improved version of the original Bourne Shell (`sh`), is the default shell in many Unix-based systems, including Linux, macOS, and the Windows Subsystem for Linux (WSL).
## Bash Scripting
Learn more from the following resources:
Bash scripting is an essential skill for anyone engaged in cyber security. It allows you to automate simple tasks, monitor system activities, and manage multiple files and directories with ease. With Bash scripts, you can develop tools, automate repetitive tasks, or even develop security testing tools.
## Key Features
- **Variables**: Variables can store data in the form of strings or numbers, which can be used and manipulated throughout your script.
- **Control Structures**: Bash supports loops (`for`, `while`) and conditional statements (`if`, `case`) to build more robust scripts with decision-making capabilities.
- **Functions**: Create reusable code blocks that can be called with specified parameters, making your script more modular and easier to maintain.
- **User Input**: Bash scripts allow you to interact with the user by accepting input or choosing options.
- **File Management**: Create, modify, or analyze files using built-in commands such as `ls`, `cp`, `mkdir`, and `grep`.
## Learning Bash
As a cyber security expert, having a strong foundation in Bash can save you time and help you better understand the inner workings of a system. Invest time in learning Bash essentials, such as basic commands, file manipulation, scripting, and processing text data.
- Basic Commands: Start by learning some of the most commonly used Bash commands: `cd`, `mv`, `cp`, `rm`, `grep`, `find`, `sort`, etc.
- File and Directory Management: Explore the use of commands, like `mkdir`, `rmdir`, `touch`, `chmod`, `chown`, and `ln`, to create, modify, and delete files and directories.
- Text Processing: Learn to use commands like `cat`, `less`, `head`, `tail`, and `awk` to analyze and manipulate text data.
- Scripting: Start by understanding the syntax and structure of Bash scripts, and learn how to create, debug, and execute scripts.
Some resources to begin your journey with Bash are:
- [@article@GNU Bash Manual](https://www.gnu.org/software/bash/manual/bash.html): A comprehensive guide to Bash, provided by the GNU project.
- [@article@Bash Beginner's Guide](http://www.tldp.org/LDP/Bash-Beginners-Guide/html/): A beginner-friendly guide that covers the basics of Bash scripting.
- [@official@Bash Academy](https://www.bash.academy/): An interactive platform to start learning Bash from scratch.
- [@article@Learn Shell](https://www.learnshell.org/): An online resource with tutorials and exercises to help you practice your Bash skills.
- [@feed@Explore top posts about Bash](https://app.daily.dev/tags/bash?ref=roadmapsh)
Bash scripting is a versatile tool in the cybersecurity toolkit, and mastering it will provide you with greater control over the systems you protect.
- [@video@Bash in 100 Seconds](https://www.youtube.com/watch?v=I4EWvMFj37g)
- [@course@Beginners Guide To The Bash Terminal](https://www.youtube.com/watch?v=oxuRxtrO2Ag)
- [@course@Start learning bash](https://linuxhandbook.com/bash/)

@ -1,39 +1,12 @@
# Basics and Concepts of Threat Hunting
Threat hunting is the proactive process of identifying and mitigating potential threats and vulnerabilities within a network, before they can be exploited by an attacker. To perform effective threat hunting, security professionals must use their knowledge, skills, and the latest threat intelligence to actively search for previously undetected adversaries and suspicious activities within a network.
Threat hunting is a proactive approach to cybersecurity where security professionals actively search for hidden threats or adversaries that may have bypassed traditional security measures, such as firewalls and intrusion detection systems. Rather than waiting for automated tools to flag suspicious activity, threat hunters use a combination of human intuition, threat intelligence, and advanced analysis techniques to identify indicators of compromise (IoCs) and potential threats within a network or system.
## Key Objectives of Threat Hunting
The process involves several key concepts, starting with a **hypothesis**, where a hunter develops a theory about potential vulnerabilities or attack vectors that could be exploited. They then conduct a **search** through logs, traffic data, or endpoint activity to look for anomalies or patterns that may indicate malicious behavior. **Data analysis** is central to threat hunting, as hunters analyze vast amounts of network and system data to uncover subtle signs of attacks or compromises. If threats are found, the findings lead to **detection and mitigation**, allowing the security team to contain the threat, remove malicious entities, and prevent similar incidents in the future.
- **Detect**: Identify unknown threats and suspicious behavior that traditional security tools may miss.
- **Contain**: Quickly isolate and remediate threats before they can cause significant damage.
- **Learn**: Gather valuable insights about the adversary, their techniques, and the effectiveness of existing security measures.
Threat hunting also involves **continuous learning** and adapting, as hunters refine their techniques based on evolving attack methods and the latest threat intelligence. This approach improves an organization’s overall security posture by identifying sophisticated or previously unknown threats that might evade conventional security measures.
## Threat Hunting Techniques
Learn more from the following resources:
There are several practical approaches to threat hunting, such as:
- **Hypothesis-driven hunting**: Develop hypotheses about potential threats and validate them through data analysis and investigation.
- **Indicator of Compromise (IoC) hunting**: Leverage existing threat intelligence and IoCs to search for matches within your environment.
- **Machine learning-driven hunting**: Utilize algorithms and advanced analytics tools to automatically detect anomalies and other suspicious patterns of behavior.
- **Situational awareness hunting**: Understand the normal behavior and baseline of the environment and look for deviations that may indicate malicious activity.
## Tools & Technologies for Threat Hunting
Some common tools and technologies used for threat hunting include:
- **Security information and event management (SIEM) systems**: Provide a centralized platform for detecting, alerting, and investigating security incidents and events.
- **Endpoint detection and response (EDR) solutions**: Deliver real-time monitoring, analysis, and remediation capabilities for endpoints.
- **Threat intelligence platforms (TIPs)**: Aggregate and analyze global threat data and indicators of compromise (IoC) to provide actionable intelligence.
- **User and entity behavior analytics (UEBA) tools**: Apply advanced analytics algorithms to detect potential threats by analyzing the behavior of users, devices, and applications.
## Essential Skills for Threat Hunters
Successful threat hunters should possess a strong combination of technical skills, critical thinking, and situational awareness. Some essential skills include:
- **Understanding of networks and protocols**: Deep knowledge of network architecture, protocols, and communication patterns.
- **Familiarity with operating systems**: Ability to navigate, investigate, and analyze various operating systems, including Windows, Linux, and macOS.
- **Scripting and programming**: Proficiency in scripting languages (e.g., Python, PowerShell) and automation tools to streamline the threat hunting process.
- **Knowledge of common attacker tactics, techniques, and procedures (TTPs)**: Awareness of the latest TTPs, ensuring that you stay ahead of potential threats.
- **Critical thinking and problem-solving**: Ability to analyze complex scenarios and think creatively to identify potential threats and vulnerabilities.
By developing a strong foundation in threat hunting concepts and techniques, security professionals are better equipped to proactively identify and mitigate potential attacks, thereby strengthening their organization's overall cybersecurity posture.
- [@article@What is Threat Hunting](https://www.ibm.com/topics/threat-hunting)
- [@video@Cyber Security Threat Hunting explained](https://www.youtube.com/watch?v=VNp35Uw_bSM)

@ -1,56 +1,17 @@
# Basics of Computer Networking
Computer networking refers to the practice of connecting two or more computing devices, creating an infrastructure in which they can exchange data, resources, and software. It is a fundamental part of cyber security and IT skills. In this chapter, we will cover five aspects of computer networking, including networking devices, network types, network protocols, IP addresses, and the OSI model.
Computer networking involves connecting multiple computers and devices to share resources, such as data, applications, and internet connections. Networks can range from small local area networks (LANs) to large-scale wide area networks (WANs), such as the internet. The basic components of a network include devices (computers, servers, routers), transmission media (wired or wireless), and network protocols, which govern communication between devices.
## Networking Devices
Key concepts in networking include:
Several devices enable and facilitate communication between different devices. Common networking devices include:
1. **IP Addressing**: Every device on a network has a unique Internet Protocol (IP) address, which allows it to be identified and communicate with other devices.
2. **Subnetting**: This involves dividing a network into smaller, manageable sections to optimize performance and security.
3. **Routing**: Routers are used to forward data between different networks, ensuring that information reaches the correct destination.
4. **DNS**: The Domain Name System translates human-readable domain names into IP addresses, enabling easier navigation and communication on the internet.
5. **TCP/IP Protocol**: The Transmission Control Protocol/Internet Protocol (TCP/IP) suite is the foundation of most networks, handling how data is broken into packets, transmitted, and reassembled.
- **Hubs**: Devices that connect different devices together, transmitting data packets to all devices on the network.
- **Switches**: Similar to hubs, but transmit data packets only to specific devices instead of broadcasting to all.
- **Routers**: Devices that direct data packets between networks and provide the best path for data packets to reach their destination.
- **Firewalls**: Devices or software that monitor and filter incoming and outgoing network traffic, allowing only authorized data to pass through.
Learn more from the following resources:
## Network Types
There are various types of networks based on the distance they cover, and the number of devices they connect. A few common network types are:
- **Personal Area Network (PAN)**: Connects devices within an individual workspace, typically within a range of 10 meters.
- **Local Area Network (LAN)**: Covers a small geographical area, such as a home or office, connecting multiple computers and other devices.
- **Wide Area Network (WAN)**: Covers a larger geographical area, interconnecting different LANs, often using leased telecommunication lines or wireless links.
- **Virtual Private Network (VPN)**: A secure network established over the public internet, encrypting the data transferred and restricting access to authorized users only.
## Network Protocols
Protocols are sets of rules that govern the communication between devices within a network. Some of the most common protocols include:
- **Transmission Control Protocol (TCP)**: Ensures the reliable transmission of data and establishes connections between devices.
- **Internet Protocol (IP)**: Facilitates the transmission of data packets, assigning unique IP addresses to identify devices.
- **User Datagram Protocol (UDP)**: A lightweight, fast, but less reliable protocol compared to TCP, often used for streaming and gaming applications.
## IP Addresses
An IP address is a unique identifier assigned to every device in a network. There are two types of IP addresses:
- **IPv4**: Uses a 32-bit addressing system, allowing for approximately 4.3 billion unique IP addresses.
- **IPv6**: Uses a 128-bit addressing system, providing a significantly larger number of available IP addresses.
IP addresses can also be categorized as dynamic or static, depending on whether they change over time or remain constant for a device.
## OSI Model
The Open Systems Interconnection (OSI) model is a conceptual framework used to understand and describe how different network protocols interact. It divides networking functions into seven distinct layers:
- **Physical Layer**: Deals with the physical connection between devices, including cabling and hardware.
- **Data Link Layer**: Handles the communication between adjacent devices on the same network.
- **Network Layer**: Identifies the best route for data packets and manages IP addresses.
- **Transport Layer**: Ensures the reliable transmission of data, including error checking and flow control.
- **Session Layer**: Establishes, maintains, and terminates connections between applications on different devices.
- **Presentation Layer**: Translates data into a format that is suitable for transmission between devices.
- **Application Layer**: Represents the user interface with which applications interact.
Mastering the basics of computer networking is key to understanding and implementing effective cyber security measures. This chapter has covered essential networking concepts, but it is important to continually expand your knowledge in this ever-evolving field.
- [@article@What is Computer Networking?](https://tryhackme.com/room/whatisnetworking)
- [@video@Learn Networking in 3 hours (basics for cybersecurity and DevOps)](https://www.youtube.com/watch?v=iSOfkw_YyOU\&t=1549s)
- [@feed@Explore top posts about Networking](https://app.daily.dev/tags/networking?ref=roadmapsh)
- [@article@Networking basics - What you need to know](https://www.cisco.com/c/en/us/solutions/small-business/resource-center/networking/networking-basics.html)
- [@video@Computer Networking in 100 seconds](https://www.youtube.com/watch?v=keeqnciDVOo)
- [@video@Computer Networks: Crash Course Computer Science #28](https://www.youtube.com/watch?v=3QhU9jd03a0)

@ -6,31 +6,10 @@ When it comes to cybersecurity, detecting and preventing intrusions is crucial f
An Intrusion Detection System (IDS) is a critical security tool designed to monitor and analyze network traffic or host activities for any signs of malicious activity, policy violations, or unauthorized access attempts. Once a threat or anomaly is identified, the IDS raises an alert to the security administrator for further investigation and possible actions.
There are two types of IDS:
- **Network-Based Intrusion Detection System (NIDS)**: This type of IDS is deployed on network devices such as routers, switches, or firewalls to monitor and analyze the traffic between hosts within the network.
- **Host-Based Intrusion Detection System (HIDS)**: This type of IDS is installed on individual hosts, such as servers or workstations, to monitor and analyze the activities on that specific host.
## What is Intrusion Prevention System (IPS)?
An Intrusion Prevention System (IPS) is an advanced security solution closely related to IDS. While an IDS mainly focuses on detecting and alerting about intrusions, an IPS takes it a step further and actively works to prevent the attacks. It monitors, analyzes, and takes pre-configured automatic actions based on suspicious activities, such as blocking malicious traffic, reseting connections, or dropping malicious packets.
There are two types of IPS:
- **Network-Based Intrusion Prevention System (NIPS)**: This type of IPS is deployed in-line with network devices and closely monitors network traffic, making it possible to take actions in real-time.
- **Host-Based Intrusion Prevention System (HIPS)**: This type of IPS is installed on individual hosts and actively prevents attacks by controlling inputs and outputs on the host, restricting access to resources, and making use of application-level controls.
## Key Takeaways
- IDS and IPS are essential components of a robust cybersecurity strategy.
- IDS focuses on detecting and alerting about potential intrusions, while IPS takes it further by actively preventing and mitigating attacks.
- Network-based systems protect networks, while host-based systems protect individual hosts within a network.
- Regularly updating and configuring IDS/IPS is necessary to continually defend against evolving threats.
By understanding the basics of IDS and IPS, you can better evaluate your security needs and take the right steps to protect your network and hosts from potential intruders.
Learn more from the following resources:
- [@video@Intrusion Prevention System (IPS)](https://www.youtube.com/watch?v=7QuYupuic3Q)

@ -1,36 +1,11 @@
# Basics of NAS and SAN
Network Attached Storage (NAS) and Storage Area Network (SAN) technologies play a crucial role in managing data within an organization and serve as the building blocks for a more comprehensive IT infrastructure.
Network Attached Storage (NAS) and Storage Area Network (SAN) are both technologies used for storing and managing data, but they operate in different ways and serve different purposes. NAS is a dedicated file storage device that connects to a network, allowing multiple users and devices to access files over a shared network. It operates at the file level and uses standard networking protocols such as NFS or SMB/CIFS, making it easy to set up and manage, especially for small to medium-sized businesses. NAS devices are ideal for sharing files, providing backups, and enabling centralized data access across multiple users in a local network.
## Network Attached Storage (NAS)
SAN, on the other hand, is a high-performance, specialized network designed to provide block-level storage, which means it acts as a direct-attached storage device to servers. SAN uses protocols such as Fibre Channel or iSCSI and is typically employed in large enterprise environments where fast, high-capacity, and low-latency storage is critical for applications like databases and virtualized systems. While NAS focuses on file sharing across a network, SAN is designed for more complex, high-speed data management, enabling servers to access storage as if it were directly connected to them. Both NAS and SAN are vital components of modern data storage infrastructure but are chosen based on the specific performance, scalability, and management needs of the organization.
NAS is a high-capacity storage solution that operates on a data file level, allowing multiple users and clients to access, store, and retrieve data from a centralized location over a network. NAS devices are generally connected to a local area network (LAN) and use various file-sharing protocols, such as NFS (Network File System), SMB/CIFS (Server Message Block/Common Internet File System), or AFP (Apple Filing Protocol).
Learn more from the following resources:
Some key features of a NAS system include:
- **Ease of Deployment**: NAS devices are simple to install and configure, facilitating quick integration into existing network infrastructures.
- **Scalability**: NAS systems can be easily expanded to accommodate growing storage needs by adding more drives or units.
- **Data Protection**: Most NAS devices offer data protection features such as RAID (Redundant Array of Independent Disks), data backup, and data encryption.
## Storage Area Network (SAN)
SAN is a high-performance, dedicated storage network designed to provide block-level data storage for applications and servers. Unlike NAS, which uses file-sharing protocols, SANs utilize block-based protocols such as Fibre Channel (FC) and iSCSI (Internet Small Computer System Interface) to handle storage requests.
SANs offer several advantages in terms of performance, reliability, and scalability:
- **Performance**: SANs can handle low-latency, high-speed data transfers, providing optimal performance for mission-critical applications and large-scale virtualization.
- **Fault Tolerance**: SANs are designed to provide redundancy and failover capabilities, ensuring continued access to data in the event of hardware failures.
- **Scalability**: SANs can be easily scaled by adding more disk arrays, switches, or connections to meet growing storage demands.
## NAS vs. SAN: Choosing the Right Solution
When it comes to deciding between NAS and SAN, there are several factors to consider:
- **Cost**: NAS devices are generally more affordable than SANs, making them an attractive option for smaller organizations or environments with limited budgets.
- **Infrastructure**: NAS solutions can be more easily integrated into existing network infrastructures, whereas SANs may require dedicated hardware, connections, and management tools.
- **Performance Requirements**: If you need high-performance storage for intensive applications, SANs may be a more appropriate choice than NAS.
- **Data Management**: While NAS solutions excel in handling file-based storage, SANs provide better support for block-level storage and can deliver improved performance for virtualized environments and database applications.
It's essential to evaluate your organization's specific needs and requirements to determine which storage solution is the most appropriate fit. As you expand your knowledge in cyber security, a solid understanding of both NAS and SAN technologies will prove invaluable in implementing secure and efficient data storage systems.
- [@video@NAS vs SAN](https://youtu.be/3yZDDr0JKVc)
- [@video@What is a NAS](https://www.youtube.com/watch?v=ZwhT-KI16jo)
- [@video@What is a Storage Area Network](https://www.youtube.com/watch?v=7eGw4vhyeTA)
- [@article@NAS vs SAN - What are the differences?](https://www.backblaze.com/blog/whats-the-diff-nas-vs-san/)

@ -1,48 +1,10 @@
# Basics of Reverse Engineering
Reverse engineering is the process of analyzing a system, component, or software to understand how it works and deduce its design, architecture, or functionality. It is a critical skill in cybersecurity, as it helps security professionals uncover the potential attack vectors, hidden vulnerabilities, and underlying intentions of a piece of software or hardware.
Reverse engineering is the process of deconstructing a system, software, or hardware to understand its internal workings, design, and functionality without having access to its source code or original documentation. In cybersecurity, reverse engineering is often used to analyze malware or software vulnerabilities to uncover how they operate, allowing security professionals to develop defenses, patches, or detection methods. This involves breaking down the binary code, disassembling it into machine code, and then interpreting it to understand the logic, behavior, and intent behind the program.
In this section, we will cover the basic concepts and techniques of reverse engineering that every cybersecurity professional should be familiar with.
Reverse engineering can also be used in hardware to investigate a device's design or performance, or in software development for compatibility, debugging, or enhancing legacy systems. The process typically includes static analysis, where the code is examined without execution, and dynamic analysis, where the program is executed in a controlled environment to observe its runtime behavior. The insights gained through reverse engineering are valuable for improving security, fixing bugs, or adapting systems for different uses. However, it’s important to be aware of the legal and ethical boundaries, as reverse engineering certain software or hardware can violate intellectual property rights.
## Static Analysis Vs. Dynamic Analysis
Learn more from the following resources:
There are two main approaches to reverse engineering: static analysis and dynamic analysis. Static analysis involves examining the code and structure of a software without executing it. This includes analyzing the source code, if available, or examining the binary executable using disassemblers or decompilers.
Dynamic analysis, on the other hand, involves executing the software while observing and monitoring its behaviors and interactions with other components or systems. This analysis is typically performed in controlled environments, such as virtual machines or sandbox environments, to minimize potential risks.
Both approaches have their merits and limitations, and combining them is often the most effective way to gain a comprehensive understanding of the target system.
## Disassemblers and Decompilers
Disassemblers and decompilers are essential tools in reverse engineering, as they help transform binary executables into a more human-readable format.
- **Disassemblers** convert machine code (binary executable) into assembly language, a low-level programming language that is more human-readable than raw machine code. Assembly languages are specific to the CPU architectures, such as x86, ARM, or MIPS.
- **Decompilers** attempt to reverse-engineer binary executables into high-level programming languages, such as C or C++, by interpreting the structures and patterns in the assembly code. Decompilation, however, is not always perfect and may generate code that is more difficult to understand than assembly.
Some popular disassemblers and decompilers are:
- [@article@IDA Pro](https://www.hex-rays.com/products/ida/)
- [@article@Ghidra](https://ghidra-sre.org/)
- [@article@Hopper](https://www.hopperapp.com/)
## Debuggers
Debuggers are another essential tool for reverse engineering, as they allow you to execute a program and closely monitor its behavior during runtime. Debuggers provide features such as setting breakpoints, stepping through code, and examining memory contents.
Some popular debuggers include:
- [@article@OllyDbg](http://www.ollydbg.de/)
- [@article@GDB](https://www.gnu.org/software/gdb/)
- [@article@x64dbg](https://x64dbg.com/)
## Common Reverse Engineering Techniques
Here are some basic reverse engineering techniques:
- **Control flow analysis:** Understanding the execution flow of a program, such as loops, branches, and conditional statements, to determine how the program behaves under certain conditions.
- **Data flow analysis:** Analyzing how data is passed between different parts of a program and tracing the origin and destination of data.
- **System call analysis:** Examining system calls made by a program to understand how it interacts with the operating system, hardware, or external resources.
- **Cryptographic analysis:** Identifying and analyzing encryption and decryption algorithms used within a program or analyzing any cryptographic keys or certificates that may be present.
- **Pattern recognition:** Identifying common patterns, structures, or routines in code that may indicate the use of known algorithms or frameworks.
Remember that mastering the art of reverse engineering takes time and practice. As you delve deeper into the world of reverse engineering, you will develop the ability to recognize patterns, understand complex systems, and ultimately, better defend against cyber threats.
- [@course@Reverse Engineering for Everyone!](https://0xinfection.github.io/reversing/)
- [@video@What is reverse engineering?](https://www.youtube.com/watch?v=gh2RXE9BIN8)

@ -1,53 +1,11 @@
# Basics of Subnetting
Subnetting is the process of dividing an IP network into smaller sub-networks called subnets. It allows better allocation of IP addresses and provides better organization, control, and security for the network. Here we go through some of the basic concepts of subnetting and why it's crucial for cybersecurity.
Subnetting is a technique used in computer networking to divide a large network into smaller, more manageable sub-networks, or "subnets." It enhances network performance and security by reducing broadcast traffic and enabling better control over IP address allocation. Each subnet has its own range of IP addresses, which allows network administrators to optimize network traffic and reduce congestion by isolating different sections of a network.
## IP Addresses and Subnet Masks
In subnetting, an IP address is split into two parts: the network portion and the host portion. The network portion identifies the overall network, while the host portion identifies individual devices within that network. Subnet masks are used to define how much of the IP address belongs to the network and how much is reserved for hosts. By adjusting the subnet mask, administrators can create multiple subnets from a single network, with each subnet having a limited number of devices. Subnetting is particularly useful for large organizations, allowing them to efficiently manage IP addresses, improve security by segmenting different parts of the network, and control traffic flow by minimizing unnecessary data transmissions between segments.
An IP address is a unique identifier for devices on a network. It consists of two parts: the network address and the host address. The network address indicates the network to which a device belongs, while the host address identifies the specific device within that network.
Learn more from the following resources:
Subnet masks are used to define which portion of an IP address is the network address and which is the host address. For example, in the IP address `192.168.1.5`, and subnet mask `255.255.255.0`, the network address is `192.168.1.0`, and the host address is `5`.
## Why Subnetting?
Subnetting has several advantages, including:
- **Improved Network Performance**: Breaking a large network into smaller subnets helps reduce congestion and improve overall performance.
- **Enhanced Security**: By isolating different parts of a network, you can control access and limit the spread of potential threats.
- **Easier Administration**: Smaller networks are easier to manage and maintain, as it's simpler to track issues and allocate resources.
## Subnetting Process
The process of subnetting involves the following steps:
- **Choose the Appropriate Subnet Mask**: Determine the right subnet mask for your network based on the number of required subnets and hosts. The more subnets you need, the more bits you will "borrow" from the host portion of the IP address.
- **Divide the Network into Subnets**: Calculate the subnet addresses by incrementing the network portion of the IP address by the value of the borrowed bits.
- **Determine Host Ranges**: Calculate the valid host addresses within each subnet by identifying the first and last usable IP addresses. Remember that the first address in a subnet is the network address, and the last address is used for broadcasting.
- **Assign IP Addresses**: Allocate IP addresses to devices within their respective subnets, and configure devices with the correct subnet mask.
## Example
Let's suppose we have the network `192.168.1.0` with a subnet mask of `255.255.255.0`. We want to create four smaller subnets. Here's how we can do it:
- `255.255.255.0` in binary is `11111111.11111111.11111111.00000000`. We can borrow 2 bits from the host portion to create four subnets: `11111111.11111111.11111111.11000000`, which is `255.255.255.192` in decimal format.
- Our subnets will have the following network addresses:
- `192.168.1.0`
- `192.168.1.64`
- `192.168.1.128`
- `192.168.1.192`
- The valid host ranges within each subnet are:
- `192.168.1.1 - 192.168.1.62`
- `192.168.1.65 - 192.168.1.126`
- `192.168.1.129 - 192.168.1.190`
- `192.168.1.193 - 192.168.1.254`
- Allocate IP addresses from these host ranges to devices within their respective subnets, and configure devices with the correct subnet mask (`255.255.255.192`).
Understanding the basics of subnetting is essential to properly configuring and securing your network. By efficiently dividing your network into smaller subnets, you can optimize performance, organization, and security.
- [@article@Networking Basics: What is IPv4 Subnetting?](https://www.cbtnuggets.com/blog/technology/networking/networking-basics-what-is-ipv4-subnetting)
- [@video@Lets subnet your home network!](https://www.youtube.com/watch?v=mJ_5qeqGOaI&list=PLIhvC56v63IKrRHh3gvZZBAGvsvOhwrRF&index=6)
- [@video@Subnetting for hackers](https://www.youtube.com/watch?v=o0dZFcIFIAw)

@ -1,42 +1,10 @@
# Basics of Threat Intel, OSINT
Open Source Intelligence (OSINT) is a crucial part of cyber threat intelligence (CTI). It refers to the collection and analysis of publicly available information from various sources to identify potential threats to an organization's information security.
Threat Intelligence (Threat Intel) and Open-Source Intelligence (OSINT) are both critical components in cybersecurity that help organizations stay ahead of potential threats. Threat Intelligence refers to the collection, analysis, and dissemination of information about potential or current attacks targeting an organization. This intelligence typically includes details on emerging threats, attack patterns, malicious IP addresses, and indicators of compromise (IoCs), helping security teams anticipate, prevent, or mitigate cyberattacks. Threat Intel can be sourced from both internal data (such as logs or past incidents) and external feeds, and it helps in understanding the tactics, techniques, and procedures (TTPs) of adversaries.
## Why is OSINT important for threat intelligence?
OSINT, a subset of Threat Intel, involves gathering publicly available information from open sources to assess and monitor threats. These sources include websites, social media, forums, news articles, and other publicly accessible platforms. OSINT is often used for reconnaissance to identify potential attack vectors, compromised credentials, or leaks of sensitive data. It’s also a valuable tool in tracking threat actors, as they may leave traces in forums or other public spaces. Both Threat Intel and OSINT enable organizations to be more proactive in their cybersecurity strategies by identifying vulnerabilities, understanding attacker behavior, and implementing timely defenses based on actionable insights.
OSINT plays a significant role in achieving comprehensive threat intelligence by offering valuable insights into various threat actors, their tactics, techniques, and procedures (TTPs). By leveraging OSINT, security teams can:
Learn more from the following resources:
- Identify and track adversaries targeting their organization
- Gain knowledge about the latest attack strategies and trends
- Evaluate the effectiveness of existing security measures
- Develop proactive defense strategies to mitigate potential threats
## Key OSINT Sources
There are numerous sources of OSINT data that can be valuable for threat intelligence. Some of the main sources include:
- **Publicly accessible websites and blogs**: Security researchers, hackers, and threat actors frequently share information about their findings, tools, and techniques in their blogs and websites.
- **Social media platforms**: Social media platforms like Twitter, Reddit, and LinkedIn offer a wealth of information about threat actors' activities and can act as a valuable resource for threat intelligence.
- **Security-related conference materials**: Many industry conferences and workshops publish their research papers, video recordings, and presentations online, allowing you to gather valuable insights from experts in the field.
- **Online forums and chat rooms**: Hacker forums, online chat rooms, and bulletin boards often contain discussions related to the latest vulnerabilities, exploits, and attack techniques.
- **Pastebin and GitHub**: These platforms offer code snippets and repositories that may contain working hacking tools or proof-of-concept exploits, making them valuable sources of OSINT.
## Best Practices for OSINT Collection
Collecting and analyzing OSINT for threat intelligence may seem like a daunting task, but by following these best practices, you can effectively incorporate it into your cyber defense strategies:
- **Set clear goals and objectives**: Define what you want to achieve with your OSINT collection efforts and how it contributes to your organization's threat intelligence initiatives.
- **Establish a methodology**: Develop a structured approach and process for searching, collecting, and analyzing OSINT data.
- **Filter your data**: As the volume of data available from OSINT sources can be overwhelming, it's essential to filter the data gathered effectively. Prioritize information that is relevant to your organizational context and specific intelligence requirements.
- **Maintain up-to-date knowledge**: Regularly review newly available OSINT and stay current with the latest tactics, techniques, and procedures utilized by threat actors.
- **Collaborate and share with peers**: The security community is known for collaboration and knowledge sharing. Engage with other security professionals to benefit from their knowledge and experience.
In conclusion, OSINT is a significant aspect of threat intelligence that helps organizations identify and mitigate potential security threats. By effectively collecting and analyzing OSINT, you can gain a better understanding of the ever-evolving threat landscape and develop more effective strategies to protect your organization.
- [@article@OSINT Framework](https://osintframework.com/)
- [@course@Open-Source Intelligence (OSINT) in 5 Hours](https://www.youtube.com/watch?v=qwA6MmbeGNo&t=457s)

@ -1,24 +1,12 @@
# Basics of Vulnerability Management
Vulnerability management is a crucial aspect of cybersecurity, as it helps organizations to identify, prioritize, and remediate potential risks in their networks, systems, and applications. It involves continuous processes and practices designed to protect sensitive data by reducing the attack surface and minimizing the likelihood of a breach.
Vulnerability management is the process of identifying, evaluating, prioritizing, and mitigating security vulnerabilities in an organization's systems, applications, and networks. It is a continuous, proactive approach to safeguarding digital assets by addressing potential weaknesses that could be exploited by attackers. The process begins with **vulnerability scanning**, where tools are used to detect known vulnerabilities by analyzing software, configurations, and devices.
## Importance of Vulnerability Management
Once vulnerabilities are identified, they are **assessed and prioritized** based on factors such as severity, potential impact, and exploitability. Organizations typically use frameworks like CVSS (Common Vulnerability Scoring System) to assign risk scores to vulnerabilities, helping them focus on the most critical ones first.
- **Prevent cyberattacks**: By addressing vulnerabilities before they can be exploited, organizations reduce the chances of successful attacks and protect their critical assets.
- **Comply with regulations**: Organizations must adhere to various data protection standards and regulations, such as GDPR, HIPAA, or PCI DSS. A robust vulnerability management program can help meet these requirements.
- **Maintain customer trust**: Frequent security breaches can lead to reputational damages, making it vital to prioritize vulnerability management as a means to safeguard customer data.
- **Save costs**: Proactively identifying and mitigating vulnerabilities reduces the financial implications of dealing with a security breach, including the costs of incident response, legal liabilities, and penalties.
Next, **remediation** is carried out through patching, configuration changes, or other fixes. In some cases, mitigation may involve applying temporary workarounds until a full patch is available. Finally, continuous **monitoring and reporting** ensure that new vulnerabilities are swiftly identified and addressed, maintaining the organization's security posture. Vulnerability management is key to reducing the risk of exploitation and minimizing the attack surface in today's complex IT environments.
## Components of Vulnerability Management
Learn more from the following resources:
- **Vulnerability Assessment**: Regular vulnerability assessments are essential to identify security weaknesses. This includes scanning networks, system components, software, and applications to identify existing vulnerabilities.
- **Risk Analysis**: After identifying vulnerabilities, it is essential to assess their potential risks. This involves determining the likelihood and impact of each vulnerability, prioritizing them based on severity, and deciding which vulnerabilities to address first.
- **Remediation**: The remediation process involves implementing patches, updates, or configuration changes to address the identified vulnerabilities. It is crucial to regularly review and ensure that patches have been applied effectively to prevent further exploitation.
- **Verification**: After remediation, organizations must verify that the implemented solutions have effectively eliminated the risk posed by the vulnerability. Verification processes may include re-scanning and penetration testing.
- **Reporting**: Maintaining comprehensive and accurate records of vulnerability management activities is essential for regulatory compliance and informing key stakeholders about the organization's security posture. Regular reporting can also aid in identifying problem areas and trends, allowing decision-makers to allocate resources and plan accordingly.
By implementing a thorough vulnerability management program, organizations can significantly reduce their risk exposure and improve their overall cybersecurity posture. In today's digital landscape, proactively managing vulnerabilities is a critical step in safeguarding sensitive information and maintaining customer trust.
- [@article@What is vulnerability management?](https://www.rapid7.com/fundamentals/vulnerability-management-and-scanning/)
- [@video@Vulnerability Management explained by experts](https://www.youtube.com/watch?v=RE6_Lo2wSIg)

@ -2,43 +2,10 @@
In the context of cybersecurity, Blue Team, Red Team, and Purple Team are terms used to describe different roles and methodologies employed to ensure the security of an organization or system. Let's explore each one in detail.
## Blue Team
In cybersecurity, Blue Team and Red Team refer to opposing groups that work together to improve an organization's security posture. The Blue Team represents defensive security personnel who protect systems and networks from attacks, while the Red Team simulates real-world adversaries to test the Blue Team's defenses. Purple Team bridges the gap between the two, facilitating collaboration and knowledge sharing to enhance overall security effectiveness. This approach combines the defensive strategies of the Blue Team with the offensive tactics of the Red Team, creating a more comprehensive and dynamic security framework that continuously evolves to address emerging threats and vulnerabilities.
The Blue Team is responsible for defending an organization's information systems, networks, and critical assets from security threats. They are tasked with the ongoing monitoring of systems, detecting and responding to potential security incidents, and implementing protective measures.
Learn more from the following resources:
**Key activities of the Blue Team:**
- Develop and implement security policies and procedures
- Perform vulnerability assessments and risk assessments
- Deploy security tools and technologies (e.g., firewalls, intrusion detection systems, etc.)
- Monitor logs and analyze security events for potential threats
- Respond to and investigate security incidents
- Conduct security awareness and training programs
## Red Team
The Red Team's primary goal is to simulate real-world attacks, identify vulnerabilities, and test the effectiveness of the Blue Team's defensive strategies. They are external or internal team members that act like adversaries, using creativity, and advanced techniques to test an organization's cybersecurity defenses.
**Key activities of the Red Team:**
- Perform regular penetration testing and security assessments
- Use social engineering techniques to exploit human weaknesses
- Analyze and exploit vulnerabilities in systems, networks, and applications
- Emulate advanced persistent threats and attack scenarios
- Provide actionable insights to improve the organization's security posture
## Purple Team
The Purple Team bridges the gap between the Blue Team and Red Team, helping to create a more collaborative environment. They facilitate communication and information sharing between the two teams, ultimately aiming to improve the overall effectiveness of a security program.
**Key activities of the Purple Team:**
- Coordinate and plan joint exercises between Blue Team and Red Team
- Share knowledge, techniques, and findings between the teams
- Assist with the implementation of identified security improvements
- Evaluate and measure the effectiveness of security controls
- Foster a culture of continuous improvement and collaboration
By investing in Blue, Red, and Purple Team efforts, organizations can achieve a more robust and resilient security posture, capable of withstanding and adapting to ever-evolving threats.
- [@article@Red Team Fundamentals (TryHackMe)](https://tryhackme.com/room/redteamfundamentals)
- [@article@What is a blue team?](https://www.checkpoint.com/cyber-hub/cyber-security/what-is-a-blue-team/)
- [@article@What is red teaming?](https://www.ibm.com/think/topics/red-teaming)
- [@article@Purple teaming explained](https://www.crowdstrike.com/cybersecurity-101/purple-teaming/)

@ -1,21 +1,8 @@
# Bluetooth
**Bluetooth** is a wireless technology used to transfer data between devices over short distances. It operates in the 2.4 GHz frequency band and offers a reasonably secure means of communication between devices like smartphones, computers, headphones, and more.
Bluetooth is a short-range wireless technology standard used for exchanging data between fixed and mobile devices over short distances. While it offers convenience for connecting peripherals and transferring information, it also presents several security concerns in the cybersecurity landscape. Bluetooth vulnerabilities can potentially allow attackers to intercept communications, execute malicious code, or gain unauthorized access to devices. Common attacks include bluejacking, bluesnarfing, and bluebugging. To mitigate these risks, cybersecurity professionals recommend regularly updating device firmware, using the latest Bluetooth protocols, enabling encryption, and turning off Bluetooth when not in use. Despite ongoing security improvements, Bluetooth remains an attack vector that requires vigilant monitoring and protection in both personal and enterprise environments.
Below are some key points about Bluetooth:
Learn more from the following resources:
- **Short-range communication**: Bluetooth typically works within a radius of 10 meters (33 feet), giving it a significant advantage in terms of power consumption when compared to other wireless technologies such as Wi-Fi. The short range also reduces the chances of interference between devices.
- **Low power consumption**: Bluetooth devices are designed to use relatively low power compared to other wireless technologies. This aspect contributes to their widespread adoption in battery-powered devices like wearable gadgets and IoT sensors.
- **Convenience**: Bluetooth allows for easy, automatic connection between devices once they have been paired. This 'pair and play' functionality ensures users can quickly establish connectivity between their devices with minimal effort.
- **Security**: Bluetooth includes security features like encryption and authentication, which ensure secure communication between paired devices. However, users must remain vigilant in terms of keeping their devices up-to-date with the latest Bluetooth security patches and protocols.
- **Potential vulnerabilities**: Despite its built-in security measures, Bluetooth is not immune to cyber attacks. Some common risks include "bluejacking" (unauthorized sending of messages or files), "bluesnarfing" (unauthorized access to device data), and "BlueBorne" (an attack vector that exploits Bluetooth connections to infiltrate devices and spread malware). Users should be cautious in their usage of Bluetooth and follow best practices like not accepting unknown connection requests and turning off Bluetooth when not in use.
In conclusion, Bluetooth offers a convenient means of connecting devices wirelessly. While it provides reasonably secure communication, users must stay informed about potential vulnerabilities and follow good security practices to safeguard their devices.
- [@article@Bluetooth security risks to know (and how to avoid them)](https://us.norton.com/blog/mobile/bluetooth-security)
- [@official@Bluetooth security best practices from official website](https://www.bluetooth.com/learn-about-bluetooth/key-attributes/bluetooth-security/)
- [@feed@Explore top posts about Bluetooth](https://app.daily.dev/tags/bluetooth?ref=roadmapsh)
- [@article@Bluetooth in Cyber Security](https://www.zenarmor.com/docs/network-basics/what-is-bluetooth)
- [@video@Everything about Bluetooth Security](https://www.youtube.com/watch?v=i9mzl51ammA)

@ -1,24 +1,7 @@
# Box
[Box](https://www.box.com/) is a popular cloud storage service that provides individuals and businesses with a platform to securely store, share, and access files and documents from any device. Box is known for its emphasis on security and collaboration features, making it an ideal choice for businesses who want a secure way to share and collaborate on files with their teams.
Box is a popular cloud storage service that provides individuals and businesses with a platform to securely store, share, and access files and documents from any device. Box is known for its emphasis on security and collaboration features, making it an ideal choice for businesses who want a secure way to share and collaborate on files with their teams.
## Features
Learn more from the following resources:
- **Security:** Box ensures the data stored within their platform is secure by implementing various security measures, such as encryption (in-transit and at-rest), multi-factor authentication, and granular access controls.
- **Collaboration:** Users can easily invite collaborators, assign permissions, and share files via secure links within Box. It also features real-time document editing and file version history.
- **Integrations:** Box integrates with several other applications and services, such as Microsoft Office 365, Google Workspace, Salesforce, Slack, and more.
- **Box Drive:** With Box Drive, users can access and work on their files directly from the desktop, without downloading them locally, making it easy to keep files up-to-date.
## Pricing
Box offers a [variety of pricing plans](https://www.box.com/pricing), catering to different user requirements. These include:
- **Individual Plan:** Free, with limited storage and features.
- **Personal Pro Plan:** $10/month, includes 100GB storage, larger file size support, and additional features.
- **Business Plans:** Starting at $5/user/month, tailored to meet the needs of small to enterprise-level businesses, with increased storage, advanced security, and much more.
## Privacy & Compliance
Box is compliant with various international privacy laws and regulations, such as GDPR, HIPAA, and FedRAMP. It also undergoes third-party audits and assessments to verify the efficacy of their security measures.
In conclusion, Box is a highly secure and feature-rich cloud storage service that is specifically designed for businesses and individuals who require advanced security and collaboration functionality.
- [@official@Box Website](https://www.box.com/en-gb/home)

@ -11,3 +11,5 @@ Password Spray is a more targeted and stealthy method of password cracking where
Visit the following resources to learn more:
- [@article@Brute force vs. Password Spray attack](https://www.inspark.nl/brute-force-vs-password-spray-attack-in-azure-sentinel/)
- [@article@What is password praying?](https://www.techtarget.com/whatis/definition/password-spraying)
- [@article@What is a brute force attack?](https://www.fortinet.com/resources/cyberglossary/brute-force-attack)

@ -5,5 +5,4 @@ A Buffer Overflow is a type of vulnerability that occurs when a program or proce
Visit the following resources to learn more:
- [@article@What Is Buffer Overflow?](https://www.fortinet.com/resources/cyberglossary/buffer-overflow)
- [@article@Buffer Overflow Attack](https://www.imperva.com/learn/application-security/buffer-overflow/)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save