Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docusaurus preparations #2703

Merged
merged 14 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Contributing Guidelines

Thank you for considering contributing to this project! To ensure a smooth and efficient process, please follow these guidelines.

## Adding a New Example

1. **Create a Directory**: Create a new directory for your example in the root of the repository. Please do not use a "fiber" prefix in the directory name.

2. **Add a `README.md`**: Each example must include a `README.md` file in its directory. This file should contain the following:

- **Docusaurus Metadata**: Add the following metadata at the top of the `README.md` file:
```markdown
---
title: Your Example Title
keywords: [keyword1, keyword2, keyword3]
---
```

- `title`: A short and descriptive title for your example.
- `keywords`: A list of relevant keywords (excluding "fiber").

- **Content**: The `README.md` should provide a detailed explanation of the example, including:
- The idea behind the example.
- The components used in the example.
- Instructions on how to run the example.
- Any other relevant information.

3. **Update the Overview**: After adding your example, run the following command in the root directory to update the overview table of contents:
```bash
make generate
```
ReneWerner87 marked this conversation as resolved.
Show resolved Hide resolved

By following these guidelines, you help maintain the quality and consistency of the project. Thank you for your contributions!
55 changes: 55 additions & 0 deletions .github/scripts/sync_docs.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
set -e

# Some env variables
BRANCH="main"
REPO_URL="github.com/gofiber/docs.git"
AUTHOR_EMAIL="github-actions[bot]@users.noreply.github.com"
AUTHOR_USERNAME="github-actions[bot]"
REPO_DIR="recipes"
COMMIT_URL="https://github.com/gofiber/recipes"

# Set commit author
git config --global user.email "${AUTHOR_EMAIL}"
git config --global user.name "${AUTHOR_USERNAME}"

ReneWerner87 marked this conversation as resolved.
Show resolved Hide resolved
git clone https://${TOKEN}@${REPO_URL} fiber-docs

latest_commit=$(git rev-parse --short HEAD)
ReneWerner87 marked this conversation as resolved.
Show resolved Hide resolved

# remove all files in the docs directory
rm -rf $ROOT/../fiberDocs/docs/${REPO_DIR}/*

for f in $(find -E . -type f -iregex '.*\.(md|png|jpe?g|gif|bmp|svg|webp)$' -not -path "./(fiberDocs)/*" -not -path "*/vendor/*" -not -path "*/.github/*" -not -path "*/.*"); do
log_output=$(git log --oneline "${BRANCH}" HEAD~1..HEAD --name-status -- "${f}")

if [[ $log_output != "" || ! -f "fiber-docs/docs/${REPO_DIR}/$f" ]]; then
mkdir -p fiber-docs/docs/${REPO_DIR}/$(dirname $f)
cp "${f}" fiber-docs/docs/${REPO_DIR}/$f
fi
done
Comment on lines +20 to +30
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix security and reliability issues in file synchronization

Several critical issues need to be addressed:

  1. Unsafe file handling in find loop
  2. Undefined ROOT variable
  3. Potential path traversal vulnerability
  4. Missing error handling for file operations

Apply these changes:

+# Validate ROOT variable
+if [ -z "${ROOT:-}" ]; then
+    ROOT="."
+fi
+
 # remove all files in the docs directory
