Step-by-step instructions for how to deploy Jury for your Hackathon
Jury is a self-hosted standalone app, meant to be used solely for judging a hackathon. Digital Ocean makes this process seamless, from providing a hosting service to allowing you to add your own resources! Before using Jury, make sure that your hackathon is using the recommended physical setup.
We will be deploying Jury on Digital Ocean’s App Platform. Jury can be built into a Docker container, which is perfect for serving on the App Platform. For our tier of App Platform, we are paying [$5/month](https://www.digitalocean.com/pricing/app-platform). This might sound like a lot, but Digital Ocean's pricing is **prorated hourly**. This means that (given 28 days in a month (if you go over it's free), 672 hours in a month) if you have the judging application up for 2 days (48 hours), you would be charged a whole... **36 cents**!!! And to make this deal even better, if you sign up with the referral link below, you get $200 in free Digital Ocean credits for 60 days.The only other external resource we need is a MongoDB Atlas Database. Luckily, MongoDB Atlas is completely free at its lowest tier, which is all we need. We have used it for events that exceed 1000 participants and 200+ projects being judged simultaneously, with no issues at all. The free database gives you 512 MB of data storage, which is plenty for text-only storage.
TL;DRYou are paying 18 cents per 24 hours of hosting, plus a database that is 100% free forever for your data.
We first need to create a MongoDB database cluster. Instructions can be found at: https://www.mongodb.com/docs/atlas/getting-started/. You should follow the Atlas UI steps 1-4.Once you have your database set up and a user added, go to (on the sidebar) Deployment > Database, then click on Connect next to your database. You should see a popup; click on Drivers and on “step 3” it shows a Connection string, which should be in the following format:
The username, url, and app-name fields should be filled in already; you just have to put the password that you set in step 3 of the MongoDB setup. This connection string will be important later, so make sure you don’t lose the password!
A common issue with MongoDB is IP addresses not being whitelisted. Go to the console, click Security > Network Access. Click Add IP Address on the right and add 0.0.0.0/0 in the “Access List Entry” field.
Click the button above to do a one-click deploy onto Digital Ocean. For full disclosure, the URL above contains my referral code, but it will get you $200 in free credits if this is your first time signing up for a Digital Ocean account. (This is enough to keep Jury running for 33 months!)Once the page loads, you should see a configuration screen with the template as Git source pointing to hackutd/jury, followed by an app settings section. Most of the settings won’t need to be touched, but we will go over the settings that need to be checked or changed in the following steps.
Under “App Settings” > “Resource Settings”, you will need to check (and update if not set correctly) the instance sizing. You should see 512 MB RAM / 1 Shared vCPU / 50 GB bandwidth, with only 1 container. This is the $5.00/month tier — make sure this is correct in the cost summary on the right.
Jury needs to send emails to judges with their judging code. Each judge will receive an email when you add them, so if you have 100 judges, then you will need to send out 100 emails (but you should account for at least double to handle situations where you have to re-send emails or try different emails for judges). There are 3 ways we recommend hosting emails:
The first method is through Gmail SMTP, which means that you simply send emails through your personal [email protected] email. This is completely free but may face issues with sending limits (2000/day), spam filtering, and email sending performance.
The second method is through Sendgrid. Many organizations already use Sendgrid, so this may be convenient for you. Note that you need to enable billing and upgrade your account if you want to send more than 100 emails in a day. Sendgrid is nice because it’s a fixed price up to a high email limit and has a separate API for sending emails outside of SMTP.
The final option that has been tested is AWS SES. This is a paid service also used by many organizations. The pricing for AWS SES is per 1000 emails, so it may be more expensive depending on how many emails you send. We use the SMTP protocol to call AWS SES’s service too.
You will have to fill out specific environmental variables for each service:If using Gmail SMTP:
Make sure you do not change the pre-filled fields. You may leave any unused fields blank (ie. if you are using Sendgrid, you do not need to fill out the EMAIL_PASSWORD field).
Optionally, you can adjust the name of the app. If you scroll down to the “Finalize” section, there is a place to name your project. The URL of your deployed application will be <app_name><some_characters>.ondigitalocean.app. You may also want to set up a custom domain name for your application (see below).
Review all of the settings to make sure it looks correct (especially the instance size). Once you make sure all settings are correct, click “Create Resources”. After the app has finished building (which may take a couple of minutes), you should be able to see the app online at the provided URL!Note that if you need to change any environmental variables, you can do so in the online Digital Ocean console (Note the app will take a few minutes to re-deploy before reflecting changes).
Follow the provided DigitalOcean guide to deploy to a custom domain name. Make sure you use Option 2: Using a CNAME Pointer if you have your own domain hosting set up.
Make sure judging is set up for Jury by reading our Physical Judging Setup page. If you would like to read what judging would roughly look like, refer to the Judging Overview page. Once everything is set up correctly, you should read through the following pages for a detailed guide on how to use every part of Jury:
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"HackUTD Docs","colors":{"primary":"#FF005E","light":"#FF005E","dark":"#FF005E"},"logo":{"light":"https://mintcdn.com/hackutd-4b592637/hoqu-ZxVO0GfFAGD/logo/light.svg?fit=max\u0026auto=format\u0026n=hoqu-ZxVO0GfFAGD\u0026q=85\u0026s=1c79ee8867844938b89ed50b3c3762e8","dark":"https://mintcdn.com/hackutd-4b592637/hoqu-ZxVO0GfFAGD/logo/dark.svg?fit=max\u0026auto=format\u0026n=hoqu-ZxVO0GfFAGD\u0026q=85\u0026s=98645baeef525a7e2da77b02533d79e0"},"favicon":"https://mintcdn.com/hackutd-4b592637/ZARendjrRfbPGy7P/favicon.svg?fit=max\u0026auto=format\u0026n=ZARendjrRfbPGy7P\u0026q=85\u0026s=d9f7db1430e59955c9ff89ff80f06bac","appearance":{"default":"light"},"navbar":{"links":[{"href":"https://github.com/hackutd","label":"GitHub"}],"primary":{"type":"button","label":"HackUTD","href":"https://hackutd.co"}},"footer":{"socials":{"x":"https://x.com/hackutd","github":"https://github.com/hackutd","instagram":"https://instagram.com/hackutd"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"hackutd-4b592637","hasAudioNarration":false,"actualSubdomain":"hackutd-4b592637","customDomains":["docs.hackutd.co"],"gitSource":{"type":"github","owner":"hackutd","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"collectionId":"f42e9537-d62f-47d2-88a4-ec7f3465137d","liveDeploymentHistoryId":"6aa2fa783a2334256df8b840","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aa2fa783a2334256df8b840"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aa2fa783a2334256df8b840","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Projects","count":53},{"language":"default","tag":"Jury","count":36},{"language":"default","tag":"Harp","count":17},{"language":"default","tag":"Technical Details","count":16},{"language":"default","tag":"Using Jury","count":15},{"language":"default","tag":"Jury Admin","count":8},{"language":"default","tag":"Frontend","count":6},{"language":"default","tag":"Features","count":5},{"language":"default","tag":"Reference","count":5},{"language":"default","tag":"Backend","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@import url(https://api.fontshare.com/v2/css?f[]=satoshi@300,400,500,700,900\u0026display=swap);:root{--hackutd-gradient:radial-gradient(\n 119.34% 84.58% at 6.07% 6.94%,\n #f4f4f4 23.56%,\n #ff005e 60.58%,\n #6c17fe 100%\n );--font-family-sans:'Satoshi', ui-sans-serif, system-ui, -apple-system,\n 'Segoe UI', sans-serif}body,button,h1,h2,h3,h4,h5,h6,html,input,select,textarea{font-family:var(--font-family-sans)!important}[data-theme=dark] body,body,html.dark body{background-attachment:fixed;background-size:cover}body{background-image:var(--hackutd-gradient)}[data-theme=dark] body,html.dark body{background-color:#1a1a1a;background-image:radial-gradient(119.34% 84.58% at 6.07% 6.94%,rgba(255,0,94,.18) 0,rgba(255,0,94,.16) 60%,rgba(108,23,254,.2) 100%)}a.brand-button{display:inline-flex;align-items:center;gap:.5rem;margin-top:.5rem;padding:.625rem 1.25rem;border-radius:.75rem;font-weight:600;color:#fff!important;text-decoration:none!important;background:#ff005e;transition:background .15s ease}a.brand-button:hover{background:#e60054}.card:hover,a[class*=card]:hover{border-color:#ff005e;box-shadow:0 8px 30px -12px rgba(255,0,94,.35)}"}],"page":{"pagePath":"jury/usage/deploy","slug":"/jury/usage/deploy","pageMetadata":{"title":"Deploying for your hackathon","sidebarTitle":"Deploying for your Hackathon","description":"Step-by-step instructions for how to deploy Jury for your Hackathon","href":"/jury/usage/deploy"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Step-by-step instructions for how to deploy Jury for your Hackathon\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,img:`img`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Jury is a self-hosted standalone app, meant to be used solely for judging a hackathon. Digital Ocean makes this process seamless, from providing a hosting service to allowing you to add your own resources! Before using Jury, make sure that your hackathon is using the `,_jsx(_components.a,{href:`/jury/usage/judging-setup`,children:`recommended physical setup`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`cost`,children:`Cost?`}),`\n`,_jsxs(_components.p,{children:[`We will be deploying Jury on `,_jsxs(_components.strong,{children:[`Digital Ocean’s `,_jsx(_components.a,{href:`https://www.digitalocean.com/products/app-platform`,children:`App Platform`})]}),`. Jury can be built into a `,_jsx(_components.a,{href:`https://www.docker.com/resources/what-container/`,children:`Docker container`}),`, which is perfect for serving on the App Platform. For our tier of App Platform, we are paying [`,`$5/month](https://www.digitalocean.com/pricing/app-platform). This might sound like a lot, but Digital Ocean's pricing is **prorated hourly**. This means that (given 28 days in a month (if you go over it's free), 672 hours in a month) if you have the judging application up for 2 days (48 hours), you would be charged a whole... **36 cents**!!! And to make this deal even better, if you sign up with the referral link below, you get $`,`200 in free Digital Ocean credits for 60 days.`]}),`\n`,_jsxs(_components.p,{children:[`The only other external resource we need is a `,_jsx(_components.a,{href:`https://www.mongodb.com/atlas/database`,children:`MongoDB Atlas Database`}),`. Luckily, MongoDB Atlas is `,_jsx(_components.strong,{children:`completely free`}),` at its lowest tier, which is all we need. We have used it for events that exceed 1000 participants and 200+ projects being judged simultaneously, with no issues at all. The free database gives you `,_jsx(_components.strong,{children:`512 MB`}),` of data storage, which is plenty for text-only storage.`]}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`TL;DR`})}),_jsxs(_components.p,{children:[`You are paying `,_jsx(_components.strong,{children:`18 cents`}),` per `,_jsx(_components.strong,{children:`24 hours`}),` of hosting, plus a database that is 100% free forever for your data.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`step-0-set-up-mongodb-atlas`,children:`Step 0. Set up MongoDB Atlas`}),`\n`,_jsxs(_components.p,{children:[`We first need to create a MongoDB database cluster. Instructions can be found at: `,_jsx(_components.a,{href:`https://www.mongodb.com/docs/atlas/getting-started/`,children:`https://www.mongodb.com/docs/atlas/getting-started/`}),`. You should follow the `,_jsx(_components.strong,{children:`Atlas UI`}),` steps 1-4.`]}),`\n`,_jsxs(_components.p,{children:[`Once you have your database set up and a user added, go to (on the sidebar) `,_jsx(_components.strong,{children:`Deployment > Database`}),`, then click on `,_jsx(_components.strong,{children:`Connect`}),` next to your database. You should see a popup; click on `,_jsx(_components.strong,{children:`Drivers`}),` and on “step 3” it shows a `,_jsx(_components.strong,{children:`Connection string`}),`, which should be in the following format:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`mongodb+srv://\u003cusername>:\u003cpassword>@\u003curl>.mongodb.net/?retryWrites=true\u0026w=majority\u0026appName=\u003capp-name>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`username`}),`, `,_jsx(_components.code,{children:`url`}),`, and `,_jsx(_components.code,{children:`app-name`}),` fields should be filled in already; you just have to put the `,_jsx(_components.code,{children:`password`}),` that you set in step 3 of the MongoDB setup. This connection string will be important later, so make sure you don’t lose the password!`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`A common issue with MongoDB is IP addresses not being whitelisted. Go to the console, click `,_jsx(_components.strong,{children:`Security > Network Access`}),`. Click `,_jsx(_components.strong,{children:`Add IP Address`}),` on the right and add `,_jsx(_components.code,{children:`0.0.0.0/0`}),` in the “Access List Entry” field.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`step-1-one-click-deploy`,children:`Step 1. One-click deploy`}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`https://cloud.digitalocean.com/apps/new?repo=https://github.com/hackutd/jury/tree/master\u0026refcode=de08cdf58df3`,children:_jsx(_components.img,{src:`https://www.deploytodo.com/do-btn-blue.svg`,alt:`Deploy to DO`})})}),`\n`,_jsxs(_components.p,{children:[`Click the button above to do a one-click deploy onto Digital Ocean. For full disclosure, the URL above contains my referral code, but it will get you `,_jsx(_components.strong,{children:`$200 in free credits`}),` if this is your first time signing up for a Digital Ocean account. (This is enough to keep Jury running for 33 months!)`]}),`\n`,_jsxs(_components.p,{children:[`Once the page loads, you should see a configuration screen with the template as `,_jsx(_components.strong,{children:`Git source`}),` pointing to `,_jsx(_components.strong,{children:`hackutd/jury`}),`, followed by an app settings section. Most of the settings won’t need to be touched, but we will go over the settings that need to be checked or changed in the following steps.`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-2-instance-size`,children:`Step 2. Instance size`}),`\n`,_jsxs(_components.p,{children:[`Under “App Settings” > “Resource Settings”, you will need to check (and update if not set correctly) the instance sizing. You should see `,_jsx(_components.strong,{children:`512 MB RAM / 1 Shared vCPU / 50 GB bandwidth`}),`, with only 1 container. This is the $5.00/month tier — make sure this is correct in the cost summary on the right.`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-3-environmental-variables`,children:`Step 3. Environmental variables`}),`\n`,_jsx(_components.p,{children:`Click on “edit” next to “jury-service” and fill in the environmental variables as follows:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`VITE_JURY_NAME`}),` - Name of the app to display to the user (eg. HackUTD X Judging)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`JURY_ADMIN_PASSWORD`}),` - Password for the admin portal (suggestion: use 2 random words)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`MONGODB_URI`}),` - URI of MongoDB Atlas instance (see step 0)`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`email-hosting`,children:`Email hosting`}),`\n`,_jsx(_components.p,{children:`Jury needs to send emails to judges with their judging code. Each judge will receive an email when you add them, so if you have 100 judges, then you will need to send out 100 emails (but you should account for at least double to handle situations where you have to re-send emails or try different emails for judges). There are 3 ways we recommend hosting emails:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`The first method is through `,_jsx(_components.a,{href:`https://support.google.com/a/answer/176600?hl=en#gmail-smtp-option`,children:_jsx(_components.strong,{children:`Gmail SMTP`})}),`, which means that you simply send emails through your personal `,_jsx(_components.code,{children:`[email protected]`}),` email. This is completely free but may face issues with sending limits (2000/day), spam filtering, and email sending performance.`]}),`\n`,_jsxs(_components.li,{children:[`The second method is through `,_jsx(_components.a,{href:`https://sendgrid.com/en-us`,children:_jsx(_components.strong,{children:`Sendgrid`})}),`. Many organizations already use Sendgrid, so this may be convenient for you. Note that you need to enable billing and `,_jsx(_components.a,{href:`https://sendgrid.com/en-us/marketing/sendgrid-services-cro`,children:`upgrade your account`}),` if you want to send more than 100 emails in a day. Sendgrid is nice because it’s a fixed price up to a high email limit and has a separate API for sending emails outside of SMTP.`]}),`\n`,_jsxs(_components.li,{children:[`The final option that has been tested is `,_jsx(_components.a,{href:`https://aws.amazon.com/ses/`,children:_jsx(_components.strong,{children:`AWS SES`})}),`. This is a paid service also used by many organizations. The pricing for AWS SES is per 1000 emails, so it may be more expensive depending on how many emails you send. We use the SMTP protocol to call AWS SES’s service too.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`You will have to fill out specific environmental variables for each service:`}),`\n`,_jsxs(_components.p,{children:[`If using `,_jsx(_components.strong,{children:`Gmail SMTP`}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_HOST`}),` = smtp.gmail.com`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_FROM`}),` = gmail username`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_USERNAME`}),` = gmail username`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_PASSWORD`}),` = `,_jsx(_components.a,{href:`https://support.google.com/accounts/answer/185833?hl=en#app-passwords`,children:`google app password`})]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`If using `,_jsx(_components.strong,{children:`SendGrid`}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`SENDGRID_API_KEY`}),` = `,_jsx(_components.a,{href:`https://docs.sendgrid.com/ui/account-and-settings/api-keys`,children:`API key`}),` provided by SendGrid`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_FROM`}),` = email to send from`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_FROM_NAME`}),` = display name of sender`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`If using `,_jsx(_components.a,{href:`https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html`,children:_jsx(_components.strong,{children:`AWS SES`})}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_HOST`}),` = `,_jsx(_components.code,{children:`email-smtp.\u003cregion>.amazonaws.com`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_FROM`}),` = verified email to send from`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_USERNAME`}),` = SES SMTP username`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`EMAIL_PASSWORD`}),` = SES SMTP password`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Make sure you `,_jsx(_components.strong,{children:`do not change the pre-filled fields`}),`. You may leave any unused fields blank (ie. if you are using Sendgrid, you do not need to fill out the `,_jsx(_components.code,{children:`EMAIL_PASSWORD`}),` field).`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-4-app-name`,children:`Step 4. App name`}),`\n`,_jsxs(_components.p,{children:[`Optionally, you can adjust the name of the app. If you scroll down to the “Finalize” section, there is a place to name your project. The URL of your deployed application will be `,_jsx(_components.code,{children:`\u003capp_name>\u003csome_characters>.ondigitalocean.app`}),`. You may also want to set up a custom domain name for your application (see `,_jsx(_components.a,{href:`#custom-domain-name`,children:`below`}),`).`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-5-done`,children:`Step 5. Done!`}),`\n`,_jsx(_components.p,{children:`Review all of the settings to make sure it looks correct (especially the instance size). Once you make sure all settings are correct, click “Create Resources”. After the app has finished building (which may take a couple of minutes), you should be able to see the app online at the provided URL!`}),`\n`,_jsx(_components.p,{children:`Note that if you need to change any environmental variables, you can do so in the online Digital Ocean console (Note the app will take a few minutes to re-deploy before reflecting changes).`}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsx(Heading,{level:`3`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(_components.p,{children:[`If you have any issues with setting up Jury, please feel free to reach out to me (`,_jsx(_components.a,{href:`mailto:[email protected]`,children:`Michael Zhao`}),`).`]}),`\n`,_jsx(Heading,{level:`3`,id:`custom-domain-name`,children:`Custom domain name`}),`\n`,_jsxs(_components.p,{children:[`Follow the provided DigitalOcean guide to deploy to a `,_jsx(_components.a,{href:`https://docs.digitalocean.com/products/app-platform/how-to/manage-domains/`,children:`custom domain name`}),`. Make sure you use `,_jsx(_components.strong,{children:`Option 2: Using a CNAME Pointer`}),` if you have your own domain hosting set up.`]}),`\n`,_jsx(Heading,{level:`3`,id:`continue-reading`,children:`Continue reading`}),`\n`,_jsxs(_components.p,{children:[`Make sure judging is set up for Jury by reading our `,_jsx(_components.a,{href:`/jury/usage/judging-setup`,children:`Physical Judging Setup`}),` page. If you would like to read what judging would roughly look like, refer to the `,_jsx(_components.a,{href:`/jury/usage/overview`,children:`Judging Overview`}),` page. Once everything is set up correctly, you should read through the following pages for a detailed guide on how to use every part of Jury:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/jury/usage/admin/introduction`,children:`Jury Admin`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/jury/usage/judge`,children:`Jury Judge Interface`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/jury/usage/expo`,children:`Jury Project Expo`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Deploying for your hackathon","sidebarTitle":"Deploying for your Hackathon","description":"Step-by-step instructions for how to deploy Jury for your Hackathon","href":"/jury/usage/deploy"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Cost?","slug":"cost","depth":3,"children":[]},{"title":"Step 0. Set up MongoDB Atlas","slug":"step-0-set-up-mongodb-atlas","depth":2,"children":[]},{"title":"Step 1. One-click deploy","slug":"step-1-one-click-deploy","depth":2,"children":[]},{"title":"Step 2. Instance size","slug":"step-2-instance-size","depth":2,"children":[]},{"title":"Step 3. Environmental variables","slug":"step-3-environmental-variables","depth":2,"children":[{"title":"Email hosting","slug":"email-hosting","depth":3,"children":[]}]},{"title":"Step 4. App name","slug":"step-4-app-name","depth":2,"children":[]},{"title":"Step 5. Done!","slug":"step-5-done","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[{"title":"Troubleshooting","slug":"troubleshooting","depth":3,"children":[]},{"title":"Custom domain name","slug":"custom-domain-name","depth":3,"children":[]},{"title":"Continue reading","slug":"continue-reading","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"subdomain":"hackutd-4b592637","siteName":"HackUTD Docs","title":"Deploying for your hackathon - HackUTD Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-10T18:44:28.074Z","originalFileLocation":"jury/usage/deploy.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Step-by-step instructions for how to deploy Jury for your Hackathon\">\u003cmeta data-mint-head name=\"application-name\" content=\"HackUTD Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Deploying for your hackathon - HackUTD Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Step-by-step instructions for how to deploy Jury for your Hackathon\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"HackUTD Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.hackutd.co/jury/usage/deploy\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://hackutd-4b592637.mintlify.app/_mintlify/api/og/v2?division=Using+Jury\u0026amp;title=Deploying+for+your+hackathon\u0026amp;description=Step-by-step+instructions+for+how+to+deploy+Jury+for+your+Hackathon\u0026amp;theme=9fdcd517c1b1a39ceee3867d\u0026amp;signature=8775f93f6729f94013d6bf96c68ebdb5cc654604a55098c1329da97fddbc3c79\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Deploying for your hackathon - HackUTD Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Step-by-step instructions for how to deploy Jury for your Hackathon\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://hackutd-4b592637.mintlify.app/_mintlify/api/og/v2?division=Using+Jury\u0026amp;title=Deploying+for+your+hackathon\u0026amp;description=Step-by-step+instructions+for+how+to+deploy+Jury+for+your+Hackathon\u0026amp;theme=9fdcd517c1b1a39ceee3867d\u0026amp;signature=8775f93f6729f94013d6bf96c68ebdb5cc654604a55098c1329da97fddbc3c79\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/hackutd-4b592637/LROUZ2RpuPUTwONY/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"HackUTD Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF005E\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.hackutd.co/jury/usage/deploy\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/jury/usage/deploy.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.hackutd.co/#organization\",\"name\":\"HackUTD Docs\",\"url\":\"https://docs.hackutd.co\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/hackutd-4b592637/hoqu-ZxVO0GfFAGD/logo/light.svg?fit=max\u0026auto=format\u0026n=hoqu-ZxVO0GfFAGD\u0026q=85\u0026s=1c79ee8867844938b89ed50b3c3762e8\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.hackutd.co#website\",\"name\":\"HackUTD Docs\",\"url\":\"https://docs.hackutd.co\",\"publisher\":{\"@id\":\"https://docs.hackutd.co/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.hackutd.co/jury/usage/deploy#webpage\",\"url\":\"https://docs.hackutd.co/jury/usage/deploy\",\"name\":\"Deploying for your hackathon\",\"description\":\"Step-by-step instructions for how to deploy Jury for your Hackathon\",\"dateModified\":\"2026-09-10T18:44:28.074Z\",\"isPartOf\":{\"@id\":\"https://docs.hackutd.co#website\"},\"breadcrumb\":{\"@id\":\"https://docs.hackutd.co/jury/usage/deploy#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.hackutd.co/jury/usage/deploy#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Projects\",\"item\":\"https://docs.hackutd.co/jury/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jury\",\"item\":\"https://docs.hackutd.co/jury/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Using Jury\",\"item\":\"https://docs.hackutd.co/jury/usage/introduction\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Deploying for your hackathon\",\"item\":\"https://docs.hackutd.co/jury/usage/deploy\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.hackutd.co/jury/usage/deploy#article\",\"headline\":\"Deploying for your hackathon\",\"name\":\"Deploying for your hackathon\",\"description\":\"Step-by-step instructions for how to deploy Jury for your Hackathon\",\"url\":\"https://docs.hackutd.co/jury/usage/deploy\",\"mainEntityOfPage\":{\"@id\":\"https://docs.hackutd.co/jury/usage/deploy#webpage\"},\"dateModified\":\"2026-09-10T18:44:28.074Z\",\"publisher\":{\"@id\":\"https://docs.hackutd.co/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.hackutd.co#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"HackUTD Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"HackUTD Docs","nav":{"global":null,"pages":[{"group":"Getting Started","pages":[{"title":"Introduction","href":"/index"}]},{"group":"Projects","pages":[{"group":"Jury","pages":[{"title":"Overview","href":"/jury/overview"},{"group":"Using Jury","pages":[{"title":"Using Jury","description":"Instructions on how to use Jury","href":"/jury/usage/introduction"},{"title":"Deploying for your hackathon","sidebarTitle":"Deploying for your Hackathon","href":"/jury/usage/deploy"},{"title":"Physical judging setup","sidebarTitle":"Physical Judging Setup","description":"How to set up the physical judging space to use Jury","href":"/jury/usage/judging-setup"},{"title":"Judging overview","sidebarTitle":"Judging Overview","href":"/jury/usage/overview"},{"group":"Jury Admin","pages":[{"title":"Using the admin interface","sidebarTitle":"Jury Admin","href":"/jury/usage/admin/introduction"},{"title":"Configuration and settings","sidebarTitle":"Configuration","href":"/jury/usage/admin/configuration"},{"title":"Adding projects","sidebarTitle":"Adding Projects","href":"/jury/usage/admin/add-projects"},{"title":"Adding judges","sidebarTitle":"Adding Judges","href":"/jury/usage/admin/add-judges"},{"title":"Score aggregation","sidebarTitle":"Score Aggregation","href":"/jury/usage/admin/scoring"},{"title":"Judging tracks (challenges)","sidebarTitle":"Tracks","href":"/jury/usage/admin/tracks"},{"title":"Judging with multiple groups","sidebarTitle":"Groups","href":"/jury/usage/admin/groups"},{"title":"Admin dashboard","sidebarTitle":"Admin Dashboard","href":"/jury/usage/admin/dashboard"}]},{"title":"Judge interface","sidebarTitle":"Judge Interface","href":"/jury/usage/judge"},{"title":"Project expo","sidebarTitle":"Project Expo","href":"/jury/usage/expo"},{"title":"Tips and contingencies","sidebarTitle":"Tips and Contingencies","href":"/jury/usage/tips"}]},{"title":"Contributing","href":"/jury/contributing"},{"group":"Technical Details","pages":[{"title":"Technical details","sidebarTitle":"Overview","href":"/jury/details/overview"},{"title":"Jury core development principles","sidebarTitle":"Core Principles","href":"/jury/details/principles"},{"group":"Frontend","pages":[{"title":"Frontend","sidebarTitle":"Introduction","href":"/jury/details/frontend/introduction"},{"title":"Routing (specifically React Routing)","sidebarTitle":"Routing","href":"/jury/details/frontend/routing"},{"title":"Components","href":"/jury/details/frontend/components"},{"title":"Styling","href":"/jury/details/frontend/styling"},{"title":"Calling backend API","sidebarTitle":"Calling Backend API","href":"/jury/details/frontend/api"},{"title":"Zustand store","sidebarTitle":"Zustand Store","href":"/jury/details/frontend/store"}]},{"group":"Backend","pages":[{"title":"Backend","sidebarTitle":"Introduction","href":"/jury/details/backend/introduction"},{"title":"File structure","sidebarTitle":"File Structure","href":"/jury/details/backend/structure"},{"title":"API","href":"/jury/details/backend/api"},{"title":"MongoDB database","sidebarTitle":"Database","href":"/jury/details/backend/database"},{"title":"Logging","href":"/jury/details/backend/logging"}]},{"group":"Development Notes","pages":[{"title":"Development notes","sidebarTitle":"Introduction","href":"/jury/details/development/introduction"},{"title":"Github","href":"/jury/details/development/github"},{"title":"Documentation","href":"/jury/details/development/docs"}]}]},{"group":"Reference","pages":[{"title":"Public API","href":"/jury/reference/public-api"},{"title":"Internal API","href":"/jury/reference/internal-api"},{"title":"Environmental variables","sidebarTitle":"Environmental Variables","href":"/jury/reference/envs"}]}]},{"group":"Harp","pages":[{"title":"Overview","href":"/harp/overview"},{"title":"Why Harp?","href":"/harp/why-harp"},{"group":"Features","pages":[{"title":"Hacker experience","href":"/harp/features/hackers"},{"title":"Applications \u0026 review","href":"/harp/features/applications"},{"title":"Event-day operations","href":"/harp/features/event-day"},{"title":"Content \u0026 public site","href":"/harp/features/public-content"},{"title":"Administration \u0026 reset","href":"/harp/features/administration"}]},{"title":"Architecture","href":"/harp/architecture"},{"group":"Adopting Harp","pages":[{"title":"Adoption guide","href":"/harp/adoption/guide"},{"title":"Forking \u0026 staying upstream","href":"/harp/adoption/forking"},{"title":"The marketing site","href":"/harp/adoption/marketing-site"}]},{"group":"Deployment","pages":[{"title":"Local development","href":"/harp/deployment/local"},{"title":"Production deployment","href":"/harp/deployment/production"},{"title":"Environment variables","href":"/harp/deployment/environment"}]},{"group":"Reference","pages":[{"title":"Public content API","href":"/harp/reference/public-api"},{"title":"Migrations for forks","href":"/harp/reference/migrations"}]},{"title":"Contributing","href":"/harp/contributing"}]}]}]},"basePath":"","title":"Deploying for your hackathon - HackUTD Docs","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-eHyQ0tlO.js","lightbox-handle-r17bVUz3.js"]}