TenderHub is a full-stack React-based web application built with TypeScript and React, designed for browsing, sharing, and downloading tender documents. Users can create organizations, share tenders, view tender details, sort and filter, add to favorites, delete, and more features like Communicating with all documents using Generative AI coming soon.
β¨ Functionality:
- Browse a list of available tenders
- View tender details including title, description, and submission deadline
- Download tender documents
- Advanced search functionality to filter tenders based on keywords
- User authentication and authorization with Clerk
- Users can create organizations, share tenders, add favorites, delete, and more
- Professional database setup and deployment using Convex
- Ability to Communicate with all tenders in realtime using Generative AI.
coming soon.
π₯οΈ User Interface:
- Clean and user-friendly interface designed with React components
- Responsive design for different screen sizes (desktop, tablet, mobile)
- Error Handling with Zod and React Hook Forms
- Custom Modals and Hooks that work on any device
Follow this Documentation to set up the project locally:
git clone https://github.com/mcakyerima/full_stack_tender_download_system.gitcd full_stack_tender_download_system- In the vscode terminal, run this command to install dependencies and libraries
npm installAfter the dependencies installation is finished, open a second new terminal in vscode and run this command
npx convex devThis command will open the Convex CLI and ask you to select your Device name. After that, it will open the browser to verify your CLI and sign you up. Preferably, you should log in with GitHub. After running this command, Convex will run all the schemas, schema tests, and validations written in the Convex directory, and it will automatically create the database in your Convex dashboard in the cloud.
The npx convex dev command will also create a .env.local file in the root of your project containing your CONVEX_DEPLOYMENT and NEXT_PUBLIC_CONVEX_URL
Example:
# Deployment used by `npx convex dev`
CONVEX_DEPLOYMENT=dev:clear-swordfish-343 # your convex deployment link
NEXT_PUBLIC_CONVEX_URL=https://clear-swordfish-343.convex.cloud
-
Go to Clerk and sign up
-
Create a new project and give it a name of your choice
-
Choose a Login method of your choice, preferably email and Google.
-
In the next page, Copy your environment variables and ignore the rest of the settings.

-
Paste the environment variable to the
.env.localfile created byConvexin the root of your project.
-
Click on
New templateand selectConvexin the list of available templates.
-
This will take you to the
issuer keypage, Copy theIssuer key
-
Save it your environment variables with this exact variable name.
CLERK_DOMAIN=https://<your issuer key>
We need a webhook to communicate from Clerk to our backend. This is needed so that our backend will know when a new user or organization is created, then it will trigger a mutation event and save our users or organizations to our database automatically. Let's configure our Webhook with Clerk.
-
After pasting the
Issuerkey to your.env.localfile, click onWebhooksin the sidebar ofClerk. and Click onAdd Endpoint
-
Next, we need to do a little trick here to create our app's endpoint that will communicate with the Clerk
Webhook. We need to extract ourCONVEX_DEPLOYMENTURL and then add.convex.site/clerkto it. We can get ourconvex endpointin the.env.localfile and create thewebhookendpoint like this below:
-
Next, we need to add the
URLto the ClerkEndpoint URLlike this:
-
After adding the endpoint URL, scroll down and choose the events that we will like Clerk to
POSTto our app. We only need theorganizationMembership.createdanduser.createdso that we get notified when a new user or organization is created. -
Next, click on
Create. This will create the options and also create aSigning Secretthat we shouldCopyand add to ourConvexDashboard later as ourCLERK_WEBHOOK_SECRETenvironment variable.
-
Finally, before moving on to Setting up
Convex, we need to Enable organizations because organizations are disabled by default. -
After copying the
Signing Secret, Click onOrganizationson the sidebar and thenEnable organizations
Before we launch our app, we need to do some configurations to our backend.
- Login to convex Convex with the GitHub account you used to create your project in the Convex CLI

This will take you to your dashboard where you will see the project you created in your terminal

-Let's navigate to the settings page on the side bar.

- Select
Environment Variablesand Create an environment variableCLERK_WEBHOOK_SECRETand paste in the ClerkSigning Secretobtained earlier in the ClerkWebhook page. - We also need to copy the
CLERK_DOMAINwhich we earlier added to our.env.localin the root of our project and add it to the Clerk environment variable as well. It should look like something like this.
If everything is set according to this documentation, you should see this in the Data route of your Convex Dashboard.

- Go to your code editor and run this command.
npm run dev dev- Should you need any clarification while setting up this project, please reach out to me at any time, and I am ever ready to be there for you.