-rm -rf $ROOT/../fiberDocs/docs/${REPO_DIR}/*
+rm -rf "${ROOT}/../fiberDocs/docs/${REPO_DIR:?}/"*
 
-for f in $(find -E . -type f -iregex '.*\.(md|png|jpe?g|gif|bmp|svg|webp)$' -not -path "./(fiberDocs)/*" -not -path "*/vendor/*" -not -path "*/.github/*" -not -path "*/.*"); do
-  log_output=$(git log --oneline "${BRANCH}" HEAD~1..HEAD --name-status -- "${f}")
-
-    if [[ $log_output != "" || ! -f "fiber-docs/docs/${REPO_DIR}/$f" ]]; then
-      mkdir -p fiber-docs/docs/${REPO_DIR}/$(dirname $f)
-      cp "${f}" fiber-docs/docs/${REPO_DIR}/$f
-  fi
-done
+# Use find -exec for safer file handling
+find -E . -type f \
+    -iregex '.*\.(md|png|jpe?g|gif|bmp|svg|webp)$' \
+    -not -path "./(fiberDocs)/*" \
+    -not -path "*/vendor/*" \
+    -not -path "*/.github/*" \
+    -not -path "*/.*" \
+    -exec bash -c '
+        f="$1"
+        log_output=$(git log --oneline "${BRANCH}" HEAD~1..HEAD --name-status -- "${f}")
+        target_dir="fiber-docs/docs/${REPO_DIR}/$(dirname "${f}")"
+        target_file="${target_dir}/$(basename "${f}")"
+        
+        if [[ $log_output != "" || ! -f "${target_file}" ]]; then
+            mkdir -p "${target_dir}"
+            if ! cp "${f}" "${target_file}"; then
+                echo "ERROR: Failed to copy ${f}"
+                exit 1
+            fi
+        fi
+    ' bash {} \;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# remove all files in the docs directory
rm -rf $ROOT/../fiberDocs/docs/${REPO_DIR}/*
for f in $(find -E . -type f -iregex '.*\.(md|png|jpe?g|gif|bmp|svg|webp)$' -not -path "./(fiberDocs)/*" -not -path "*/vendor/*" -not -path "*/.github/*" -not -path "*/.*"); do
log_output=$(git log --oneline "${BRANCH}" HEAD~1..HEAD --name-status -- "${f}")
if [[ $log_output != "" || ! -f "fiber-docs/docs/${REPO_DIR}/$f" ]]; then
mkdir -p fiber-docs/docs/${REPO_DIR}/$(dirname $f)
cp "${f}" fiber-docs/docs/${REPO_DIR}/$f
fi
done
# Validate ROOT variable
if [ -z "${ROOT:-}" ]; then
ROOT="."
fi
# remove all files in the docs directory
rm -rf "${ROOT}/../fiberDocs/docs/${REPO_DIR:?}/"*
# Use find -exec for safer file handling
find -E . -type f \
-iregex '.*\.(md|png|jpe?g|gif|bmp|svg|webp)$' \
-not -path "./(fiberDocs)/*" \
-not -path "*/vendor/*" \
-not -path "*/.github/*" \
-not -path "*/.*" \
-exec bash -c '
f="$1"
log_output=$(git log --oneline "${BRANCH}" HEAD~1..HEAD --name-status -- "${f}")
target_dir="fiber-docs/docs/${REPO_DIR}/$(dirname "${f}")"
target_file="${target_dir}/$(basename "${f}")"
if [[ $log_output != "" || ! -f "${target_file}" ]]; then
mkdir -p "${target_dir}"
if ! cp "${f}" "${target_file}"; then
echo "ERROR: Failed to copy ${f}"
exit 1
fi
fi
' bash {} \;
🧰 Tools
🪛 Shellcheck (0.10.0)

[warning] 23-23: For loops over find output are fragile. Use find -exec or a while read loop.

(SC2044)


[warning] 27-27: Quote this to prevent word splitting.

(SC2046)



# Push changes
cd fiber-docs/ || true
git add .

git commit -m "Add docs from ${COMMIT_URL}/commit/${latest_commit}"

MAX_RETRIES=5
DELAY=5
retry=0

while ((retry < MAX_RETRIES))
do
git push https://${TOKEN}@${REPO_URL} && break
retry=$((retry + 1))
git pull --rebase
sleep $DELAY
done

if ((retry == MAX_RETRIES))
then
echo "Failed to push after $MAX_RETRIES attempts. Exiting with 1."
exit 1
fi
ReneWerner87 marked this conversation as resolved.
Show resolved Hide resolved
25 changes: 25 additions & 0 deletions .github/scripts/sync_local.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -e

if [ "$#" -eq 1 ]; then
REPO_DIR="$1"
else
REPO_DIR="recipes" # default value
fi

if [[ ! "$REPO_DIR" =~ ^[a-zA-Z0-9_-]+$ ]]; then
echo "Error: REPO_DIR must contain only alphanumeric characters, underscores, and hyphens" >&2
exit 1
fi

# determine root repo directory
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)"

