Create GitHub issues from Freshdesk or Freshservice ticket sidebars using OAuth and the Request method. Built with React Meta and Crayons.
DevBridge Engineering escalates reproducible bugs from Freshdesk and Freshservice tickets directly into GitHub Issues. See usecase.md for the full DevBridge operational scenarios.
- Ticket sidebar — create GitHub issues without leaving Freshdesk or Freshservice
- Live ticket sync — status and priority update when you change ticket properties
- Editable issue form — set title and description before creating the issue
- OAuth to GitHub — secure access via GitHub OAuth App
- Linked issue view — open the created issue on GitHub from the sidebar
- Ticket sidebar — create GitHub issues without leaving Freshdesk or Freshservice
- Live ticket sync — status and priority update when you change ticket properties
- Editable issue form — set title and description before creating the issue
- OAuth to GitHub — secure access via GitHub OAuth App
- Linked issue view — open the created issue on GitHub from the sidebar
| Surface | Placement | Behavior |
|---|---|---|
app/index.html |
support_ticket.ticket_sidebar |
Create and view linked GitHub issues on Freshdesk |
app/index.html |
service_ticket.ticket_sidebar |
Same workflow on Freshservice tickets |
config/oauth_config.json registers GitHub OAuth with repo scope. Client ID and secret are collected via oauth_iparams during installation.
| Template | Purpose |
|---|---|
createGithubIssue |
POST new issue to configured owner/repo |
getGithubIssue |
GET issue details by number |
client.data.get('ticket') and contact context seed the issue form. Events API listeners keep status and priority in sync when ticket properties change.
client.db stores the GitHub issue number and URL keyed by Freshdesk ticket ID so agents can reopen the sidebar and continue from the linked issue.
The app uses Freshworks Crayons v4 design system:
| Component | Usage |
|---|---|
FwButton |
Create issue and open on GitHub |
FwInput / FwTextarea |
Editable issue title and description |
FwLabel |
Ticket field labels |
FwInlineMessage |
Success and error feedback |
octocat-service-app/
├── app/
│ ├── index.html # React Meta entry
│ ├── components/ # SidebarMain, GitHubSidebar
│ ├── utils/github.js # Issue payload, events, client.db helpers
│ └── styles/
├── config/
│ ├── iparams.json # github_repo, github_assignee
│ ├── oauth_config.json # GitHub OAuth + oauth_iparams
│ └── requests.json # createGithubIssue, getGithubIssue
├── tests/
│ └── github.test.js
├── manifest.json
├── usecase.md
└── README.md
- Freshworks CLI (FDK) v10.1.2 or later
- Node.js v24.x
- A Freshdesk or Freshservice trial account
- A GitHub account with permission to create issues in the target repository
Enable global apps before local development:
fdk config set global_apps.enabled true- Sign in to GitHub and open Settings → Developer settings → OAuth Apps → New OAuth App.
- Fill in the form:
| Field | Local development | Production (marketplace) |
|---|---|---|
| Application name | e.g. Freshdesk GitHub Issues (dev) |
e.g. Freshdesk GitHub Issues |
| Homepage URL | http://localhost:10001 |
Your app or company URL |
| Authorization callback URL | http://localhost:10001/auth/callback |
https://oauth.freshdev.io/auth/callback |
- Click Register application.
- Copy the Client ID.
- Click Generate a new client secret and copy the Client secret (shown once).
Scopes: The app requests repo so it can create issues in your target repository. The authorizing GitHub user must have write access to that repo.
Tip: For local dev, only http://localhost:10001/auth/callback is required. Add the Freshworks production callback before you publish to the marketplace.
- Choose the repo where issues should be created (format:
owner/repo, e.g.my-org/product-backlog). - Confirm the GitHub account you will authorize can create issues in that repo.
- Optional: note a GitHub username to assign new issues to (installation iparam
github_assignee).
npm install
fdk runKeep this terminal running. Only one app can use port 10001 at a time.
Open http://localhost:10001/custom_configs:
- GitHub OAuth Client ID — paste from Step 1.
- GitHub OAuth Client Secret — paste from Step 1.
- Click Authorize and approve access on GitHub.
- GitHub repository — enter
owner/repofor the target repo. - Default GitHub assignee (optional) — GitHub username for new issues.
Save the installation page after all fields are set.
- With
fdk runstill running, open a ticket with?dev=true:- Freshdesk:
https://<your-domain>.freshdesk.com/a/tickets/<id>?dev=true - Freshservice:
https://<your-domain>.freshservice.com/a/tickets/<id>?dev=true
- Freshdesk:
- In the ticket right sidebar, open the Apps panel and select this app.
- Review the ticket summary (status and priority stay in sync with the ticket).
- Edit Issue title and Description, then click Create GitHub issue.
- Use Open issue on GitHub to view the linked issue.
If the iframe is blank, allow insecure localhost in your browser (see Freshworks dev docs → Test your app).
| Environment | Redirect URI |
|---|---|
| Local | http://localhost:10001/auth/callback |
| Production | https://oauth.freshdev.io/auth/callback |
fdk runmust be running in this app folder (not another app on port10001).- URL must include
?dev=true(or&dev=true). - Open the Apps section in the ticket sidebar.
- Restart
fdk runafter changingmanifest.json.
- Client ID or secret is wrong — re-enter on
custom_configsand authorize again. - Callback URL in GitHub must match
http://localhost:10001/auth/callbackexactly for local dev. - OAuth app owner must have access to the github_repo you configured.
- Stale local OAuth — stop
fdk run, delete.fdk/localstore, run again, and re-authorize.
- Confirm OAuth is authorized and github_repo is valid (
owner/repo). - Authorizing user needs issue write permission on the repo.
- Check browser console and
log/fdk.logfor API errors from GitHub.
fdk validate
npm run fdk-unit-testReset local OAuth and installation parameters when re-testing:
rm .fdk/store.sqlite
fdk run- OAuth tokens stay server-side — Request Templates inject GitHub access tokens; React never handles secrets.
- Persist links in client.db — store issue number per ticket so tier-2 agents see existing escalations on open.
- Events keep UI fresh — subscribe to ticket property events so sidebar status matches the ticket without reload.
- Cross-product manifest — one React Meta bundle on
support_ticketandservice_ticketcovers Freshdesk and Freshservice.
