We would like to welcome you to the community! Thanks for being a part of the team!
Cheer,
${addressFrom.name}
Repository: sahat/hackathon-starter
Branch: master
Commit: 7453b92b4c78
Files: 144
Total size: 1.7 MB
Directory structure:
gitextract_js3nbrx3/
├── .gitattributes
├── .github/
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── build.yml
│ └── dependabot-automerge.yml
├── .gitignore
├── .husky/
│ └── pre-commit
├── .prettierignore
├── .prettierrc
├── CHANGELOG.md
├── LICENSE
├── PROD_CHECKLIST.md
├── README.md
├── SECURITY.md
├── app.js
├── config/
│ ├── flash.js
│ ├── morgan.js
│ ├── nodemailer.js
│ ├── passport.js
│ └── token-revocation.js
├── controllers/
│ ├── ai-agent.js
│ ├── ai.js
│ ├── api.js
│ ├── contact.js
│ ├── home.js
│ ├── user.js
│ └── webauthn.js
├── eslint.config.mjs
├── models/
│ ├── Session.js
│ └── User.js
├── package.json
├── patches/
│ ├── passport+0.7.0.patch
│ ├── passport-oauth1+1.3.0.patch
│ └── passport-oauth2+1.8.0.patch
├── public/
│ ├── css/
│ │ └── main.scss
│ ├── js/
│ │ ├── lib/
│ │ │ └── .gitkeep
│ │ └── main.js
│ ├── privacy-policy.html
│ └── terms-of-use.html
├── test/
│ ├── TESTING.md
│ ├── app-links.test.js
│ ├── app.test.js
│ ├── auth.opt.test.js
│ ├── contact.test.js
│ ├── docs-links.test.js
│ ├── e2e/
│ │ ├── chart.e2e.test.js
│ │ ├── foursquare.e2e.test.js
│ │ ├── giphy.e2e.test.js
│ │ ├── google-maps.e2e.test.js
│ │ ├── here-maps.e2e.test.js
│ │ ├── llm-classifier.e2e.test.js
│ │ ├── lob.e2e.test.js
│ │ ├── nyt.e2e.test.js
│ │ ├── openai-moderation.e2e.test.js
│ │ ├── rag.e2e.test.js
│ │ ├── trakt.e2e.test.js
│ │ └── twilio.e2e.test.js
│ ├── e2e-nokey/
│ │ ├── github-api.e2e.test.js
│ │ ├── lastfm.e2e.test.js
│ │ ├── pubchem.e2e.test.js
│ │ ├── scraping.e2e.test.js
│ │ ├── upload.e2e.test.js
│ │ └── wikipedia.e2e.test.js
│ ├── fixtures/
│ │ ├── GET_https%3A%2F%2Fapi.giphy.com%2Fv1%2Fgifs%2Fsearch%3Fq%3DHappy%26limit%3D20%26offset%3D0%26rating%3Dg%26lang%3Den.json
│ │ ├── GET_https%3A%2F%2Fapi.giphy.com%2Fv1%2Fgifs%2Fsearch%3Fq%3Dfunny%2Bcat%26limit%3D20%26offset%3D0%26rating%3Dg%26lang%3Den.json
│ │ ├── GET_https%3A%2F%2Fapi.github.com%2Frepos%2Fsahat%2Fhackathon-starter%2Fstargazers%3Fper_page%3D10.json
│ │ ├── GET_https%3A%2F%2Fapi.github.com%2Frepos%2Fsahat%2Fhackathon-starter.json
│ │ ├── GET_https%3A%2F%2Fapi.nytimes.com%2Fsvc%2Fbooks%2Fv3%2Flists%2Fcurrent%2Fyoung-adult-hardcover.json.json
│ │ ├── GET_https%3A%2F%2Fapi.trakt.tv%2Fmovies%2Fmercy-2026%3Fextended%3Dfull%252Cimages.json
│ │ ├── GET_https%3A%2F%2Fapi.trakt.tv%2Fmovies%2Ftrending%3Flimit%3D6%26extended%3Dimages.json
│ │ ├── GET_https%3A%2F%2Fen.wikipedia.org%2Fw%2Fapi.php%3Faction%3Dparse%26format%3Djson%26origin%3D_%26page%3DNode.js%26prop%3Dsections.json
│ │ ├── GET_https%3A%2F%2Fen.wikipedia.org%2Fw%2Fapi.php%3Faction%3Dquery%26format%3Djson%26origin%3D_%26list%3Dsearch%26srsearch%3Djavascript%26srlimit%3D10.json
│ │ ├── GET_https%3A%2F%2Fen.wikipedia.org%2Fw%2Fapi.php%3Faction%3Dquery%26format%3Djson%26origin%3D_%26prop%3Dextracts%26explaintext%3D1%26titles%3DNode.js%26exintro%3D1.json
│ │ ├── GET_https%3A%2F%2Fen.wikipedia.org%2Fw%2Fapi.php%3Faction%3Dquery%26format%3Djson%26origin%3D_%26prop%3Dpageimages%257Cpageterms%26titles%3DNode.js%26pithumbsize%3D400.json
│ │ ├── GET_https%3A%2F%2Fplaces-api.foursquare.com%2Fplaces%2F427ea800f964a520b1211fe3.json
│ │ ├── GET_https%3A%2F%2Fplaces-api.foursquare.com%2Fplaces%2Fsearch%3Fll%3D47.609657%252C-122.342148%26limit%3D10.json
│ │ ├── GET_https%3A%2F%2Fpubchem.ncbi.nlm.nih.gov%2Frest%2Fpug%2Fcompound%2Fcid%2F2244%2FJSON.json
│ │ ├── GET_https%3A%2F%2Fpubchem.ncbi.nlm.nih.gov%2Frest%2Fpug%2Fcompound%2Fcid%2F2244%2Fsynonyms%2FJSON.json
│ │ ├── GET_https%3A%2F%2Fpubchem.ncbi.nlm.nih.gov%2Frest%2Fpug_view%2Fdata%2Fcompound%2F2244%2FJSON%3Fheading%3DSafety%2Band%2BHazards.json
│ │ ├── GET_https%3A%2F%2Fpubchem.ncbi.nlm.nih.gov%2Frest%2Fpug_view%2Fdata%2Fcompound%2F2244%2FJSON%3Fheading%3DUse%2Band%2BManufacturing.json
│ │ ├── GET_https%3A%2F%2Fwww.alphavantage.co%2Fquery%3Ffunction%3DTIME_SERIES_DAILY%26symbol%3DMSFT%26outputsize%3Dcompact.json
│ │ ├── POST_https%3A%2F%2Fapi.openai.com%2Fv1%2Fmoderations_624f7df3dc5f.json
│ │ ├── POST_https%3A%2F%2Fapi.openai.com%2Fv1%2Fmoderations_c6b4d54f3bd4.json
│ │ └── fixture_manifest.json
│ ├── flash.test.js
│ ├── models.test.js
│ ├── morgan.test.js
│ ├── nodemailer.test.js
│ ├── passport.test.js
│ ├── playwright.config.js
│ ├── token-revocation.test.js
│ ├── tools/
│ │ ├── fixture-helpers.js
│ │ ├── playwright-start-and-log.js
│ │ ├── server-axios-fixtures.js
│ │ ├── server-fetch-fixtures.js
│ │ ├── simple-link-image-check.js
│ │ └── start-with-memory-db.js
│ └── webauthn.test.js
└── views/
├── account/
│ ├── forgot.pug
│ ├── login.pug
│ ├── profile.pug
│ ├── reset.pug
│ ├── signup.pug
│ ├── totp-setup.pug
│ ├── two-factor.pug
│ ├── webauthn-login.pug
│ └── webauthn-register.pug
├── ai/
│ ├── ai-agent.pug
│ ├── index.pug
│ ├── llm-camera.pug
│ ├── llm-classifier.pug
│ ├── openai-moderation.pug
│ └── rag.pug
├── api/
│ ├── chart.pug
│ ├── facebook.pug
│ ├── foursquare.pug
│ ├── giphy.pug
│ ├── github.pug
│ ├── google-drive.pug
│ ├── google-maps.pug
│ ├── google-sheets.pug
│ ├── here-maps.pug
│ ├── index.pug
│ ├── lastfm.pug
│ ├── lob.pug
│ ├── nyt.pug
│ ├── paypal.pug
│ ├── pubchem.pug
│ ├── quickbooks.pug
│ ├── scraping.pug
│ ├── steam.pug
│ ├── stripe.pug
│ ├── trakt.pug
│ ├── tumblr.pug
│ ├── twilio.pug
│ ├── twitch.pug
│ ├── upload.pug
│ └── wikipedia.pug
├── contact.pug
├── home.pug
├── layout.pug
└── partials/
├── flash.pug
├── footer.pug
└── header.pug
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Checklist
- [ ] I acknowledge that submissions that include copy-paste of AI-generated content taken at face value (PR text, code, commit message, documentation, etc.) most likely have errors and hence will be rejected entirely and marked as spam or invalid
- [ ] I manually tested the change with a running instance, DB, and valid API keys where applicable
- [ ] Added/updated tests if the existing tests do not cover this change
- [ ] README or other relevant docs are updated
- [ ] `--no-verify` was not used for the commit(s)
- [ ] `npm run lint` passed locally without any errors
- [ ] `npm test` passed locally without any errors
- [ ] `npm run test:e2e:replay` passed locally without any errors
- [ ] `npm run test:e2e:custom -- --project=chromium-nokey-live` passed locally without any errors
- [ ] PR diff does not include unrelated changes
- [ ] PR title follows Conventional Commits — https://www.conventionalcommits.org/en
## Description
## Screenshots of UI changes (browser) and logs/test results (console, terminal, shell, cmd)
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: npm
directory: '/'
schedule:
interval: 'daily'
target-branch: 'master'
open-pull-requests-limit: 10
versioning-strategy: increase
commit-message:
prefix: 'chore'
include: 'scope'
groups:
major-updates:
update-types: ['major']
minor-updates:
update-types: ['minor']
patch-updates:
update-types: ['patch']
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'monthly'
target-branch: 'master'
open-pull-requests-limit: 3
commit-message:
prefix: 'chore'
include: 'scope'
================================================
FILE: .github/workflows/build.yml
================================================
name: Node.js CI
on:
push:
branches: ['master']
pull_request:
branches: ['master']
permissions:
contents: read
pull-requests: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: ${{ matrix.os }}
env:
RUN_E2E: ${{ vars.RUN_E2E }} # from repository settings -> Actions -> Variables
strategy:
matrix:
node-version: [24.x]
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v6
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm install
- run: npm run lint-check
- run: npm run test
# For testing in Windows CI, we need to limit the path to exclude the additional executables
# that the default github runner has, but are not on a vanilla Windows OS installation.
- if: ${{ (env.RUN_E2E == 'true' || github.repository == 'sahat/hackathon-starter') && matrix.os == 'windows-latest' }}
env:
PATH: 'C:\Windows\System32;C:\Windows'
run: npm run test:e2e:replay
# if not Windows, run normally
- if: ${{ (env.RUN_E2E == 'true' || github.repository == 'sahat/hackathon-starter') && matrix.os != 'windows-latest' }}
run: npm run test:e2e:replay
- name: Upload tmp as an artifact (Playwrite artifacts, code coverage report, etc)
if: always()
uses: actions/upload-artifact@v7
with:
name: tmp-artifacts-${{ matrix.os }}-${{ github.job }}-${{ github.run_id }}
path: tmp/**
================================================
FILE: .github/workflows/dependabot-automerge.yml
================================================
name: Dependabot Automerge
on:
workflow_run:
workflows: ['Node.js CI']
types: [completed]
permissions:
contents: write
pull-requests: write
jobs:
dependabot-automerge:
if: >
github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.actor.login == 'dependabot[bot]'
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Automerge Dependabot PRs if all checks have passed
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUM: ${{ fromJSON(toJson(github.event.workflow_run.pull_requests))[0].number }}
REPO: ${{ github.repository }}
run: |
echo "Attempting to merge PR #${PR_NUM} in ${REPO}"
gh pr merge "$PR_NUM" --squash --admin
Sync-patches-after-dependabot-automerge:
needs: [dependabot-automerge]
runs-on: ubuntu-latest
env:
RUN_E2E: ${{ vars.RUN_E2E }} # from repository settings -> Actions -> Variables
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: master
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 'lts/*'
cache: 'npm'
- name: Rename patch-package files to match current versions
id: rename-patches
shell: bash
run: |
shopt -s nullglob
get_version() {
jq -r ".dependencies[\"$1\"] // .devDependencies[\"$1\"]" package.json
}
CHANGED=0
for PATCH in patches/*.patch; do
BASE=$(basename "$PATCH" .patch)
NAME_WITHOUT_VERSION="${BASE%+*}"
if [[ "$NAME_WITHOUT_VERSION" == @*+* ]]; then
PACKAGE="${NAME_WITHOUT_VERSION/+//}"
else
PACKAGE="$NAME_WITHOUT_VERSION"
fi
VERSION=$(get_version "$PACKAGE")
if [ "$VERSION" == "null" ]; then
echo "Skipping $PACKAGE — not found in package.json"
continue
fi
VERSION="${VERSION#^}"
NEW_NAME="$(echo "$PACKAGE" | sed 's|/|+|g')+${VERSION}.patch"
if [ "$BASE.patch" != "$NEW_NAME" ]; then
echo "Renaming $BASE.patch -> $NEW_NAME"
git mv "$PATCH" "patches/$NEW_NAME"
CHANGED=1
fi
done
# Expose whether any files changed as a step output so it can be safely
# referenced by later step `if` conditions without static analyzer warnings.
echo "changed=$CHANGED" >> $GITHUB_OUTPUT
- name: Install dependencies
if: ${{ steps.rename-patches.outputs.changed == '1' }}
run: npm ci
- name: Run tests
if: ${{ steps.rename-patches.outputs.changed == '1' }}
run: npm test
- name: Run e2e tests
if: ${{ steps.rename-patches.outputs.changed == '1' && (env.RUN_E2E == 'true' || github.repository == 'sahat/hackathon-starter') }}
run: npm run test:e2e:replay
- name: Run e2e tests that don't require API keys against live APIs
if: ${{ steps.rename-patches.outputs.changed == '1' && (env.RUN_E2E == 'true' || github.repository == 'sahat/hackathon-starter') }}
run: npm run test:e2e:custom -- --project=chromium-nokey-live
- name: Commit and push patch renames
if: ${{ steps.rename-patches.outputs.changed == '1' }}
run: |
git config user.name "github-actions"
git config user.email "github-actions@github.com"
git add patches/
git commit -m "chore: sync patch-package filenames with current versions"
git push
================================================
FILE: .gitignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz
*.swp
pids
logs
results
tmp
# Optional npm cache directory
.npm
#Build
public/css/main.css
.nyc_output/*
# API keys and secrets
.env
.env.example
test/.env.test
# Dependency directory
node_modules
bower_components
# Uploads
uploads
# Ingestion folders
rag_input
# Editors
.idea
.vscode
*.iml
modules.xml
*.ipr
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# OS metadata
.DS_Store
Thumbs.db
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
================================================
FILE: .husky/pre-commit
================================================
#!/bin/sh
# Save the list of currently staged files
STAGED_FILES=$(git diff --cached --name-only)
# Check for staged files with unstaged modifications
MODIFIED_FILES=$(git diff --name-only)
# Find files that overlap between staged and modified without using process substitution
CONFLICTING_FILES=""
for file in $STAGED_FILES; do
if echo "$MODIFIED_FILES" | grep -qx "$file"; then
CONFLICTING_FILES="$CONFLICTING_FILES$file\n"
fi
done
# Abort if there are conflicts
if [ -n "$CONFLICTING_FILES" ]; then
echo "Error: The following staged files have unstaged modifications, which can cause issues with the pre-commit eslint fix and prettier rewrite execution:"
echo -e "$CONFLICTING_FILES" # Use -e for newline interpretation in echo
echo "Please stage the changes or reset them before committing."
echo "If this is a temporary local commit, you can also use the --no-verify flag to bypass the pre-commit test and linting. i.e. 'git commit --no-verify'"
exit 1 # Abort commit
fi
# Run tests and linting
npm test
npm run lint
# Re-stage files after lint fixes (only staged files)
# Use a portable alternative for xargs
echo "$STAGED_FILES" | while IFS= read -r file; do
if [ -f "$file" ]; then
git add "$file"
fi
done
================================================
FILE: .prettierignore
================================================
# Ignore artifacts:
build
coverage
================================================
FILE: .prettierrc
================================================
{
"plugins": ["@prettier/plugin-pug"],
"singleQuote": true,
"printWidth": 300
}
================================================
FILE: CHANGELOG.md
================================================
# Changelog
---
### 10.0.0 (February 08, 2026)
New AI and Integration Features
- AI: AI Agent (ReAct: Reasoning+Acting) boilerplate with LangChain as a starting point for AI Agent development with support for:
- Tool execution with automatic retry middleware for transient failures
- MongoDB session persistence for chat history for authenticated users
- Input guardrails for safety against prompt injection/jailbreak (Llama Guard 4)
- Conversation summarization for long conversations to stay within context limits
- Real-time streaming for live response chat experience using Server-Sent Events (SSE)
- Streaming of the Agent's internal chatter, tool calls, etc., for debugging
- AI: RAG boilerplate (LangChain, Huggingface, Groq (Llama 3.3), MongoDB Vector Search, Keyv caching)
- AI: Serverless LLM integration - text classification (Llama 3.3 hosted on Groq)
- AI: Vision - device camera and LLM vision model usage (Llama 4 Scout hosted on Groq)
- AI: OpenAI Moderation model usage example
- API Integration: trakt.tv
- API Integration: Wikipedia (@nikeshadhikari9)
- API Integration: Pubchem chemical info data source (@hemanthsavasere)
- API Integration: ~~Tenor~~ GIPHY (@DanielLuu122 @YasharF)
New Core Features
- 2FA via email and code generator apps (TOTP)
- Login with passkeys (biometrics, Face ID, etc.)
- Passwordless authentication (login via email link)
- OAuth token revocation (RFC 7009-style and provider-specific variants) when users unlink an OAuth provider or delete their account
- Login with Discord
- Login with Microsoft (@dev-shahed)
- Multiple profile picture support
Enhancements
- Enhanced Express.js logging with custom Morgan configuration
- Reduced startup friction for new projects by making reCAPTCHA credentials optional
- Consolidated the AI integrations to be separate from API integrations
- Refactored Passport.js strategies to use a common auth-login handler for easier swapping of OAuth providers, maintenance, and core testing
- Updated the included sample Terms of Service and Privacy Policy for formatting and compliance with Google and Facebook requirements
- Various visual and UX improvements
- Improved pre-commit hook scripts for running `eslint --fix` and `Prettier --write` on files being committed
- Consolidated temporary artifacts in tmp/
Bug Fixes
- Fix Facebook OAuth: missing email scope, and infinite loop in certain cases
- Fix upload folder being created in controllers/ instead of the app root
- Fix error handling issues in Google Sheets and Google Drive integration
- Fix various npm script-related issues for Windows development environments
- Fix error from not having husky installed in production environments when using `npm ci --omit dev`
Chores & Maintenance
- Replaced unmaintained express-flash npm package with our own middleware (@Prasanth-S7)
- Replaced moment.js in favor of the native Node.js date API
- Updated minimum engine to Node.js 24.13 which is the latest fully security-patched LTS version.
- Updated dependencies
- Improved dependabot and GitHub Action scripts to automate keeping dependencies up-to-date.
- Updated Google Maps API integration
- Updated Google branding per their requirements
- Updated NYT API integration to use v3 endpoint
- Updated QuickBooks API integration per required changes
- Migrated Foursquare API integration to use the new Places API endpoints (@mheavey2)
- Migrated reCAPTCHA to GCP
- Removed Pinterest OAuth and API Integration
- Removed SendGrid references as they no longer offer a reasonable free tier for hackathon participants (@nylla8444)
- Removed lodash dependency, as much of the functionality can be fulfilled with current versions of JS with minimal code.
- Removed Airbnb eslint (fork) usage in favor of direct rules within eslint 9 configs
- Removed docker support documentation as it won't be officially supported any more (Docker workflows don't align with the hackathon development model and deployment environments vary too widely for a single Docker configuration to be useful or maintainable.)
- Added Pull Request template with a checklist to remind devs on various pre-checks for shippable code
- Updated various documentation (@YasharF @nylla8444 @FrontendBy-GJ)
Tests
- Add API call recording and replay capability and fixtures to enable end-to-end testing without API keys
- Add Playwright harness for UI-driven testing and end-to-end (E2E) test examples
- Base harness and E2E for automated UI testing (@akilesh1706 @YasharF)
- E2E tests for GitHub integration (@akilesh1706)
- E2E tests for last.fm integration (@hsavasere)
- E2E tests for the web scraping (@Mrinank-Bhowmick)
- E2E tests for OpenAI Moderation (@Mrinank-Bhowmick)
- E2E tests for Pubchem integration (@hemanthsavasere)
- E2E tests for Lob integration (@hemanthsavasere)
- E2E tests for trakt.tv integration (@hemanthsavasere)
- E2E tests for NY Times integration (@Vedant794)
- E2E tests for Wikipedia integration (@nikeshadhikari9)
- E2E tests for Google Maps integration (@AndersonTsaiTW)
- E2E tests for the file upload (@hemanthsavasere)
- E2E tests for Twilio integration (@henockt)
- E2E tests for HERE Maps integration (@AndersonTsaiTW)
- E2E tests for Foursquare integration (@Sid0004)
- E2E tests for ChartJS and Alpha Vantage integration (@AndersonTsaiTW)
### 9.0.0 (April 12, 2025)
New Features
- Introduced "Logout Everywhere" functionality for enhanced security (Thanks to @vimark1).
- Added support for Google Analytics 4, Facebook Pixel, and Open Graph metadata.
Enhancements
- Removed unnecessary session saves for uninitialized sessions.
- Cleaned up GitHub Actions by removing unnecessary CodeQL references.
- Updated documentation for improved clarity and relevance.
- Optimized Dockerfile and updated Docker image for better performance (Thanks to @akarys2304).
- Replaced favicon.png with favicon.ico to match browser default requests.
- Added Apple touch icons.
- Refactored Nodemailer calls into config/nodemailer.js for unified security and configuration settings.
- Removed redundant installation of body-parser, now included with ExpressJS.
- Renamed getValidateReCAPTCHA to validateReCAPTCHA for better clarity.
- Adopted Prettier for consistent code formatting.
- Suppressed unactionable Sass import deprecation warnings.
- Renamed handleOAuth2Callback to saveOAuth2UserTokens for clarity.
Security Updates
- Addressed Host-header Injection vulnerability in Password Reset & Email Verification (CVE-2025-29036).
- Added upload size limit for Multer and moved its configuration to api.js.
- Replaced MD5 with SHA256 for Gravatar generation.
Bug Fixes
- Updated to the latest HERE Maps API as the prior API version calls were no longer working.
- Corrected the path for popper.js.
- Fixed pre-commit test and lint execution.
- Updated the default privacy policy to comply with Facebook terms and other regulations.
- Improved OAuth2 token handling logic:
- Properly save tokens without expiration dates.
- Consolidated token-saving logic across all providers to fix multiple issues.
- Prevented infinite redirect loops in isAuthorized during failed token refresh attempts.
Chore & Maintenance
- [Breaking] Upgraded to Express 5.x.
- [Breaking] Migrated from axios to Node.js's built-in fetch, reducing dependencies and improving performance.
- Switched from the deprecated nyc to c8 for code coverage reporting.
- Updated all dependencies.
Tests
- Added unit tests for isAuthorized and saveOAuth2UserTokens in config/passport.js.
- Fixed unit tests for app.js.
### 8.1.0 (February 1, 2025)
Security Enhancements
- Added URL validation for redirects through session.returnTo (CWE-601).
- Fixed OAuth state parameter generation and handling to address CSRF attack vectors in the OAuth workflow.
- Added additional sanitization for user input in database queries using $eq in MongoDB.
API and Integration:
- Unified formatting for authentication parameters in route definitions and passport.js configuration.
- Refactored common code for OAuth 2 token processing in passport strategies to improve maintainability.
- Reworked the GitHub and Twitch API integration examples with additional data from the APIs.
- Reworked the Twilio API integration example to use Twilio’s sandbox servers and test phone numbers.
- Upgraded the Pinterest API example to use v5 calls instead of the broken v1.
- Reworked the Tumblr API integration example with additional data from the API.
- Added a properly working OAuth 1.0a integration for Tumblr.
- Removed sign-in by Snapchat due to increased difficulty for developers and a focus on hackathon participants.
- Removed Foursquare OAuth authorization and updated the API demo with new examples.
- Renamed Twitter to X (Some of the backend and code still reference Twitter due to upstream dependencies, and the login button is using Twitter colors pending X addition to bootstrap-social).
Update/Upgrades:
- Dropped support for Nodejs < 22 due to ESM module import issues prior to that version.
- Migrated from the unmaintained passport-linkedin-oauth2 to a passport-openidconnect strategy.
- Added support and examples for openid-client.
- Migrated from the deprecated paypal-rest-sdk to an example without the SDK, providing OAuth calls depending on the page state.
- Migrated from the unmaintained bootstrap-social to a fork that can be easily patched and updated.
- Migrated eslint to v9, and its new config format (breaking change).
- Migrated Husky to v9, and its new config format (breaking change). Fixed Windows commit issue.
- Updated dependencies.
- Added temporary patch files for connect-flash and passport-openidconnect based on pending pull requests or issues on GitHub.
Other:
- Fixed a bug that prevented profile pictures from being displayed.
- Added authentication link/unlink options to the user profile page for all OAuth/Identity providers.
- Fixed typos, broken links, and minor formatting alignment issues on various pages.
- Fixed spelling errors in startup information displayed in the console.
- Refactored URL validation in unit tests for Gravatar generation to conform with CodeQL rules. Even though CodeQL does vulnerability checks, this is not a security issue since it is unit tests.
- Updated the placeholder main.js to use the current format (not deprecated JS).
- Updated the GitHub repo worker/runner configs to use proper permissions
- Return exit code 1 if there is a database connection issue at startup.
- Added the --trace-deprecation flag to startup to provide better information on runtime deprecation warnings.
- .gitignore file to exclude the uploads path.
- Updated the copyright year.
- Updated documentation.
### 8.0.0 (July 28, 2023)
- Security: Renamed the cookie and set secure attribute for cookie transmission when https is present
- Security: Migrated off known deprecated, vulnerable or unmaintained dependencies
- Security: Added express rate limiter
- Added additional sanitization and validation for external inputs. Lusca provides input protection. The additional sanitization and validation are to add another layer of protection.
- Added patch-package for temporary patching dependencies
- Temporary patch for passportjs to handle logout failures
- Temporary patch for passport-oauth2: better auth failure reporting
- Removed broken Instagram oauth support as Meta no longer supports it
- Added handler for 404(page not found) to avoid 500 errors when a route is not found
- Fixed unhandled error during logout
- Fixed pug tags with multiple attributes (thanks to @soundz77)
- Added Lint-stage and Husky to lint all commits
- Fix req.logout for passport 0.6
- Fix broken unit test
- Update default gravatar
- Visual UI improvements
- Added Github Actions: NodeJS CI check unit test and lint
- Upgrade nodejs for docker
- Removed express-handlebars npm package as it was not used and is not that popular compared to pug (breaking change)
- Removed chalk npm package as it was not used (breaking change)
- Updated documentation
- Upgraded to mongoose 7 (breaking change)
- Upgraded to popper2
- Migrated from googleapis npm package to @googleapis/drive and @googleapis/sheets to reduce size and improve performance (breaking change)
- Migrated from passport-twitch-new to twitch-passport (breaking change)
- Migrated from lob to @lob/lob-typescript-sdk (breaking change)
- Migrated from deprecated node-sass to Dart Sass
- Migrated off passport-openid (breaking change)
- Migrated off nodemailer-sendgrid (breaking change)
- Migrated off passport-twitter and twitter-lite (breaking change)
- Migrated off node-quickbooks (breaking change)
- Updated dependencies
- Removed travis.yml
API example changes:
- Removed the twitter API example as the APIs are actively changing and mostly not free (breaking change)
- Removed the Instagram API example as it was broken and Meta has significantly reduced the API scope and availablity for devs
- Improved the Chartjs+AlphaVantage to handle API failures
- Fix minor formatting issues and missing images
- Tumblr - Fixed the Tumblr example and moved off tumblrjs (breaking change)
- Added missing parameters for the Lob's new API requirements
- Improved the Last.fm API example as the artist image is no longer vended by last.fm
### 7.0.0 (Mar 26, 2022)
- Dropped support for Node.js <16
- Switched to Bootstrap 5
- Removed older Bootstrap 4 themes
- Updated dependencies
### 6.0.0 (January 2, 2020)
- Dropped support for NodeJS 8.x, due to its EOL
- Use HTML5 native client form validation (thanks to @peterblazejewicz)
- Fix navbar rendering issues when using themes (thanks to @peterblazejewicz)
- Fix button formatting issues when applying themes (thanks to @peterblazejewicz)
- Fixed drop down menu to show correct formatting from the theme (thanks to @jonasroslund)
- Config mongoose to use the new Server Discovery and Monitoring
- Fix validation bug in Twitter, Pinterest, and Twilio API examples
- Fix HERE icon in the API examples
- Fix minor issues in Stripe and Lob API examples
- Update dependencies
- Update documentation (thanks in part to @noftaly, @yanivm)
### 5.2.0 (July 28, 2019)
- Added API example: Google Drive (thanks to @tanaydin)
- Added Google Sheets API example (thanks to @clarkngo)
- Added HERE Maps API example
- Added support for Intuit Quickbooks API
- Improved Lob.com API example
- Added support for email verification
- Added support for refreshing OAuth tokens
- Fixed bug when users attempt to login by email for accounts that are created with a sign in provider
- Fixed bug in the password reset
- Added CSRF check to the File Upload API example -- security improvement -- breaking change
- Added validation check to password reset token -- security improvement
- Fixed missing await in the Foursquare API example
- Fixed Google Oauth2 profile picture (thanks to @tanaydin)
- Removed deprecated Instagram API calls -- breaking change
- Upgrade to login by LinkedIn v2, remove LinkedIn API example -- breaking change
- Removed express-validator in favor of validator.js -- breaking change
- Removed Aviary API example since the service has been shutdown
- Added additional unit tests for the user model (thanks to @Tolsee)
- Updated Steam's logo
- Updated dependencies
- Updated documentation (thanks in part to @TheMissingNTLDR, @Coteh)
### 5.1.4 (May 14, 2019)
- Migrate from requestjs to axios (thanks to @FX-Wood)
- Enable page templates to add items to the HTML head element
- Fix bold font issue on macs (thanks to @neighlyd)
- Use BASE_URL for github
- Update min node engine to require Feb 2019 NodeJS security release
- Add Node.js 12 to the travis build
- Update dependencies
- Update documentation (thanks in part to @anubhavsrivastava, @Fullchee, @luckymurari)
### 5.1.3 (April 7, 2019)
- Update Steam API Integration
- Upgrade flatly theme files to 4.3.1
- Migrate from bcrypt-nodejs to bcrypt
- Use BASE_URL for twitter and facebook callbacks
- Add a ChartJS example in combination with Alpha Vantage API usage (thanks to @T-travis)
- Improve Github integration – use the user’s private email address if there is no public email listed (thanks to @danielhunt)
- Improve the error handling for the NYT API Example
- Add lodash 4.7
- Fixed gender radio buttons spacing
- Fixed alignment Issue for login / sign in buttons at certain screen widths. (thanks to @eric-sciberras)
- Remove Mozilla Persona information from README since it has been deprecated
- Remove utils
- Remove GSDK since it does not support Bootstrap 4(thanks to @laurenquinn5924)
- Adding additional tests to cover some of the API examples
- Add prod-checklist.md
- Update dependencies
- Update documentation (thanks in part to @GregBrimble)
### 5.1.2 (January 13, 2019)
- Added Login by Snapchat (thanks to @nicholasgonzalezsc)
- Migrate the Foursquare API example to use Axios calls instead of the npm library.
- Fixed minor visual issue in the web scraping example.
- Fixed issue with Popper.js integration (thanks to @binarymax and @Furchin)
- Fixed wrapping issues in the navbar and logo indentation (thanks to @estevanmaito)
- Fixed MongoDB deprecation warnings
- Add production error handler middleware that returns 500 to handle errors. Also, handle server errors in the lastfm API example (thanks to @jagatfx)
- Added autocomplete properties to the views to address Chrome warnings (thanks to @peterblazejewicz)
- Fixed issues in the unit tests.
- Fixed issues in the modern theme variables and imports to be consistent (thanks to @monkeywithacupcake)
- Upgraded to Fontawesome to the latest version (thanks in part to @gesa)
- Upgraded eslint to v5.
- Updated dependencies
- Updated copyright year to include 2019
- Minor code formatting improvements
- Replaced mLab instructions with MongoDB Atlas instructions (thanks to @mgautam98)
- Fixed issues in the readme (thanks to @nero-adaware , @empurium, @aschwtzr)
### 5.1.1 (July 5, 2018)
- Upgraded FontAwesome to FontAwesome v5.1 - FontAwsome is now integrated using its npm package
- Fixed bug with JS libraries missing in Windows Dev envs
- Enabled autofocus in the Contact view when the user is logged in
- Fixed Home always being active (@dkimot)
- Modified Lob example to address recent API changes
- Updated Twilio API (@garretthogan)
- Fixed Twitter API (@garretthogan)
- Dependency updates
### 5.1.0 (May 9, 2018)
- Bootstrap 4.1 upgrade (breaking change)
- Addition of popper.js
- jQuery and Bootstrap will be pulled in the project using their npm packages
- Dockerfile will use development instead of production
- Security improvement by removing X-Powered-By header
- Express errorhandler will only be used in development to match its documentation
- Removed deprecated Instagram popular images API call from the Instagram example (@nacimgoura)
- Removed `mongoose global.Promise` as it is no longer needed (@nacimgoura)
- Refactoring of GitHub, last.fm api, twitter examples and code improvements to use ES6/ES7 features (@nacimgoura)
- Add NodeJS 10 in travis.yml (@nacimgoura)
- Improvements to the Steam API example (@nacimgoura)
- Readme and documentation improvements (thanks in part to @nacimgoura)
- Dependency updates
### 5.0.0 (April 1, 2018)
- NodeJS 8.0+ is now required
- Removed dependency on Bluebird in favor of native NodeJS promisify support
- Font awesome 5 Upgrade
- Fix console warning about Foursquare API version
- Added environment configs to eslint configs and cleaned up code (Thanks to @nacimgoura)
- Fixed eslint rules to better match the project
- Fixed Instagram API example view (@nacimgoura)
- Adding additional code editor related files to .gitignore (@nacimgoura)
- Upgraded syntax at various places to use ES6 syntax (Thanks to @nacimgoura)
- Re-added travis-ci.yml (Thanks to @nacimgoura)
- Fixed bug in Steam API when the user had no achievements (Thanks to @nacimgoura)
- Readme and documentation improvements
- Dependency updates
### 4.4.0 (March 23, 2018)
- Added Docker support (Thanks to @gregorysobotka, @praveenweb, @ryanhanwu). The initial integration has also been upgraded to use NodeJS 8 and Mongo 3.6.
- Removed dependency on async in favor of using promises (@fmcarvalho). Note that the promise support will be upgraded in the upcoming releases to remove the use of Bluebird.
- The contact form will no longer ask for the user's name and email address if they have logged-in already
- Adding a confirmation prompt when a user asks for their account to be deleted
- Fixed Steam Oauth and API integration
- Fixed Last.fm API example (@JonLim)
- Fixed Google Map integration example (@whmsysu)
- Fixed Twitter API integration (@shahzeb1)
- Fixed Facebook integration/request scope (@RobTS)
- Removed MONGOLAB_URI env var, use MONGODB_URI instead
- Preserve the query parameters during authentication session returns (@shreedharshetty)
- normalizeEmail options key remove_dots changed to gmail_remove_dots (@amakhnev)
- Fixed Heroku re-deploy issue (@gballet)
- Migrated from Jade to Pug
- Migrated from GitHub npm package to @octokit/rest to address the related deprecation warning. See https://git.io/vNB11
- Dependency update and upgrades
- Updated left over port 3000 to the current default of port of 8080
- Removed bitgo.pug since bitgo has not been supported by hackathon-starter since v4.1.0
- Removed bitgo from api/index view (@JonLim)
- Fixed unsecure external content by switching them to https
- New address for the Live Demo site
- Code formatting, text prompt, and Readme improvements
### 4.3.0 (November 6, 2016)
- [Added new theme](http://demos.creative-tim.com/get-shit-done/index.html) by Creative Tim (Thanks @conacelelena)
- Added ESLint configuration to _package.json_
- Added _yarn.lock_ (Thanks @niallobrien)
- Added **express-status-monitor** (to see it in action: `/status`)
- Added missing error handling checks (Thanks @dskrepps)
- Server address during the app startup is now clickable (⌘ + LMB) (Thanks @niallobrien)
- Fixed redirect issue in the account page (Thanks @YasharF)
- Fixed `Mongoose.promise` issue (Thanks @starcharles)
- Removed "My Friends" from Facebook API example due to Graph API changes
- Removed iOS7 theme
- `User` model unit tests improvements (Thanks @andela-rekemezie)
- Switched from **github-api** to the more popular **github** NPM module
- Updated Yarn and NPM dependencies
### 4.2.1 (September 6, 2016)
- User model minor code refactoring
- Fixed gravatar display issue on the profile page
- Pretty terminal logs for database connection and app server
- Added compiled _main.css_ to _.gitignore_
### 4.2.0 (August 21, 2016)
- Converted templates from jade to pug (See [Rename from "Jade"](https://github.com/pugjs/pug#rename-from-jade))
### 4.1.1 (August 20, 2016)
- Updated dependencies
### 4.1.0 (July 23, 2016)
- Improved redirect logic after login [#435](https://github.com/sahat/hackathon-starter/pull/435)
- Removed Venmo API (see [Venmo Halts New Developer Access To Its API](https://techcrunch.com/2016/02/26/how-not-to-run-a-platform/))
- Removed BitGo API due to issues with `secp256k1` dependency on Windows
### 4.0.1 (May 17, 2016)
- Renamed `MONGODB` to `MONGODB_URI` environment variable
- Set engine `"node": "6.1.0"` in _package.json_
### 4.0.0 (May 13, 2016)
- **ECMAScript 2015 support!** (Make sure you are using Node.js 6.0+)
- Thanks @vanshady and @prashcr
- Added `` support for _Chrome for Android_
- Added Yahoo Finance API example
- Updated Aviary API example
- Flash an error message when updating email to that which is already taken
- Removing an email address during profile update is no longer possible
- PayPal API example now uses _return_url_ and _cancel_url_ from `.env`
- Added client-side `required=true` attributes to input fields
- Fixed broken `show()` function in the GitHub API example
- Fixed YQL query in the Yahoo Weather API example
- Fixed _Can't set headers after they are sent_ error in Stripe API example
- Code refactoring and cleanup
- Updated Travis-CI Node.js version
- Updated NPM dependencies
- Removed Mandrill references
### 3.5.0 (March 4, 2016)
- Added file upload example
- Added Pinterest API example
- Added timestamp support to the User schema
- Fixed `next` parameter being _undefined_ inside `getReset` handler
- Refactored querysting param usage in _api.js_ controller
- Removed _setup.js_ (generator) due to its limited functionality and a lack of updates
### 3.4.1 (February 6, 2016)
- Added "Obtaining Twilio API Keys" instructions.
- Updated Bootstrap v3.3.6.
- Updated jQuery v2.2.0.
- Updated Font Awesome v4.5.0.
- Removed `debug` and `outputStyle` from the Sass middleware options.
- Removed `connect-assets` (no longer used) from _package.json_`.
- Fixed Font Awesome icon syntax error in _profile.jade_.
- Fixed Cheerio broken link.
### 3.4.0 (January 5, 2016)
- Use `dontenv` package for managing API keys and secrets.
- Removed _secrets.js_ (replaced by _.env.example_).
- Added .env to .gitignore.
- Fixed broken Aviary API image.
### 3.3.1 (December 25, 2015)
- Use `connect-mongo` ES5 fallback for backward-compatibility with Node.js version `< 4.0`.
### 3.3.0 (December 19, 2015)
- Steam authorization via OpenID.
- Code style update. (No longer use "one-liners" without braces)
- Updated LinkedIn scope from `r_fullprofile` to `r_basicprofile` due to API changes.
- Added LICENSE file.
- Removed [Bitcore](https://bitcore.io/) example due to installation issues on Windows 10.
### 3.2.0 (October 19, 2015)
- Added Google Analytics script.
- Split _api.js_ `require` intro declaration and initialization for better performance. (See #247)
- Removed [ionicons](http://ionicons.com).
- Removed [connect-assets](https://github.com/adunkman/connect-assets). (Replaced by [node-sass-middleware](https://github.com/sass/node-sass-middleware))
- Fixed alignment styling on /login, /profile and /account
- Fixed Stripe API `POST` request.
- Converted LESS to Sass stylesheets.
- Set `node_js` version to "stable" in _.travis.yml_.
- Removed `mocha.opts` file, pass options directly to package.json
- README cleanup and fixes.
- Updated Font Awesome to 4.4.0
### 3.1.0 (August 25, 2015)
- Added Bitcore example.
- Added Bitgo example.
- Lots of README fixes.
- Fixed Google OAuth profile image url.
- Fixed a bug where `connect-assets` served all JS assets twice.
- Fixed missing `csrf` token in the Twilio API example form.
- Removed `multer` middleware.
- Removed Ordrx API. (Shutdown)
### 3.0.3 (May 14, 2015)
- Added favicon.
- Fixed an email issue with Google login.
### 3.0.2 (March 31, 2015)
- Renamed `navbar.jade` to `header.jade`.
- Fixed typos in README. Thanks @josephahn and @rstormsf.
- Fix radio button alignment on small screens in Profile page.
- Increased `bcrypt.genSalt()` from **5** to **10**.
- Updated package dependencies.
- Updated Font Awesome `4.3.0`.
- Updated Bootstrap `3.3.4`.
- Removed Ionicons.
- Removed unused `User` variable in _controllers/api.js_.
- Removed Nodejitsu instructions from README.
### 3.0.1 (February 23, 2015)
- Reverted Sass to LESS stylesheets. See #233.
- Convert email to lower case in Passport's LocalStrategy during login.
- New Lob API.
- Updated Font Awesome to 4.3.0
- Updated Bootstrap and Flatly theme to 3.3.2.
### 3.0.0 (January 11, 2015)
- New Ordr.in API example.
- Brought back PayPal API example.
- Added `xframe` and xssProtection` protection via **lusca** module.
- No more CSRF route whitelisting, either enable or dsiable it globally.
- Simplified "remember original destination" middleware.
- Instead of excluding certain routes, you now have to "opt-in" for the routes you wish to remember for a redirect after successful authentication.
- Converted LESS to Sass.
- Updated Bootstrap to 3.3.1 and Font Awesome to 4.2.0.
- Updated jQuery to 2.1.3 and Bootstrap to 3.3.1 JS files.
- Updated Ionicons to 2.0.
- Faster travis-ci builds using `sudo: false`.
- Fixed YUI url on Yahoo API example.
- Fixed `mongo-connect` deprecation warning.
- Code cleanup throughout the project.
- Updated `secrets.js` notice.
- Simplified the generator (`setup.js`), no longer removes auth providers.
- Added `git remote rm origin` to Getting Started instructions in README.
### 2.4.0 (November 8, 2014)
- Bootstrap 3.3.0.
- Flatly 3.3.0 theme.
- User model cleanup.
- Removed `helperContext` from connect-assets middleware.
### 2.3.4 (October 27, 2014)
- Font Awesome 4.2.0 [01e7bd5c09926911ca856fe4990e6067d9148694](https://github.com/sahat/hackathon-starter/commit/01e7bd5c09926911ca856fe4990e6067d9148694)
- Code cleanup in `app.js` and `controllers/api.js`. [8ce48f767c0146062296685cc101acf3d5d224d9](https://github.com/sahat/hackathon-starter/commit/8ce48f767c0146062296685cc101acf3d5d224d9) [cdbb9d1888a96bbba92d4d14deec99a8acba2618](https://github.com/sahat/hackathon-starter/commit/cdbb9d1888a96bbba92d4d14deec99a8acba2618)
- Updated Stripe API example. [afef373cd57b6a44bf856eb093e8f2801fc2dbe2](https://github.com/sahat/hackathon-starter/commit/afef373cd57b6a44bf856eb093e8f2801fc2dbe2)
- Added 1-step deployment process with Heroku and mLab add-on. [c5def7b7b3b98462e9a2e7896dc11aaec1a48b3f](https://github.com/sahat/hackathon-starter/commit/c5def7b7b3b98462e9a2e7896dc11aaec1a48b3f)
- Updated Twitter apps dashboard url. [e378fbbc24e269de69494d326bc20fcb641c0697](https://github.com/sahat/hackathon-starter/commit/e378fbbc24e269de69494d326bc20fcb641c0697)
- Fixed dead links in the README. [78fac5489c596e8bcef0ab11a96e654335573bb4](https://github.com/sahat/hackathon-starter/commit/78fac5489c596e8bcef0ab11a96e654335573bb4)
### 2.3.3 (September 1, 2014)
- Use _https_ (instead of http) profile image URL with Twitter authentication
### 2.3.2 (July 28, 2014)
- Fixed an issue with connect-assets when running `app.js` from an outside folder
- Temporarily disabled `setup.js` on Windows platform until [blessed](https://github.com/chjj/blessed) fixes its problems
### 2.3.1 (July 15, 2014)
- Migrated to Nodemailer 1.0
### 2.3 (July 2, 2014)
- Bootstrap 3.2
- New default theme
- Ionicons fonts
- Fixed bodyParser deprecation warning
- Minor visual updates
- CSS cleanup via RECESS
- Replaced `navbar-brand` image with a font icon
### 2.2.1 (June 17, 2014)
- Added IBM Codename: BlueMix deployment instructions
### 2.2 (June 6, 2014)
- Use Lodash instead of Underscore.js
- Replaced all occurrences of `_.findWhere` with `_.find`
- Added a flash message when user deletes an account
- Updated and clarified some comments
- Updated the Remove Auth message in `setup.js`
- Cleaned up `styles.less`
- Redesigned API Examples page
- Updated Last.fm API example
- Updated Steam API example
- Updated Instagram API example
- Updated Facebook API example
- Updated jQuery to 2.1.1
- Fixed a bug that didn't remove Instagram Auth properly
- Fixed Foursquare secret token
### 2.1.4 (June 5, 2014)
- Fixed a bug related to `returnTo` url (#155)
### 2.1.3 (June 3, 2014)
- Font Awesome 4.1
- Updated icons on some API examples
- Use LESS files for _bootstrap-social_ and _font-awesome_
### 2.1.2 (June 2, 2014)
- Improved Twilio API example
- Updated dependencies
### 2.1.1 (May 29, 2014)
- Added **Compose new Tweet** to Twitter API example
- Fixed email service indentation
- Fixed Mailgun and Mandrill secret.js properties
- Renamed `navigation.jade` to `navbar.jade`
### 2.1 (May 13, 2014)
- New and improved generator - **setup.js**
- Added Yahoo API
- CSS and templates cleanup
- Minor improvement to the default theme
- `cluster_app.js` has been moved into **setup.js**
### 2.0.4 (April 26, 2014)
- Added Mandrill e-mail service (via generator)
### 2.0.3 (April 25, 2014)
- LinkedIn API: Fixed an error if a user did not specify education on LinkedIn
- Removed email constraint when linking OAuth accounts in order to be able to merge accounts that use the same email address
- Check if email address is already taken when creating a new local account
- Previously relied on Validation Error 11000, which doesn't always work
- When creating a local account, checks if e-mail address is already taken
- Flash notifications can now be dismissed by clicking on �?
### 2.0.2 (April 22, 2014)
- Added Instagram Authentication
- Added Instagram API example
- Updated Instagram Strategy to use a "fake" email address similar to Twitter Startegy
### 2.0.1 (April 18, 2014)
- Conditional CSRF support using [lusca](https://github.com/krakenjs/lusca)
- Fixed EOL problem in `generator.js` for Windows users
- Fixed outdated csrf token string on profile.jade
- Code cleanup
### 2.0.0 (April 15, 2014)
There are have been over **500+** commits since the initial announcement in
January 2014 and over a **120** issues and pull requests from **28** contributors.
- Documentation grew **8x** in size since the announcement on Hacker News
- Upgraded to Express 4.0
- Generator for adding/removing authentication providers
- New Instagram authentication that can be added via generator
- Forgot password and password reset for Local authentication
- Added LinkedIn authentication and API example
- Added Stripe API example
- Added Venmo API example
- Added Clockwork SMS example
- Nicer Facebook API example
- Pre-populated secrets.js with API keys (not linked to my personal accounts)
- Grid layout with company logos on API Examples page
- Added tests (Mocha, Chai, Supertest)
- Gravatar pictures in Navbar and Profile page
- Tracks last visited URL before signing in to redirect back to original destination
- CSRF protection
- Gzip compression and static assets caching
- Client-side JavaScript is automatically minified+concatenated in production
- Navbar, flash messages, footer refactored into partial templates
- Support for Node.js clusters
- Support for Mailgun email service
- Support for environment variables in secrets.js
- Switched from less-middleware to connect-assets
- Bug fixes related to multi-authentication login and account linking
- Other small fixes and changes that are too many to list
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2014-2026 Sahat Yalkabov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: PROD_CHECKLIST.md
================================================
If you are done with your hackathon and thinking about launching your project into production, or if you are just using this boilerplate to start your soon to be in production application, this document is a checklist to help you get your application production ready.
- Remove unused code and configs
- Add a proxy such as Cloudflare in front of your production deployment. Adjust the numberOfProxies logic in app.js if needed
- Update the session cookie configs with sameSite attribute, domain, and path
- Add Terms of Service and Privacy Policy
- Update `LICENSE.md` and the relevant license field in package.json if applicable - See [npm's doc](https://docs.npmjs.com/files/package.json#license).
- Add [sitemap.xml](https://en.wikipedia.org/wiki/Sitemaps) and [robots.txt](https://moz.com/learn/seo/robotstxt)
- Update Google Analytics ID
- Add Facebook App/Pixel ID
- Add Winston Logging, and replace console.log statements with Winston; have a process for monitoring errors to identify bugs or other issues after launch.
- SEO and Social Media Improvements
- Create a deployment pipeline with a pre-prod/integration test stage.
- (optional) Add email verification _Some experimental data has shown that bogus email addresses are not a significant problem in many cases_
- (optional) Add a filter with [disposable-email-domains](https://www.npmjs.com/package/disposable-email-domains). _Some experimental data has shown that use of disposable emails is typically rare, and in many cases it might not be worth adding the filter._
### Remove unused code and configs
The following is a list of various code that you may not potentially be using and you could remove depending on your application:
- Unused keys from .env file
- /controllers/api.js entirely
- /views/api entirely
- app.js:
- multer
- apiController
- Openshift env references
- csrf check exception for /api/upload
- All API example routes
- OAuth routes for authentications that you are not using (i.e. GitHub, LinkedIn, etc. based on your app)
- All OAuth authorization routes
- passport.js all references and functions related to:
- Github, LinkedIn, OpenID, OAuth, OAuth2
- model/User.js
- key pairs for Github, LinkedIn, Steam
- package.json
- @octokit/rest, lastfm, lob, multer, node-linkedin, passport-github2, passport-linkedin-oauth2, passport-oauth, paypal-rest-sdk, stripe, twilio
- /test
- Replace E2E and API example tests with new tests for your application
- views/account/login.pug
- Some or all of the last form-group set, which are the social login choices
- views/account/profile.pug
- Link/unlink buttons for GitHub, LinkedIn, Steam
- Remove README, changelog and this guide if not using them
- Create a domain whitelist for your app in Here's developer portal if you are using the HERE Maps API.
- Add unit tests so you can test and incorporate dependency and upstream updates with less effort. GPT tools may create some good unit tests with very low effort.
### Search Engine Optimization (SEO)
Note that SEO only applies to the pages that will be publicly visible with no authentication. Note that some of the following fields need to be added to the HTML header section similar to the page [title](https://github.com/sahat/hackathon-starter/blob/master/views/layout.pug#L9)
- Add Open Graph fields for SEO
Open Graph data:
```
```
- Add a page description, which will show up in the search results of the search engine.
```
```
================================================
FILE: README.md
================================================

Hackathon Starter
=======================
**Live Demo**: [Link](https://hackathon-starter-1.ydftech.com)
Jump to [What's new?](https://github.com/sahat/hackathon-starter/blob/master/CHANGELOG.md)
A boilerplate for **Node.js** web applications.
If you have attended any hackathons in the past, then you know how much time it takes to get a project started: decide on what to build, pick a programming language, pick a web framework, pick a CSS framework. A while later, you might have an initial project up on GitHub, and only then can other team members start contributing. Or how about doing something as simple as _Sign in with Facebook_ authentication? You can spend hours on it if you are not familiar with how OAuth 2.0 works.
When I started this project, my primary focus was on **simplicity** and **ease of use**.
I also tried to make it as **generic** and **reusable** as possible to cover most use cases of hackathon web apps, without being too specific. In the worst case, you can use this as a learning guide for your projects, if for example you are only interested in **Sign in with Google** authentication and nothing else.
### Testimonials
> [**"Nice! That README alone is already gold!"**](https://www.producthunt.com/tech/hackathon-starter#comment-224732)
> — Adrian Le Bas
> [**"Awesome. Simply awesome."**](https://www.producthunt.com/tech/hackathon-starter#comment-224966)
> — Steven Rueter
> [**"I'm using it for a year now and many projects, it's an awesome boilerplate and the project is well maintained!"**](https://www.producthunt.com/tech/hackathon-starter#comment-228610)
> — Kevin Granger
> **"Small world with Sahat's project. We were using his hackathon starter for our hackathon this past weekend and got some prizes. Really handy repo!"**
> — Interview candidate for one of the companies I used to work with.
- Visit Facebook Developers
- Click **My Apps**, then select \*_Add a New App_ from the dropdown menu
- Enter a new name for your app
- Click on the **Create App ID** button
- Find the Facebook Login Product and click on **Facebook Login**
- Instead of going through their Quickstart, click on **Settings** for your app in the top left corner
- Copy and paste _App ID_ and _App Secret_ keys into `.env`
- **Note:** _App ID_ is **FACEBOOK_ID**, _App Secret_ is **FACEBOOK_SECRET** in `.env`
- Enter `localhost` under _App Domains_
- Choose a **Category** that best describes your app
- Click on **+ Add Platform** and select **Website**
- Enter your BASE*URL value (i.e. `http://localhost:8080`, etc) under \_Site URL*
- Click on the _Settings_ tab in the left nav under Facebook Login
- Enter your BASE_URL value followed by /auth/facebook/callback (i.e. `http://localhost:8080/auth/facebook/callback` ) under Valid OAuth redirect URIs
**Note:** After a successful sign-in with Facebook, a user will be redirected back to the home page with appended hash `#_=_` in the URL. It is _not_ a bug. See this [Stack Overflow](https://stackoverflow.com/questions/7131909/facebook-callback-appends-to-return-url) discussion for ways to handle it.
- Go to Foursquare for Developers and log in
- Click on **Create a new project** button
- Enter your _Organization_ and _Project Name_
- Click **Create**
- Navigate to your project
- Click **Settings** in the left-hand-side menu
- Generate a Service API Key
- Copy and paste the Service API Key as `FOURSQUARE_APIKEY` in your `.env` file
- Go to Account Settings
- Select **Developer settings** from the sidebar
- Then click on **OAuth Apps** and then on **Register new application**
- Enter _Application Name_ and _Homepage URL_. Enter your BASE_URL value (i.e. `http://localhost:8080`, etc) as the homepage URL.
- For _Authorization Callback URL_: your BASE_URL value followed by /auth/github/callback (i.e. `http://localhost:8080/auth/github/callback` )
- Click **Register application**
- Now copy and paste _Client ID_ and _Client Secret_ keys into `.env` file
- Go to GIPHY Developers website
- Login or create a new account and login.
- Select **Dashboard** from the navigation bar
- Then click on **Create an API Key** and then select **API** and click on **Next Step**.
- Enter _App Name_ and _App Description_. Select **Web** and create a beta key.
- Now copy and paste the API key into `.env` file as GIPHY_API_KEY.
- Go to https://huggingface.co and create an account.
- Go to your Account Settings and create a new Access Token. Make sure you have granted the **"Make calls to Inference Provider"** permission to your token.
- Add your token as `HUGGINGFACE_KEY` to your `.env` file or as an environment variable.
- Go to https://developer.intuit.com/app/developer/qbo/docs/get-started
- Use the Sign Up option in the upper right corner of the screen (navbar) to get a free developer account and a sandbox company.
- Create a new app by going to your Dashboard using the My Apps option in the top nav bar or by going to https://developer.intuit.com/app/developer/myapps
- In your App, under Development, Keys & OAuth (right nav), find the Client ID and Client Secret for your `.env` file
The OpenAI moderation API for checking harmful inputs is free to use as long as you have paid credits in your OpenAI developer account. The cost of using their other models depends on the model, as well as the input and output size of the API call.
- Visit OpenAI API Keys
- Sign in or create an OpenAI account.
- Click on **Create new secret key** to generate an API key.
- Copy and paste the generated API key into your `.env` file as `OPENAI_API_KEY` or set it as an environment variable.
- Visit PayPal Developer
- Log in to your PayPal account
- Click **Applications > Create App** in the navigation bar
- Enter _Application Name_, then click **Create app**
- Copy and paste _Client ID_ and _Secret_ keys into `.env` file
- _App ID_ is **client_id**, _App Secret_ is **client_secret**
- Change **host** to api.paypal.com if you want to test against production and use the live credentials
- Sign up or log into your dashboard
- Click on your profile and click on Account Settings
- Then click on **API Keys**
- Copy the **Secret Key**. and add this into `.env` file
- Visit Groq
- Sign in or create a Groq account.
- Click on **Create API Key** to generate a new key. You will also be able to access your API key under your account settings in the API Keys tab.
- Copy and paste the generated API key into your `.env` file as `GROQ_API_KEY` or set it as an environment variable.
- Sign up or sign in to your trakt.tv account and go to Trakt.tv Applications.
- Create a new application and fill in the required fields:
- **Name**: Your app name.
- **Redirect URI**: Set to your BASE_URL value followed by `/auth/trakt/callback` (i.e. `http://localhost:8080/auth/trakt/callback` or `ngrokURL/auth/trakt/callback`)
- Leave the JavaScript origins blank as we won't be using client-side API calls.
- Click **Save App**.
- Copy and paste the **Client ID** and **Client Secret** into your `.env` file as `TRAKT_ID` and `TRAKT_SECRET` or set them as your environment variables.
- Go to http://www.tumblr.com/oauth/apps
- Once signed in, click **+Register application**
- Fill in all the details
- For **Default Callback URL**: your BASE_URL value followed by /auth/tumblr/callback (i.e. `http://localhost:8080/auth/tumblr/callback` )
- Click **✔Register**
- Copy and paste _OAuth consumer key_ and _OAuth consumer secret_ keys into `.env` file
- Visit the Twitch developer console
- If prompted, authorize the dashboard to access your twitch account
- In the Console, click on Register Your Application
- Enter the name of your application
- Use OAuth Redirect URLs enter your BASE_URL value followed by /auth/twitch/callback (i.e. `http://localhost:8080/auth/twitch/callback` )
- Set Category to Website Integration and press the Create button
- After the application has been created, click on the Manage button
- Copy and paste _Client ID_ into `.env`
- If there is no Client Secret displayed, click on the New Secret button and then copy and paste the _Client secret_ into `.env`
- Sign in at https://developer.x.com/
- Start with the Free tier
- Click **Create a new application**
- Enter your application name, website and description. Set the website as your BASE_URL value (i.e. `http://localhost:8080`, etc).
- For **Callback URL**: your BASE_URL value followed by /auth/x/callback (i.e. `http://localhost:8080/auth/x/callback` )
- Go to **Settings** tab
- Under _Application Type_ select **Read and Write** access
- Check the box **Allow this application to be used to Sign in with X**
- Click **Update this X's applications settings**
- Copy and paste _Consumer Key_ and _Consumer Secret_ keys into `.env` file
We would like to welcome you to the community! Thanks for being a part of the team!
Cheer,
${addressFrom.name}
At Hackathon Starter, accessible from our website, one of our main priorities is the privacy of our users. This Privacy Policy document explains the types of information we collect, how we use that data, and how users can manage their information.
If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact us. Our Privacy Policy was generated with the help of GDPR Privacy Policy Generator from GDPRPrivacyPolicy.net.
We collect information from third-party services such as Google and Meta, including user email, profile data, and other relevant information for authentication purposes. This data is used solely to provide and enhance the functionality of our application. We also use reCAPTCHA for security and abuse prevention. reCAPTCHA collects technical and behavioral signals to assess risk. Google processes this data solely on our behalf and does not use it for advertising.
We also collect certain information automatically, including browser type, IP address, server logs, and usage patterns to optimize and improve user experience.
We do not sell user data to third parties. We may share certain information with trusted partners who assist in providing and improving our services, but only as necessary for core functionality.
We implement industry-standard security measures, including encryption and access controls, to protect user data from unauthorized access, breaches, and misuse.
We retain personal data only as long as necessary to fulfill the purposes outlined in this policy. Users may request data deletion at any time via the **“Delete My Account”** button on the **“My Account”** page or by contacting us through our Contact Page.
User data collected through our app is used exclusively for authentication and enhancing app functionality. It is not used for targeted advertising, sold to data brokers, or processed for purposes beyond improving user experience.
Our privacy policy is available via a publicly accessible URL and is not geo-blocked. The privacy policy link provided in our Meta App Dashboard ensures compliance with Meta’s requirements.
We are a Data Controller of your information. Our legal basis for collecting and using personal information depends on the specific context in which we collect the data:
Hackathon Starter does not knowingly collect personal information from children under the age of 13. If you believe a child has provided us with their information, please contact us, and we will promptly remove the data.
By using our website, you hereby consent to our Privacy Policy and agree to its terms.
Version 1.0
The Hackathon Starter website located at our web address is a copyrighted work belonging to Hackathon Starter. Certain features of the Site may be subject to additional guidelines, terms, or rules, which will be posted on the Site in connection with such features.
All such additional terms, guidelines, and rules are incorporated by reference into these Terms.
These Terms of Use described the legally binding terms and conditions that oversee your use of the Site. BY LOGGING INTO THE SITE, YOU ARE BEING COMPLIANT THAT THESE TERMS and you represent that you have the authority and capacity to enter into these Terms. YOU SHOULD BE AT LEAST 18 YEARS OF AGE TO ACCESS THE SITE. IF YOU DISAGREE WITH ALL OF THE PROVISION OF THESE TERMS, DO NOT LOG INTO AND/OR USE THE SITE.
These terms require the use of arbitration Section 10.2 on an individual basis to resolve disputes and also limit the remedies available to you in the event of a dispute. These Terms of Use were created with the help of the Terms Of Use Generator and the Privacy Policy Generator.
Subject to these Terms. Company grants you a non-transferable, non-exclusive, revocable, limited license to access the Site solely for your own personal, noncommercial use.
Certain Restrictions. The rights approved to you in these Terms are subject to the following restrictions: (a) you shall not sell, rent, lease, transfer, assign, distribute, host, or otherwise commercially exploit the Site; (b) you shall not change, make derivative works of, disassemble, reverse compile or reverse engineer any part of the Site; (c) you shall not access the Site in order to build a similar or competitive website; and (d) except as expressly stated herein, no part of the Site may be copied, reproduced, distributed, republished, downloaded, displayed, posted or transmitted in any form or by any means unless otherwise indicated, any future release, update, or other addition to functionality of the Site shall be subject to these Terms. All copyright and other proprietary notices on the Site must be retained on all copies thereof.
Company reserves the right to change, suspend, or cease the Site with or without notice to you. You approved that Company will not be held liable to you or any third-party for any change, interruption, or termination of the Site or any part.
No Support or Maintenance. You agree that Company will have no obligation to provide you with any support in connection with the Site.
Excluding any User Content that you may provide, you are aware that all the intellectual property rights, including copyrights, patents, trademarks, and trade secrets, in the Site and its content are owned by Company or Company’s suppliers. Note that these Terms and access to the Site do not give you any rights, title or interest in or to any intellectual property rights, except for the limited access rights expressed in Section 2.1. Company and its suppliers reserve all rights not granted in these Terms.
Third-Party Links & Ads. The Site may contain links to third-party websites and services, and/or display advertisements for third-parties. Such Third-Party Links & Ads are not under the control of Company, and Company is not responsible for any Third-Party Links & Ads. Company provides access to these Third-Party Links & Ads only as a convenience to you, and does not review, approve, monitor, endorse, warrant, or make any representations with respect to Third-Party Links & Ads. You use all Third-Party Links & Ads at your own risk, and should apply a suitable level of caution and discretion in doing so. When you click on any of the Third-Party Links & Ads, the applicable third party’s terms and policies apply, including the third party’s privacy and data gathering practices.
Other Users. Each Site user is solely responsible for any and all of its own User Content. Because we do not control User Content, you acknowledge and agree that we are not responsible for any User Content, whether provided by you or by others. You agree that Company will not be responsible for any loss or damage incurred as the result of any such interactions. If there is a dispute between you and any Site user, we are under no obligation to become involved.
You hereby release and forever discharge the Company and our officers, employees, agents, successors, and assigns from, and hereby waive and relinquish, each and every past, present and future dispute, claim, controversy, demand, right, obligation, liability, action and cause of action of every kind and nature, that has arisen or arises directly or indirectly out of, or that relates directly or indirectly to, the Site. If you are a California resident, you hereby waive California civil code section 1542 in connection with the foregoing, which states: "a general release does not extend to claims which the creditor does not know or suspect to exist in his or her favor at the time of executing the release, which if known by him or her must have materially affected his or her settlement with the debtor."
Cookies and Web Beacons. Like any other website, Hackathon Starter uses ‘cookies’. These cookies are used to store information including visitors’ preferences, and the pages on the website that the visitor accessed or visited. The information is used to optimize the users’ experience by customizing our web page content based on visitors’ browser type and/or other information.
The site is provided on an "as-is" and "as available" basis, and company and our suppliers expressly disclaim any and all warranties and conditions of any kind, whether express, implied, or statutory, including all warranties or conditions of merchantability, fitness for a particular purpose, title, quiet enjoyment, accuracy, or non-infringement. We and our suppliers make not guarantee that the site will meet your requirements, will be available on an uninterrupted, timely, secure, or error-free basis, or will be accurate, reliable, free of viruses or other harmful code, complete, legal, or safe. If applicable law requires any warranties with respect to the site, all such warranties are limited in duration to ninety (90) days from the date of first use.
Some jurisdictions do not allow the exclusion of implied warranties, so the above exclusion may not apply to you. Some jurisdictions do not allow limitations on how long an implied warranty lasts, so the above limitation may not apply to you.
To the maximum extent permitted by law, in no event shall company or our suppliers be liable to you or any third-party for any lost profits, lost data, costs of procurement of substitute products, or any indirect, consequential, exemplary, incidental, special or punitive damages arising from or relating to these terms or your use of, or incapability to use the site even if company has been advised of the possibility of such damages. Access to and use of the site is at your own discretion and risk, and you will be solely responsible for any damage to your device or computer system, or loss of data resulting therefrom.
To the maximum extent permitted by law, notwithstanding anything to the contrary contained herein, our liability to you for any damages arising from or related to this agreement, will at all times be limited to a maximum of fifty U.S. dollars (u.s. $50). The existence of more than one claim will not enlarge this limit. You agree that our suppliers will have no liability of any kind arising from or relating to this agreement.
Some jurisdictions do not allow the limitation or exclusion of liability for incidental or consequential damages, so the above limitation or exclusion may not apply to you.
Term and Termination. Subject to this Section, these Terms will remain in full force and effect while you use the Site. We may suspend or terminate your rights to use the Site at any time for any reason at our sole discretion, including for any use of the Site in violation of these Terms. Upon termination of your rights under these Terms, your Account and right to access and use the Site will terminate immediately. You understand that any termination of your Account may involve deletion of your User Content associated with your Account from our live databases. Company will not have any liability whatsoever to you for any termination of your rights under these Terms. Even after your rights under these Terms are terminated, the following provisions of these Terms will remain in effect: Sections 2 through 2.5, Section 3 and Sections 4 through 10.
Company respects the intellectual property of others and asks that users of our Site do the same. In connection with our Site, we have adopted and implemented a policy respecting copyright law that provides for the removal of any infringing materials and for the termination of users of our online Site who are repeated infringers of intellectual property rights, including copyrights. If you believe that one of our users is, through the use of our Site, unlawfully infringing the copyright(s) in a work, and wish to have the allegedly infringing material removed, the following information in the form of a written notification (pursuant to 17 U.S.C. § 512(c)) must be provided to our designated Copyright Agent:
Please note that, pursuant to 17 U.S.C. § 512(f), any misrepresentation of material fact in a written notification automatically subjects the complaining party to liability for any damages, costs and attorney’s fees incurred by us in connection with the written notification and allegation of copyright infringement.
These Terms are subject to occasional revision, and if we make any substantial changes, we may notify you by sending you an e-mail to the last e-mail address you provided to us and/or by prominently posting notice of the changes on our Site. You are responsible for providing us with your most current e-mail address. In the event that the last e-mail address that you have provided us is not valid our dispatch of the e-mail containing such notice will nonetheless constitute effective notice of the changes described in the notice. Any changes to these Terms will be effective upon the earliest of thirty (30) calendar days following our dispatch of an e-mail notice to you or thirty (30) calendar days following our posting of notice of the changes on our Site. These changes will be effective immediately for new users of our Site. Continued use of our Site following notice of such changes shall indicate your acknowledgement of such changes and agreement to be bound by the terms and conditions of such changes. Dispute Resolution. Please read this Arbitration Agreement carefully. It is part of your contract with Company and affects your rights. It contains procedures for MANDATORY BINDING ARBITRATION AND A CLASS ACTION WAIVER.
Applicability of Arbitration Agreement. All claims and disputes in connection with the Terms or the use of any product or service provided by the Company that cannot be resolved informally or in small claims court shall be resolved by binding arbitration on an individual basis under the terms of this Arbitration Agreement. Unless otherwise agreed to, all arbitration proceedings shall be held in English. This Arbitration Agreement applies to you and the Company, and to any subsidiaries, affiliates, agents, employees, predecessors in interest, successors, and assigns, as well as all authorized or unauthorized users or beneficiaries of services or goods provided under the Terms.
Notice Requirement and Informal Dispute Resolution. Before either party may seek arbitration, the party must first send to the other party a written Notice of Dispute describing the nature and basis of the claim or dispute, and the requested relief. A Notice to the Company should be sent to: 221B Baker Street. After the Notice is received, you and the Company may attempt to resolve the claim or dispute informally. If you and the Company do not resolve the claim or dispute within thirty (30) days after the Notice is received, either party may begin an arbitration proceeding. The amount of any settlement offer made by any party may not be disclosed to the arbitrator until after the arbitrator has determined the amount of the award to which either party is entitled.
Arbitration Rules. Arbitration shall be initiated through the American Arbitration Association, an established alternative dispute resolution provider that offers arbitration as set forth in this section. If AAA is not available to arbitrate, the parties shall agree to select an alternative ADR Provider. The rules of the ADR Provider shall govern all aspects of the arbitration except to the extent such rules are in conflict with the Terms. The AAA Consumer Arbitration Rules governing the arbitration are available online at adr.org or by calling the AAA at 1-800-778-7879. The arbitration shall be conducted by a single, neutral arbitrator. Any claims or disputes where the total amount of the award sought is less than Ten Thousand U.S. Dollars (US $10,000.00) may be resolved through binding non-appearance-based arbitration, at the option of the party seeking relief. For claims or disputes where the total amount of the award sought is Ten Thousand U.S. Dollars (US $10,000.00) or more, the right to a hearing will be determined by the Arbitration Rules. Any hearing will be held in a location within 100 miles of your residence, unless you reside outside of the United States, and unless the parties agree otherwise. If you reside outside of the U.S., the arbitrator shall give the parties reasonable notice of the date, time and place of any oral hearings. Any judgment on the award rendered by the arbitrator may be entered in any court of competent jurisdiction. If the arbitrator grants you an award that is greater than the last settlement offer that the Company made to you prior to the initiation of arbitration, the Company will pay you the greater of the award or $2,500.00. Each party shall bear its own costs and disbursements arising out of the arbitration and shall pay an equal share of the fees and costs of the ADR Provider.
Additional Rules for Non-Appearance Based Arbitration. If non-appearance based arbitration is elected, the arbitration shall be conducted by telephone, online and/or based solely on written submissions; the specific manner shall be chosen by the party initiating the arbitration. The arbitration shall not involve any personal appearance by the parties or witnesses unless otherwise agreed by the parties.
Time Limits. If you or the Company pursues arbitration, the arbitration action must be initiated and/or demanded within the statute of limitations and within any deadline imposed under the AAA Rules for the pertinent claim.
Authority of Arbitrator. If arbitration is initiated, the arbitrator will decide the rights and liabilities of you and the Company, and the dispute will not be consolidated with any other matters or joined with any other cases or parties. The arbitrator shall have the authority to grant motions dispositive of all or part of any claim. The arbitrator shall have the authority to award monetary damages, and to grant any non-monetary remedy or relief available to an individual under applicable law, the AAA Rules, and the Terms. The arbitrator shall issue a written award and statement of decision describing the essential findings and conclusions on which the award is based. The arbitrator has the same authority to award relief on an individual basis that a judge in a court of law would have. The award of the arbitrator is final and binding upon you and the Company.
Waiver of Jury Trial. THE PARTIES HEREBY WAIVE THEIR CONSTITUTIONAL AND STATUTORY RIGHTS TO GO TO COURT AND HAVE A TRIAL IN FRONT OF A JUDGE OR A JURY, instead electing that all claims and disputes shall be resolved by arbitration under this Arbitration Agreement. Arbitration procedures are typically more limited, more efficient and less expensive than rules applicable in a court and are subject to very limited review by a court. In the event any litigation should arise between you and the Company in any state or federal court in a suit to vacate or enforce an arbitration award or otherwise, YOU AND THE COMPANY WAIVE ALL RIGHTS TO A JURY TRIAL, instead electing that the dispute be resolved by a judge.
Waiver of Class or Consolidated Actions. All claims and disputes within the scope of this arbitration agreement must be arbitrated or litigated on an individual basis and not on a class basis, and claims of more than one customer or user cannot be arbitrated or litigated jointly or consolidated with those of any other customer or user.
Confidentiality. All aspects of the arbitration proceeding shall be strictly confidential. The parties agree to maintain confidentiality unless otherwise required by law. This paragraph shall not prevent a party from submitting to a court of law any information necessary to enforce this Agreement, to enforce an arbitration award, or to seek injunctive or equitable relief.
Severability. If any part or parts of this Arbitration Agreement are found under the law to be invalid or unenforceable by a court of competent jurisdiction, then such specific part or parts shall be of no force and effect and shall be severed and the remainder of the Agreement shall continue in full force and effect.
Right to Waive. Any or all of the rights and limitations set forth in this Arbitration Agreement may be waived by the party against whom the claim is asserted. Such waiver shall not waive or affect any other portion of this Arbitration Agreement.
Survival of Agreement. This Arbitration Agreement will survive the termination of your relationship with Company.
Small Claims Court. Nonetheless the foregoing, either you or the Company may bring an individual action in small claims court.
Emergency Equitable Relief. Anyhow the foregoing, either party may seek emergency equitable relief before a state or federal court in order to maintain the status quo pending arbitration. A request for interim measures shall not be deemed a waiver of any other rights or obligations under this Arbitration Agreement.
Claims Not Subject to Arbitration. Notwithstanding the foregoing, claims of defamation, violation of the Computer Fraud and Abuse Act, and infringement or misappropriation of the other party’s patent, copyright, trademark or trade secrets shall not be subject to this Arbitration Agreement.
In any circumstances where the foregoing Arbitration Agreement permits the parties to litigate in court, the parties hereby agree to submit to the personal jurisdiction of the courts located within Netherlands County, California, for such purposes.
The Site may be subject to U.S. export control laws and may be subject to export or import regulations in other countries. You agree not to export, re-export, or transfer, directly or indirectly, any U.S. technical data acquired from Company, or any products utilizing such data, in violation of the United States export laws or regulations.
Company is located at the address in Section 10.8. If you are a California resident, you may report complaints to the Complaint Assistance Unit of the Division of Consumer Product of the California Department of Consumer Affairs by contacting them in writing at 400 R Street, Sacramento, CA 95814, or by telephone at (800) 952-5210.
Electronic Communications. The communications between you and Company use electronic means, whether you use the Site or send us emails, or whether Company posts notices on the Site or communicates with you via email. For contractual purposes, you (a) consent to receive communications from Company in an electronic form; and (b) agree that all terms and conditions, agreements, notices, disclosures, and other communications that Company provides to you electronically satisfy any legal obligation that such communications would satisfy if it were be in a hard copy writing.
Entire Terms. These Terms constitute the entire agreement between you and us regarding the use of the Site. Our failure to exercise or enforce any right or provision of these Terms shall not operate as a waiver of such right or provision. The section titles in these Terms are for convenience only and have no legal or contractual effect. The word "including" means "including without limitation". If any provision of these Terms is held to be invalid or unenforceable, the other provisions of these Terms will be unimpaired and the invalid or unenforceable provision will be deemed modified so that it is valid and enforceable to the maximum extent permitted by law. Your relationship to Company is that of an independent contractor, and neither party is an agent or partner of the other. These Terms, and your rights and obligations herein, may not be assigned, subcontracted, delegated, or otherwise transferred by you without Company’s prior written consent, and any attempted assignment, subcontract, delegation, or transfer in violation of the foregoing will be null and void. Company may freely assign these Terms. The terms and conditions set forth in these Terms shall be binding upon assignees.
Your Privacy. Please read our Privacy Policy.
Copyright/Trademark Information. Copyright ©. All rights reserved. All trademarks, logos and service marks displayed on the Site are our property or the property of other third-parties. You are not permitted to use these Marks without our prior written consent or the consent of such third party which may own the Marks.
Address: 221B Baker Street
Email: contact@yourdomain.com