# remove all files in the docs directory
rm -rf $ROOT/../fiberDocs/docs/${REPO_DIR}/*
ReneWerner87 marked this conversation as resolved.
Show resolved Hide resolved

for f in $(find -E . -type f -iregex '.*\.(md|png|jpe?g|gif|bmp|svg|webp)$' -not -path "./(fiberDocs)/*" -not -path "*/vendor/*" -not -path "*/.github/*" -not -path "*/.*"); do
echo "Copying $f"
mkdir -p $ROOT/../fiberDocs/docs/${REPO_DIR}/$(dirname $f)
cp "${f}" $ROOT/../fiberDocs/docs/${REPO_DIR}/$f
done
Comment on lines +21 to +25
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Improve file handling safety and portability

The current implementation has several issues with special characters in filenames and portability. Additionally, Shellcheck warns about fragile find usage.

-for f in $(find -E . -type f -iregex '.*\.(md|png|jpe?g|gif|bmp|svg|webp)$' -not -path "./(fiberDocs)/*" -not -path "*/vendor/*" -not -path "*/.github/*" -not -path "*/.*"); do
-  echo "Copying $f"
-    mkdir -p $ROOT/../fiberDocs/docs/${REPO_DIR}/$(dirname $f)
-    cp "${f}" $ROOT/../fiberDocs/docs/${REPO_DIR}/$f
-done
+# Use portable find syntax and handle special characters properly
+find . -type f \( \
+    -iname "*.md" -o \
+    -iname "*.png" -o \
+    -iname "*.jpg" -o \
+    -iname "*.jpeg" -o \
+    -iname "*.gif" -o \
+    -iname "*.bmp" -o \
+    -iname "*.svg" -o \
+    -iname "*.webp" \
+  \) \
+  -not -path "./fiberDocs/*" \
+  -not -path "*/vendor/*" \
+  -not -path "*/.github/*" \
+  -not -path "*/.*" \
+  -print0 | while IFS= read -r -d '' file; do
+    echo "Copying: ${file}"
+    target_dir="${ROOT}/../fiberDocs/docs/${REPO_DIR}/$(dirname "${file}")"
+    if ! mkdir -p "${target_dir}"; then
+        echo "Error: Failed to create directory: ${target_dir}" >&2
+        exit 1
+    fi
+    if ! cp "${file}" "${ROOT}/../fiberDocs/docs/${REPO_DIR}/${file}"; then
+        echo "Error: Failed to copy: ${file}" >&2
+        exit 1
+    fi
+done

This change:

  1. Uses portable find syntax instead of -E
  2. Properly handles filenames with spaces and special characters
  3. Adds error handling for mkdir and cp operations
  4. Properly quotes all variables
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
for f in $(find -E . -type f -iregex '.*\.(md|png|jpe?g|gif|bmp|svg|webp)$' -not -path "./(fiberDocs)/*" -not -path "*/vendor/*" -not -path "*/.github/*" -not -path "*/.*"); do
echo "Copying $f"
mkdir -p $ROOT/../fiberDocs/docs/${REPO_DIR}/$(dirname $f)
cp "${f}" $ROOT/../fiberDocs/docs/${REPO_DIR}/$f
done
# Use portable find syntax and handle special characters properly
find . -type f \( \
-iname "*.md" -o \
-iname "*.png" -o \
-iname "*.jpg" -o \
-iname "*.jpeg" -o \
-iname "*.gif" -o \
-iname "*.bmp" -o \
-iname "*.svg" -o \
-iname "*.webp" \
\) \
-not -path "./fiberDocs/*" \
-not -path "*/vendor/*" \
-not -path "*/.github/*" \
-not -path "*/.*" \
-print0 | while IFS= read -r -d '' file; do
echo "Copying: ${file}"
target_dir="${ROOT}/../fiberDocs/docs/${REPO_DIR}/$(dirname "${file}")"
if ! mkdir -p "${target_dir}"; then
echo "Error: Failed to create directory: ${target_dir}" >&2
exit 1
fi
if ! cp "${file}" "${ROOT}/../fiberDocs/docs/${REPO_DIR}/${file}"; then
echo "Error: Failed to copy: ${file}" >&2
exit 1
fi
done
🧰 Tools
🪛 Shellcheck (0.10.0)

[warning] 21-21: For loops over find output are fragile. Use find -exec or a while read loop.

(SC2044)


[warning] 23-23: Quote this to prevent word splitting.

(SC2046)

34 changes: 34 additions & 0 deletions .github/workflows/sync-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: 'Sync docs'

on:
push:
branches:
- master
- main
paths:
- '**/*.md'

jobs:
sync-docs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 2

- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: '18'

- name: Install JQ
run: sudo apt-get install jq

- name: Sync docs
run: ./.github/scripts/sync_docs.sh
env:
EVENT: ${{ github.event_name }}
TAG_NAME: ${{ github.ref_name }}
TOKEN: ${{ secrets.DOC_SYNC_TOKEN }}
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Thumbs.db
*.out

# Dependency directories (remove the comment below to include it)
# vendor/
vendor/

# Go workspace file
go.work
Expand Down
7 changes: 7 additions & 0 deletions 404-handler/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
---
title: 404 Handler
keywords: [404, not found, handler, errorhandler, custom]
---

# Custom 404 Not Found Handler Example

[![Github](https://img.shields.io/static/v1?label=&message=Github&color=2ea44f&style=for-the-badge&logo=github)](https://github.com/gofiber/recipes/tree/master/404-handler) [![StackBlitz](https://img.shields.io/static/v1?label=&message=StackBlitz&color=2ea44f&style=for-the-badge&logo=StackBlitz)](https://stackblitz.com/github/gofiber/recipes/tree/master/404-handler)

This example demonstrates how to implement a custom 404 Not Found handler using the [Fiber](https://gofiber.io) web framework in Go. The purpose of this example is to show how to handle requests to undefined routes gracefully by returning a 404 status code.

## Description
Expand Down
32 changes: 32 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
## help: 💡 Display available commands
.PHONY: help
help:
@echo '⚡️ GoFiber/Recipes Development:'
@sed -n 's/^##//p' ${MAKEFILE_LIST} | column -t -s ':' | sed -e 's/^/ /'

## audit: 🚀 Conduct quality checks
.PHONY: audit
audit:
go mod verify
go vet ./...
go run golang.org/x/vuln/cmd/govulncheck@latest ./...

## format: 🎨 Fix code format issues
.PHONY: format
format:
go run mvdan.cc/gofumpt@latest -w -l .

## markdown: 🎨 Find markdown format issues (Requires markdownlint-cli)
.PHONY: markdown
markdown:
markdownlint-cli2 "**/*.md" "#vendor"

## lint: 🚨 Run lint checks
.PHONY: lint
lint:
go run github.com/golangci/golangci-lint/cmd/[email protected] run ./...

## generate: ⚡️ Generate implementations
.PHONY: generate
generate:
go generate ./...
153 changes: 87 additions & 66 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
---
id: welcome
title: 👋 Overview
sidebar_position: 1
---

# 🍳 Examples for [Fiber](https://github.com/gofiber/fiber)

**Welcome to the official Fiber cookbook**!
Expand All @@ -6,72 +12,87 @@ Here you can find the most **delicious** recipes to cook delicious meals using o

## 🌽 Table of contents

- [Amazon Web Services (AWS) Elastic Beanstalk](/aws-eb)
- [AWS SAM](/aws-sam)
- [Certificates from Let's Encrypt](/autocert)
- [Clean Architecture](/clean-architecture)
- [Cloud Run](/cloud-run)
- [Colly Scraping using Fiber and PostgreSQL](/fiber-colly-gorm)
- [CSRF-with-Session](/csrf-with-session)
- [CSRF](/csrf)
- [Custom 404 Not Found](/404-handler)
- [Dependency Injection (with Parsley)](/parsley)
- [Docker MariaDB Clean Architecture](/docker-mariadb-clean-arch)
- [Docker Nginx Loadbalancer](/docker-nginx-loadbalancer)
- [Docker Postgres-JWT](/auth-docker-postgres-jwt)
- [DummyJson](/dummyjson/)
- [Enable HTTPS/TLS using PKCS12 store](/https-pkcs12-tls)
- [Enable HTTPS/TLS](/https-tls)
- [Enable Preforking](/prefork)
- [Ent Mysql Example](/ent-mysql)
- [Entgo Sveltekit](/entgo-sveltekit)
- [Firebase Functions](/firebase-functions)
- [GeoIP (with MaxMind databases)](/geoip-maxmind)
- [GeoIP](/geoip)
- [GORM Mysql Example](/gorm-mysql)
- [GORM](/gorm)
- [Graceful shutdown](/graceful-shutdown)
- [GraphQL](/graphql)
- [Hello, World!](/hello-world)
- [Heroku App](/heroku)
- [Hexagonal Architecture](/hexagonal)
- [i18n](/i18n)
- [JWT](/jwt)
- [Kubernetes](/k8s)
- [Listen on Multiple Ports](/multiple-ports)
- [Live Reloading (Air)](/air)
- [Memgraph](/memgraph)
- [MinIO](/minio)
- [MongoDB](/mongodb)
- [MVC Application Bootstrap](/fiber-bootstrap)
- [Netlify Functions](fiber-svelte-netlify)
- [OAuth2 Google](/oauth2-google)
- [PostgreSQL](/postgresql)
- [RabbitMQ](rabbitmq)
- [React Router](/react-router)
- [Recover from panic](/recover)
- [RSS feed](/rss-feed)
- [Serve Static Files](/file-server)
- [Server Timing](/server-timing)
- [Server-Sent Events](/sse)
- [Sessions-SQLite3](/sessions-sqlite3)
- [Single Page Application Example](/spa)
- [Socket.io](/socketio)
- [Sqlboiler](/sqlboiler)
- [Sqlc](/sqlc)
- [Streaming of the Request Body](/stream-request-body)
- [Sveltekit Embed](/sveltekit-embed)
- [Tableflip (Graceful updates)](/tableflip)
- [Template Asset Bundling](/template-asset-bundling)
- [Unit Test Example](/unit-test)
- [Upload Multiple Files](/upload-file/multiple)
- [Upload Single File](/upload-file/single)
- [URL shortener API](/url-shortener-api)
- [User Auth with JWT](/auth-jwt)
- [Validation](/validation)
- [Vercel](/vercel)
- [WebSocket Chat Example](/websocket-chat)
- [WebSockets](/websocket)
<!-- AUTO-GENERATED-CONTENT:START -->
- [404 Handler](./404-handler/README.md)
- [Air Live Reloading](./air/README.md)
- [Auth + Docker + Postgres + JWT](./auth-docker-postgres-jwt/README.md)
- [Auth + JWT](./auth-jwt/README.md)
- [Autocert](./autocert/README.md)
- [AWS Elastic Beanstalk](./aws-eb/README.md)
- [AWS SAM](./aws-sam/README.md)
- [AWS SAM Container](./aws-sam-container/README.md)
- [Bootstrap](./bootstrap/README.md)
- [Clean Architecture](./clean-architecture/README.md)
- [Cloud Run](./cloud-run/README.md)
- [Colly Gorm](./colly-gorm/README.md)
- [CSRF](./csrf/README.md)
- [CSRF + Session](./csrf-with-session/README.md)
- [Docker + MariaDB](./docker-mariadb-clean-arch/README.md)
- [Docker + Nginx](./docker-nginx-loadbalancer/README.md)
- [Dummy JSON Proxy](./dummyjson/README.md)
- [Entgo ORM (MySQL)](./ent-mysql/README.md)
- [Entgo Sveltekit](./entgo-sveltekit/README.md)
- [Envoy External Authorization](./envoy-extauthz/README.md)
- [File Server](./file-server/README.md)
- [Firebase Authentication](./firebase-auth/README.md)
- [Firebase Functions](./firebase-functions/README.md)
- [Firebase GCloud](./gcloud/README.md)
- [Google Cloud Firebase](./gcloud-firebase/README.md)
- [GeoIP](./geoip/README.md)
- [GeoIP + MaxMind](./geoip-maxmind/README.md)
- [GORM](./gorm/README.md)
- [GORM MySQL](./gorm-mysql/README.md)
- [GORM + PostgreSQL](./gorm-postgres/README.md)
- [Graceful shutdown](./graceful-shutdown/README.md)
- [GraphQL](./graphql/README.md)
- [gRPC](./grpc/README.md)
- [Hello World](./hello-world/README.md)
- [Heroku](./heroku/README.md)
- [Hexagonal Architecture](./hexagonal/README.md)
- [HTTPS with PKCS12 TLS](./https-pkcs12-tls/README.md)
- [HTTPS with TLS](./https-tls/README.md)
- [I18n](./i18n/README.md)
- [JWT](./jwt/README.md)
- [Kubernetes](./k8s/README.md)
- [Memgraph](./memgraph/README.md)
- [MinIO](./minio/README.md)
- [MongoDB Example](./mongodb/README.md)
- [Multiple Ports](./multiple-ports/README.md)
- [MySQL](./mysql/README.md)
- [Neo4j](./neo4j/README.md)
- [OAuth2](./oauth2/README.md)
- [Google OAuth2](./oauth2-google/README.md)
- [Optional Parameter Example](./optional-parameter/README.md)
- [Parsley](./parsley/README.md)
- [PostgreSQL](./postgresql/README.md)
- [Prefork Example](./prefork/README.md)
- [RabbitMQ](./rabbitmq/README.md)
- [React](./react-router/README.md)
- [Recover Middleware Example](./recover/README.md)
- [RSS Feed](./rss-feed/README.md)
- [Server Timing](./server-timing/README.md)
- [Sessions + SQLite3](./sessions-sqlite3/README.md)
- [Socketio](./socketio/README.md)
- [Single Page Application (SPA)](./spa/README.md)
- [Sqlboiler](./sqlboiler/README.md)
- [Sqlc](./sqlc/README.md)
- [Server-Sent Events](./sse/README.md)
- [Stream Request Body](./stream-request-body/README.md)
- [Svelte Netlify](./svelte-netlify/README.md)
- [Sveltekit Embed](./sveltekit-embed/README.md)
- [Swagger](./swagger/README.md)
- [Tableflip Example](./tableflip/README.md)
- [Template](./template/README.md)
- [Template Asset Bundling](./template-asset-bundling/README.md)
- [Todo App + Auth + GORM](./todo-app-with-auth-gorm/README.md)
- [Unit Testing](./unit-test/README.md)
- [File Upload](./upload-file/README.md)
- [URL Shortener](./url-shortener-api/README.md)
- [Validation](./validation/README.md)
- [Vercel](./vercel/README.md)
- [WebSocket](./websocket/README.md)
- [WebSocket Chat](./websocket-chat/README.md)
<!-- AUTO-GENERATED-CONTENT:END -->

## 👩‍🍳 Have a delicious recipe?

Expand Down
7 changes: 7 additions & 0 deletions air/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
---
title: Air Live Reloading
keywords: [air, live reloading, development, air tool, hot reload, watch, changes]
---

# Live Reloading with Air Example

[![Github](https://img.shields.io/static/v1?label=&message=Github&color=2ea44f&style=for-the-badge&logo=github)](https://github.com/gofiber/recipes/tree/master/air) [![StackBlitz](https://img.shields.io/static/v1?label=&message=StackBlitz&color=2ea44f&style=for-the-badge&logo=StackBlitz)](https://stackblitz.com/github/gofiber/recipes/tree/master/air)

This example demonstrates how to set up live reloading for a Go application using the [Air](https://github.com/cosmtrek/air) tool. The purpose of this example is to show how to automatically reload your application during development whenever you make changes to the source code.

## Description
Expand Down
7 changes: 7 additions & 0 deletions auth-docker-postgres-jwt/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
---
title: Auth + Docker + Postgres + JWT
keywords: [auth, docker, postgres, jwt]
---

# Auth Docker Postgres JWT Example

[![Github](https://img.shields.io/static/v1?label=&message=Github&color=2ea44f&style=for-the-badge&logo=github)](https://github.com/gofiber/recipes/tree/master/auth-docker-postgres-jwt) [![StackBlitz](https://img.shields.io/static/v1?label=&message=StackBlitz&color=2ea44f&style=for-the-badge&logo=StackBlitz)](https://stackblitz.com/github/gofiber/recipes/tree/master/auth-docker-postgres-jwt)

This example demonstrates a boilerplate setup for a Go Fiber application that uses Docker, PostgreSQL, and JWT for authentication.

## Description
Expand Down
Loading