BETA
OWN YOUR LINKEDIN INFRASTRUCTURE
Self-hosted LinkedIn sales software
Ornn is a self-hostable LinkedIn outreach system built for GTM agencies. You get the full codebase - so you can plug it into your own stack, run it on your own infrastructure, and scale across your clients without per-seat restrictions.
BETA
OWN YOUR LINKEDIN INFRASTRUCTURE
Self-hosted LinkedIn sales software
Ornn is a self-hostable LinkedIn outreach system built for GTM agencies to increase margins. You get the full codebase so you can quickly vibe code custom GTM systems.




































Has LinkedIn profile url?
yes / no
Yes

Didn't reply to Instantly campaign
trigger

Write a message
using website info

Update CRM

Send message
and request
Has LinkedIn profile url?
yes / no
Yes

Didn't reply to Instantly campaign
trigger

Write a message
using website info

Update CRM

Send message
and request
Has LinkedIn profile url?
yes / no
Yes

Didn't reply to Instantly campaign
trigger

Write a message
using website info

Update CRM

Send message
and request
Comparison
Fix your LinkedIn outreach margins
Fix your LinkedIn
outreach margins
Most LinkedIn tools charge per account, so scaling outbound means rising costs. With Ornn, you pay once. You get full codebase access, deploy it on your own infrastructure, and run unlimited LinkedIn accounts with no subscriptions or per-seat pricing.
Unlimited LinkedIn accounts
Unlimited LinkedIn accounts
One-time purchase
One-time
purchase
Full codebase access
Full codebase access
Fully customizable
Fully
customizable
Multiple workspaces
Fully
customizable
All LinkedIn actions
Fully
customizable
AI personalized messages
Fully
customizable
Research leads
Fully
customizable
Benefit 1: Increase Margins
Unlimited senders.
Run unlimited LinkedIn accounts at no extra cost. Ornn is self-hosted, so you’re not paying per account or per seat. Add as many senders as you need and scale outbound without your costs going up.
Benefit 1: Increase Margins
Unlimited senders.
Run unlimited LinkedIn accounts at no extra cost. Ornn is self-hosted, so you’re not paying per account or per seat. Add as many senders as you need and scale outbound without your costs going up.
Benefit 1: Increase Margins
Unlimited senders.
Run unlimited LinkedIn accounts at no extra cost. Ornn is self-hosted, so you’re not paying per account or per seat. Add as many senders as you need and scale outbound without your costs going up.
Edit
Describe Changes
Regenerate
Send
Benefit 2: Fully Customizable Software
Get the full codebase. Customize anything.
You get the full codebase. Modify anything, integrate everything, and build outbound infrastructure that works exactly the way your agency does under a perpetual self-hosted licence.
Edit
Describe Changes
Regenerate
Send
Benefit 2: Fully Customizable Software
Get the full codebase. Customize anything.
You get the full codebase. Modify anything, integrate everything, and build outbound infrastructure that works exactly the way your agency does under a perpetual self-hosted licence.
Edit
Describe Changes
Regenerate
Send
Benefit 1: Increase Margins
Get the full codebase. Customize anything.
You get the full codebase. Modify anything, integrate everything, and build outbound infrastructure that works exactly the way your agency does under a perpetual self-hosted licence.
Features
The system architecture
Ornn is delivered as a complete, self-hostable codebase - including the frontend, backend, automation engine, and data layer.
Frontend / Webapp
Dashboard for managing accounts, campaigns, and workflows across all clients.
Backend / Automation Engine
- webapp/├── api/│ └── craft-messages-api.ts├── app/│ ├── api/│ │ └── data/│ │ ├── users/│ │ │ └── [userId]/│ │ └── workspaces/│ │ └── [workspaceId]/│ ├── campaigns/│ │ ├── campaigns-content.jsx│ │ ├── campaigns-page-content.jsx│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ └── page.tsx│ ├── prospects/│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ ├── page.tsx│ │ ├── page_ui_backup.jsx│ │ └── prospects-checkbox-fix.css│ ├── favicon.ico│ ├── globals.css│ ├── layout.tsx│ └── page.tsx├── assets/│ └── data/│ ├── countries.js│ └── index.ts├── auth/│ ├── guard/│ │ ├── auth-guard.tsx│ │ ├── country-guard.tsx│ │ └── index.ts│ └── hooks/│ ├── index.ts│ └── use-auth-context.tsx├── components/│ ├── approvals/│ │ └── approvals-modal.tsx│ ├── automation-status-bar/│ │ ├── automation-status-bar.jsx│ │ ├── automation-status-bar.tsx│ │ └── index.js│ ├── campaign-workflow/│ │ ├── campaign-workflow-builder.jsx│ │ └── workflow-nodes.jsx│ ├── company-selection/│ │ └── index.tsx│ ├── country-select/│ │ ├── country-select.jsx│ │ └── index.js│ ├── custom-icon/│ │ └── custom-icon.tsx│ ├── desktop-leads-summary/│ │ ├── desktop-leads-summary-widget.jsx│ │ └── index.js│ ├── flag-icon/│ │ └── index.tsx│ ├── global-header/│ │ └── global-header.tsx│ ├── iconify/│ ├── import-popover/│ │ └── import-popover.tsx│ ├── lead-chat-popup/│ │ ├── lead-chat-popup.jsx│ │ └── lead-chat-popup-clean.jsx│ ├── lead-info-drawer-hub/│ │ ├── index.js│ │ └── lead-info-drawer-hub.jsx│ ├── left-nav-panel/│ │ └── manage-accounts-modal.tsx│ ├── mobile-block/│ │ └── mobile-block.tsx│ ├── mobile-leads-tiles/│ │ ├── leads-summary-widget.jsx│ │ ├── mobile-leads-tiles.jsx│ │ └── mobile-leads-tiles.tsx│ ├── modern-leads-table/│ │ ├── combined-filter-popover.jsx│ │ ├── modern-leads-table.jsx│ │ └── modern-leads-table-new.jsx│ ├── no-contact-popover/│ │ ├── no-contact-popover.jsx│ │ └── no-contact-popover.tsx│ ├── personalize-popover/│ │ ├── index.js│ │ └── personalize-popover.jsx│ ├── profile-avatar/│ │ ├── index.js│ │ └── profile-avatar.jsx│ ├── rewriting-status-bar/│ │ ├── index.js│ │ └── rewriting-status-bar.jsx│ ├── scraping-status-bar/│ │ └── scraping-status-bar.jsx│ ├── settings/│ │ ├── context/│ │ │ ├── index.js│ │ │ ├── settings-context.js│ │ │ ├── settings-context.tsx│ │ │ ├── settings-provider.jsx│ │ │ └── use-settings-context.js│ │ ├── drawer/│ │ │ ├── base-option.jsx│ │ │ ├── font-options.jsx│ │ │ ├── fullscreen-button.jsx│ │ │ ├── index.js│ │ │ ├── nav-layout-option.jsx│ │ │ ├── presets-options.jsx│ │ │ ├── settings-drawer.jsx│ │ │ ├── settings-drawer.tsx│ │ │ └── styles.jsx│ │ ├── accounts-modal.jsx│ │ ├── accounts-modal.tsx│ │ ├── accounts-nav-item.jsx│ │ ├── campaigns-tab-content.jsx│ │ ├── config-settings.js│ │ ├── find-leads-modal.jsx│ │ ├── find-leads-modal.tsx│ │ ├── hubspot-integration-content.jsx│ │ ├── index.js│ │ ├── index.tsx│ │ ├── integrations-content.jsx│ │ ├── integrations-modal.jsx│ │ ├── integrations-modal.tsx│ │ ├── palette-picker-content.jsx│ │ ├── server.js│ │ ├── settings-config.js│ │ ├── settings-content.jsx│ │ ├── settings-inline-view.jsx│ │ ├── settings-inline-view.tsx│ │ ├── settings-modal.jsx│ │ ├── settings-nav-item.jsx│ │ ├── smartlead-integration-content.jsx│ │ ├── smartlead-webhook-content.jsx│ │ ├── smartlead-webhook-management-content.jsx│ │ ├── subscription-content.jsx│ │ ├── subscription-pricing-content.jsx│ │ ├── theme-modal.jsx│ │ ├── theme-modal.tsx│ │ ├── webhook-management.jsx│ │ └── webhook-management-content.jsx│ ├── webhook-management-modal/│ │ └── webhook-management-modal.tsx│ ├── custom-icon.tsx│ ├── iconify.tsx│ ├── lead-info-drawer-hub.tsx│ ├── left-nav-panel.tsx│ ├── manage-accounts-content.tsx│ ├── personalize-popover.tsx│ └── theme-provider.tsx├── contexts/│ ├── drawer-context.tsx│ ├── settings-modal-context.tsx│ ├── status-bar-context.tsx│ ├── user-initiated-context.tsx│ └── workspace-context.tsx├── data/│ └── index.ts├── hooks/│ ├── use-accent.js│ ├── use-accent.ts│ ├── use-boolean.js│ ├── use-boolean.ts│ ├── use-cookies.js│ ├── useFirestoreData.ts│ ├── use-lazy-leads.ts│ └── use-leads-data.ts├── layouts/│ ├── components/│ │ └── trial-expiration-modal.tsx│ ├── core/│ │ ├── header-section.tsx│ │ ├── layout-section.tsx│ │ └── main-section.tsx│ ├── dashboard/│ │ └── css-vars.ts│ └── dashboard.tsx├── lib/│ ├── firebase.ts│ ├── firestore-stubs.ts│ └── stripe.ts├── minimal-shared/│ ├── hooks.ts│ └── utils.ts├── public/│ ├── icons/│ │ ├── accounts.svg│ │ ├── add.svg│ │ ├── add_linkedin_account.svg│ │ ├── all.svg│ │ ├── analytics.svg│ │ ├── archive.svg│ │ ├── back_arrow.svg│ │ ├── banner_image.svg│ │ ├── bell.svg│ │ ├── briefcase.svg│ │ ├── calendar.svg│ │ ├── campaign.svg│ │ ├── chat.svg│ │ ├── check.svg│ │ ├── check_circle.svg│ │ ├── checklist.svg│ │ ├── clock.svg│ │ ├── close.svg│ │ ├── close2.svg│ │ ├── commented.svg│ │ ├── commentedall.svg│ │ ├── company.svg│ │ ├── company_search.svg│ │ ├── condition.svg│ │ ├── cookies.svg│ │ ├── copy.svg│ │ ├── crop.svg│ │ ├── csv.svg│ │ ├── delete.svg│ │ ├── dots.svg│ │ ├── edit.svg│ │ ├── edit_limits.svg│ │ ├── education.svg│ │ ├── event_attendees.svg│ │ ├── export.svg│ │ ├── eye.svg│ │ ├── eye_closed.svg│ │ ├── facebook.svg│ │ ├── feed.svg│ │ ├── filter.svg│ │ ├── find_leads.svg│ │ ├── followers.svg│ │ ├── globe.svg│ │ ├── headline.svg│ │ ├── help.svg│ │ ├── import.svg│ │ ├── industry.svg│ │ ├── info.svg│ │ ├── integrations.svg│ │ ├── leftarrow.svg│ │ ├── like_post.svg│ │ ├── link.svg│ │ ├── linkedin.svg│ │ ├── lists.svg│ │ ├── location.svg│ │ ├── logout.svg│ │ ├── maximise.svg│ │ ├── menu.svg│ │ ├── minimize.svg│ │ ├── new_list.svg│ │ ├── next_step.svg│ │ ├── no_leads_found.svg│ │ ├── not_connected.svg│ │ ├── notcommnted.svg│ │ ├── notrelevant.svg│ │ ├── overview.svg│ │ ├── palette.svg│ │ ├── pause.svg│ │ ├── people.svg│ │ ├── people_search.svg│ │ ├── play│ │ ├── play.svg│ │ ├── post_commenters.svg│ │ ├── post_reactors.svg│ │ ├── posts.svg│ │ ├── profile_urls.svg│ │ ├── proposed.svg│ │ ├── proxy.svg│ │ ├── reelevant.svg│ │ ├── regenerate_message.svg│ │ ├── rent_account.svg│ │ ├── replied.svg│ │ ├── rightarrow.svg│ │ ├── save.svg│ │ ├── search.svg│ │ ├── send.svg│ │ ├── settings.svg│ │ ├── sidebar.svg│ │ ├── star.svg│ │ ├── stop.svg│ │ ├── subscription.svg│ │ ├── sync.svg│ │ ├── tagline.svg│ │ ├── trending_up.svg│ │ ├── twitter.svg│ │ ├── unsend.svg│ │ ├── upload.svg│ │ ├── warning.svg│ │ ├── workflow.svg│ │ ├── workspaces.svg│ │ ├── zoomin.svg│ │ └── zoomout.svg│ ├── logo/│ │ └── logo.svg│ └── no_pic.png├── routes/│ └── paths.ts├── services/│ ├── leads-data-service.ts│ ├── linkedin-accounts-cache-service.ts│ └── manage-accounts-service.ts├── theme/│ ├── components/│ │ ├── index.js│ │ └── table-overrides.js│ ├── core/│ │ ├── components/│ │ │ ├── accordion.jsx│ │ │ ├── alert.jsx│ │ │ ├── appbar.jsx│ │ │ ├── autocomplete.jsx│ │ │ ├── avatar.jsx│ │ │ ├── backdrop.jsx│ │ │ ├── badge.jsx│ │ │ ├── breadcrumbs.jsx│ │ │ ├── button.jsx│ │ │ ├── button-fab.jsx│ │ │ ├── button-group.jsx│ │ │ ├── button-toggle.jsx│ │ │ ├── card.jsx│ │ │ ├── checkbox.jsx│ │ │ ├── chip.jsx│ │ │ ├── container.js│ │ │ ├── dialog.jsx│ │ │ ├── drawer.jsx│ │ │ ├── form.jsx│ │ │ ├── index.js│ │ │ ├── link.jsx│ │ │ ├── list.jsx│ │ │ ├── menu.jsx│ │ │ ├── mui-x-data-grid.jsx│ │ │ ├── mui-x-date-picker.jsx│ │ │ ├── mui-x-tree-view.jsx│ │ │ ├── pagination.jsx│ │ │ ├── paper.jsx│ │ │ ├── popover.jsx│ │ │ ├── progress.jsx│ │ │ ├── radio.jsx│ │ │ ├── rating.jsx│ │ │ ├── select.jsx│ │ │ ├── skeleton.jsx│ │ │ ├── slider.jsx│ │ │ ├── stack.jsx│ │ │ ├── stepper.jsx│ │ │ ├── svg-icon.jsx│ │ │ ├── switch.jsx│ │ │ ├── table.jsx│ │ │ ├── tabs.jsx│ │ │ ├── textfield.jsx│ │ │ ├── timeline.jsx│ │ │ ├── tooltip.jsx│ │ │ └── typography.jsx│ │ ├── mixins/│ │ │ ├── background.js│ │ │ ├── border.js│ │ │ ├── global-styles-components.js│ │ │ ├── index.js│ │ │ ├── mixins.js│ │ │ └── text.js│ │ ├── custom-shadows.js│ │ ├── index.js│ │ ├── palette.js│ │ ├── shadows.js│ │ └── typography.js│ ├── with-settings/│ │ ├── color-presets.js│ │ ├── index.js│ │ ├── right-to-left.jsx│ │ ├── update-components.js│ │ └── update-core.js│ ├── accent-palette.js│ ├── accent-palette.ts│ ├── create-classes.js│ ├── create-theme.js│ ├── index.js│ ├── styles.js│ ├── theme-config.js│ ├── theme-overrides.js│ └── theme-provider.jsx├── utils/│ └── account-count-service.ts├── .gitignore├── COMPLETE_FILE_LIST.txt├── config-global.ts├── COPIED_COMPONENTS.md├── COPY_PLAN.md├── CURRENT_STATUS.md├── DEPENDENCIES.md├── DIRECTORIES.txt├── DIRECTORY_LISTING.txt├── DIRECTORY_STRUCTURE.md├── DIRECTORY_SUMMARY.md├── DIRECTORY_TREE.txt├── eslint.config.mjs├── EXACT_DEPENDENCIES.md├── FILES_LIST.json├── FOLDER_STRUCTURE.txt├── next.config.ts├── next-env.d.ts├── package.json├── package-lock.json├── PLAN.md├── postcss.config.mjs├── README.md├── STATUS.md├── SUMMARY.md└── tsconfig.json
- webapp/├── api/│ └── craft-messages-api.ts├── app/│ ├── api/│ │ └── data/│ │ ├── users/│ │ │ └── [userId]/│ │ └── workspaces/│ │ └── [workspaceId]/│ ├── campaigns/│ │ ├── campaigns-content.jsx│ │ ├── campaigns-page-content.jsx│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ └── page.tsx│ ├── prospects/│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ ├── page.tsx│ │ ├── page_ui_backup.jsx│ │ └── prospects-checkbox-fix.css│ ├── favicon.ico│ ├── globals.css│ ├── layout.tsx│ └── page.tsx├── assets/│ └── data/│ ├── countries.js│ └── index.ts├── auth/│ ├── guard/│ │ ├── auth-guard.tsx│ │ ├── country-guard.tsx│ │ └── index.ts│ └── hooks/│ ├── index.ts│ └── use-auth-context.tsx├── components/│ ├── approvals/│ │ └── approvals-modal.tsx│ ├── automation-status-bar/│ │ ├── automation-status-bar.jsx│ │ ├── automation-status-bar.tsx│ │ └── index.js│ ├── campaign-workflow/│ │ ├── campaign-workflow-builder.jsx│ │ └── workflow-nodes.jsx│ ├── company-selection/│ │ └── index.tsx│ ├── country-select/│ │ ├── country-select.jsx│ │ └── index.js│ ├── custom-icon/│ │ └── custom-icon.tsx│ ├── desktop-leads-summary/│ │ ├── desktop-leads-summary-widget.jsx│ │ └── index.js│ ├── flag-icon/│ │ └── index.tsx│ ├── global-header/│ │ └── global-header.tsx│ ├── iconify/│ ├── import-popover/│ │ └── import-popover.tsx│ ├── lead-chat-popup/│ │ ├── lead-chat-popup.jsx│ │ └── lead-chat-popup-clean.jsx│ ├── lead-info-drawer-hub/│ │ ├── index.js│ │ └── lead-info-drawer-hub.jsx│ ├── left-nav-panel/│ │ └── manage-accounts-modal.tsx│ ├── mobile-block/│ │ └── mobile-block.tsx│ ├── mobile-leads-tiles/│ │ ├── leads-summary-widget.jsx│ │ ├── mobile-leads-tiles.jsx│ │ └── mobile-leads-tiles.tsx│ ├── modern-leads-table/│ │ ├── combined-filter-popover.jsx│ │ ├── modern-leads-table.jsx│ │ └── modern-leads-table-new.jsx│ ├── no-contact-popover/│ │ ├── no-contact-popover.jsx│ │ └── no-contact-popover.tsx│ ├── personalize-popover/│ │ ├── index.js│ │ └── personalize-popover.jsx│ ├── profile-avatar/│ │ ├── index.js│ │ └── profile-avatar.jsx│ ├── rewriting-status-bar/│ │ ├── index.js│ │ └── rewriting-status-bar.jsx│ ├── scraping-status-bar/│ │ └── scraping-status-bar.jsx│ ├── settings/│ │ ├── context/│ │ │ ├── index.js│ │ │ ├── settings-context.js│ │ │ ├── settings-context.tsx│ │ │ ├── settings-provider.jsx│ │ │ └── use-settings-context.js│ │ ├── drawer/│ │ │ ├── base-option.jsx│ │ │ ├── font-options.jsx│ │ │ ├── fullscreen-button.jsx│ │ │ ├── index.js│ │ │ ├── nav-layout-option.jsx│ │ │ ├── presets-options.jsx│ │ │ ├── settings-drawer.jsx│ │ │ ├── settings-drawer.tsx│ │ │ └── styles.jsx│ │ ├── accounts-modal.jsx│ │ ├── accounts-modal.tsx│ │ ├── accounts-nav-item.jsx│ │ ├── campaigns-tab-content.jsx│ │ ├── config-settings.js│ │ ├── find-leads-modal.jsx│ │ ├── find-leads-modal.tsx│ │ ├── hubspot-integration-content.jsx│ │ ├── index.js│ │ ├── index.tsx│ │ ├── integrations-content.jsx│ │ ├── integrations-modal.jsx│ │ ├── integrations-modal.tsx│ │ ├── palette-picker-content.jsx│ │ ├── server.js│ │ ├── settings-config.js│ │ ├── settings-content.jsx│ │ ├── settings-inline-view.jsx│ │ ├── settings-inline-view.tsx│ │ ├── settings-modal.jsx│ │ ├── settings-nav-item.jsx│ │ ├── smartlead-integration-content.jsx│ │ ├── smartlead-webhook-content.jsx│ │ ├── smartlead-webhook-management-content.jsx│ │ ├── subscription-content.jsx│ │ ├── subscription-pricing-content.jsx│ │ ├── theme-modal.jsx│ │ ├── theme-modal.tsx│ │ ├── webhook-management.jsx│ │ └── webhook-management-content.jsx│ ├── webhook-management-modal/│ │ └── webhook-management-modal.tsx│ ├── custom-icon.tsx│ ├── iconify.tsx│ ├── lead-info-drawer-hub.tsx│ ├── left-nav-panel.tsx│ ├── manage-accounts-content.tsx│ ├── personalize-popover.tsx│ └── theme-provider.tsx├── contexts/│ ├── drawer-context.tsx│ ├── settings-modal-context.tsx│ ├── status-bar-context.tsx│ ├── user-initiated-context.tsx│ └── workspace-context.tsx├── data/│ └── index.ts├── hooks/│ ├── use-accent.js│ ├── use-accent.ts│ ├── use-boolean.js│ ├── use-boolean.ts│ ├── use-cookies.js│ ├── useFirestoreData.ts│ ├── use-lazy-leads.ts│ └── use-leads-data.ts├── layouts/│ ├── components/│ │ └── trial-expiration-modal.tsx│ ├── core/│ │ ├── header-section.tsx│ │ ├── layout-section.tsx│ │ └── main-section.tsx│ ├── dashboard/│ │ └── css-vars.ts│ └── dashboard.tsx├── lib/│ ├── firebase.ts│ ├── firestore-stubs.ts│ └── stripe.ts├── minimal-shared/│ ├── hooks.ts│ └── utils.ts├── public/│ ├── icons/│ │ ├── accounts.svg│ │ ├── add.svg│ │ ├── add_linkedin_account.svg│ │ ├── all.svg│ │ ├── analytics.svg│ │ ├── archive.svg│ │ ├── back_arrow.svg│ │ ├── banner_image.svg│ │ ├── bell.svg│ │ ├── briefcase.svg│ │ ├── calendar.svg│ │ ├── campaign.svg│ │ ├── chat.svg│ │ ├── check.svg│ │ ├── check_circle.svg│ │ ├── checklist.svg│ │ ├── clock.svg│ │ ├── close.svg│ │ ├── close2.svg│ │ ├── commented.svg│ │ ├── commentedall.svg│ │ ├── company.svg│ │ ├── company_search.svg│ │ ├── condition.svg│ │ ├── cookies.svg│ │ ├── copy.svg│ │ ├── crop.svg│ │ ├── csv.svg│ │ ├── delete.svg│ │ ├── dots.svg│ │ ├── edit.svg│ │ ├── edit_limits.svg│ │ ├── education.svg│ │ ├── event_attendees.svg│ │ ├── export.svg│ │ ├── eye.svg│ │ ├── eye_closed.svg│ │ ├── facebook.svg│ │ ├── feed.svg│ │ ├── filter.svg│ │ ├── find_leads.svg│ │ ├── followers.svg│ │ ├── globe.svg│ │ ├── headline.svg│ │ ├── help.svg│ │ ├── import.svg│ │ ├── industry.svg│ │ ├── info.svg│ │ ├── integrations.svg│ │ ├── leftarrow.svg│ │ ├── like_post.svg│ │ ├── link.svg│ │ ├── linkedin.svg│ │ ├── lists.svg│ │ ├── location.svg│ │ ├── logout.svg│ │ ├── maximise.svg│ │ ├── menu.svg│ │ ├── minimize.svg│ │ ├── new_list.svg│ │ ├── next_step.svg│ │ ├── no_leads_found.svg│ │ ├── not_connected.svg│ │ ├── notcommnted.svg│ │ ├── notrelevant.svg│ │ ├── overview.svg│ │ ├── palette.svg│ │ ├── pause.svg│ │ ├── people.svg│ │ ├── people_search.svg│ │ ├── play│ │ ├── play.svg│ │ ├── post_commenters.svg│ │ ├── post_reactors.svg│ │ ├── posts.svg│ │ ├── profile_urls.svg│ │ ├── proposed.svg│ │ ├── proxy.svg│ │ ├── reelevant.svg│ │ ├── regenerate_message.svg│ │ ├── rent_account.svg│ │ ├── replied.svg│ │ ├── rightarrow.svg│ │ ├── save.svg│ │ ├── search.svg│ │ ├── send.svg│ │ ├── settings.svg│ │ ├── sidebar.svg│ │ ├── star.svg│ │ ├── stop.svg│ │ ├── subscription.svg│ │ ├── sync.svg│ │ ├── tagline.svg│ │ ├── trending_up.svg│ │ ├── twitter.svg│ │ ├── unsend.svg│ │ ├── upload.svg│ │ ├── warning.svg│ │ ├── workflow.svg│ │ ├── workspaces.svg│ │ ├── zoomin.svg│ │ └── zoomout.svg│ ├── logo/│ │ └── logo.svg│ └── no_pic.png├── routes/│ └── paths.ts├── services/│ ├── leads-data-service.ts│ ├── linkedin-accounts-cache-service.ts│ └── manage-accounts-service.ts├── theme/│ ├── components/│ │ ├── index.js│ │ └── table-overrides.js│ ├── core/│ │ ├── components/│ │ │ ├── accordion.jsx│ │ │ ├── alert.jsx│ │ │ ├── appbar.jsx│ │ │ ├── autocomplete.jsx│ │ │ ├── avatar.jsx│ │ │ ├── backdrop.jsx│ │ │ ├── badge.jsx│ │ │ ├── breadcrumbs.jsx│ │ │ ├── button.jsx│ │ │ ├── button-fab.jsx│ │ │ ├── button-group.jsx│ │ │ ├── button-toggle.jsx│ │ │ ├── card.jsx│ │ │ ├── checkbox.jsx│ │ │ ├── chip.jsx│ │ │ ├── container.js│ │ │ ├── dialog.jsx│ │ │ ├── drawer.jsx│ │ │ ├── form.jsx│ │ │ ├── index.js│ │ │ ├── link.jsx│ │ │ ├── list.jsx│ │ │ ├── menu.jsx│ │ │ ├── mui-x-data-grid.jsx│ │ │ ├── mui-x-date-picker.jsx│ │ │ ├── mui-x-tree-view.jsx│ │ │ ├── pagination.jsx│ │ │ ├── paper.jsx│ │ │ ├── popover.jsx│ │ │ ├── progress.jsx│ │ │ ├── radio.jsx│ │ │ ├── rating.jsx│ │ │ ├── select.jsx│ │ │ ├── skeleton.jsx│ │ │ ├── slider.jsx│ │ │ ├── stack.jsx│ │ │ ├── stepper.jsx│ │ │ ├── svg-icon.jsx│ │ │ ├── switch.jsx│ │ │ ├── table.jsx│ │ │ ├── tabs.jsx│ │ │ ├── textfield.jsx│ │ │ ├── timeline.jsx│ │ │ ├── tooltip.jsx│ │ │ └── typography.jsx│ │ ├── mixins/│ │ │ ├── background.js│ │ │ ├── border.js│ │ │ ├── global-styles-components.js│ │ │ ├── index.js│ │ │ ├── mixins.js│ │ │ └── text.js│ │ ├── custom-shadows.js│ │ ├── index.js│ │ ├── palette.js│ │ ├── shadows.js│ │ └── typography.js│ ├── with-settings/│ │ ├── color-presets.js│ │ ├── index.js│ │ ├── right-to-left.jsx│ │ ├── update-components.js│ │ └── update-core.js│ ├── accent-palette.js│ ├── accent-palette.ts│ ├── create-classes.js│ ├── create-theme.js│ ├── index.js│ ├── styles.js│ ├── theme-config.js│ ├── theme-overrides.js│ └── theme-provider.jsx├── utils/│ └── account-count-service.ts├── .gitignore├── COMPLETE_FILE_LIST.txt├── config-global.ts├── COPIED_COMPONENTS.md├── COPY_PLAN.md├── CURRENT_STATUS.md├── DEPENDENCIES.md├── DIRECTORIES.txt├── DIRECTORY_LISTING.txt├── DIRECTORY_STRUCTURE.md├── DIRECTORY_SUMMARY.md├── DIRECTORY_TREE.txt├── eslint.config.mjs├── EXACT_DEPENDENCIES.md├── FILES_LIST.json├── FOLDER_STRUCTURE.txt├── next.config.ts├── next-env.d.ts├── package.json├── package-lock.json├── PLAN.md├── postcss.config.mjs├── README.md├── STATUS.md├── SUMMARY.md└── tsconfig.json
Frontend / Webapp
Dashboard for managing accounts, campaigns, and workflows across all clients.
Backend / Automation Engine
- webapp/├── api/│ └── craft-messages-api.ts├── app/│ ├── api/│ │ └── data/│ │ ├── users/│ │ │ └── [userId]/│ │ └── workspaces/│ │ └── [workspaceId]/│ ├── campaigns/│ │ ├── campaigns-content.jsx│ │ ├── campaigns-page-content.jsx│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ └── page.tsx│ ├── prospects/│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ ├── page.tsx│ │ ├── page_ui_backup.jsx│ │ └── prospects-checkbox-fix.css│ ├── favicon.ico│ ├── globals.css│ ├── layout.tsx│ └── page.tsx├── assets/│ └── data/│ ├── countries.js│ └── index.ts├── auth/│ ├── guard/│ │ ├── auth-guard.tsx│ │ ├── country-guard.tsx│ │ └── index.ts│ └── hooks/│ ├── index.ts│ └── use-auth-context.tsx├── components/│ ├── approvals/│ │ └── approvals-modal.tsx│ ├── automation-status-bar/│ │ ├── automation-status-bar.jsx│ │ ├── automation-status-bar.tsx│ │ └── index.js│ ├── campaign-workflow/│ │ ├── campaign-workflow-builder.jsx│ │ └── workflow-nodes.jsx│ ├── company-selection/│ │ └── index.tsx│ ├── country-select/│ │ ├── country-select.jsx│ │ └── index.js│ ├── custom-icon/│ │ └── custom-icon.tsx│ ├── desktop-leads-summary/│ │ ├── desktop-leads-summary-widget.jsx│ │ └── index.js│ ├── flag-icon/│ │ └── index.tsx│ ├── global-header/│ │ └── global-header.tsx│ ├── iconify/│ ├── import-popover/│ │ └── import-popover.tsx│ ├── lead-chat-popup/│ │ ├── lead-chat-popup.jsx│ │ └── lead-chat-popup-clean.jsx│ ├── lead-info-drawer-hub/│ │ ├── index.js│ │ └── lead-info-drawer-hub.jsx│ ├── left-nav-panel/│ │ └── manage-accounts-modal.tsx│ ├── mobile-block/│ │ └── mobile-block.tsx│ ├── mobile-leads-tiles/│ │ ├── leads-summary-widget.jsx│ │ ├── mobile-leads-tiles.jsx│ │ └── mobile-leads-tiles.tsx│ ├── modern-leads-table/│ │ ├── combined-filter-popover.jsx│ │ ├── modern-leads-table.jsx│ │ └── modern-leads-table-new.jsx│ ├── no-contact-popover/│ │ ├── no-contact-popover.jsx│ │ └── no-contact-popover.tsx│ ├── personalize-popover/│ │ ├── index.js│ │ └── personalize-popover.jsx│ ├── profile-avatar/│ │ ├── index.js│ │ └── profile-avatar.jsx│ ├── rewriting-status-bar/│ │ ├── index.js│ │ └── rewriting-status-bar.jsx│ ├── scraping-status-bar/│ │ └── scraping-status-bar.jsx│ ├── settings/│ │ ├── context/│ │ │ ├── index.js│ │ │ ├── settings-context.js│ │ │ ├── settings-context.tsx│ │ │ ├── settings-provider.jsx│ │ │ └── use-settings-context.js│ │ ├── drawer/│ │ │ ├── base-option.jsx│ │ │ ├── font-options.jsx│ │ │ ├── fullscreen-button.jsx│ │ │ ├── index.js│ │ │ ├── nav-layout-option.jsx│ │ │ ├── presets-options.jsx│ │ │ ├── settings-drawer.jsx│ │ │ ├── settings-drawer.tsx│ │ │ └── styles.jsx│ │ ├── accounts-modal.jsx│ │ ├── accounts-modal.tsx│ │ ├── accounts-nav-item.jsx│ │ ├── campaigns-tab-content.jsx│ │ ├── config-settings.js│ │ ├── find-leads-modal.jsx│ │ ├── find-leads-modal.tsx│ │ ├── hubspot-integration-content.jsx│ │ ├── index.js│ │ ├── index.tsx│ │ ├── integrations-content.jsx│ │ ├── integrations-modal.jsx│ │ ├── integrations-modal.tsx│ │ ├── palette-picker-content.jsx│ │ ├── server.js│ │ ├── settings-config.js│ │ ├── settings-content.jsx│ │ ├── settings-inline-view.jsx│ │ ├── settings-inline-view.tsx│ │ ├── settings-modal.jsx│ │ ├── settings-nav-item.jsx│ │ ├── smartlead-integration-content.jsx│ │ ├── smartlead-webhook-content.jsx│ │ ├── smartlead-webhook-management-content.jsx│ │ ├── subscription-content.jsx│ │ ├── subscription-pricing-content.jsx│ │ ├── theme-modal.jsx│ │ ├── theme-modal.tsx│ │ ├── webhook-management.jsx│ │ └── webhook-management-content.jsx│ ├── webhook-management-modal/│ │ └── webhook-management-modal.tsx│ ├── custom-icon.tsx│ ├── iconify.tsx│ ├── lead-info-drawer-hub.tsx│ ├── left-nav-panel.tsx│ ├── manage-accounts-content.tsx│ ├── personalize-popover.tsx│ └── theme-provider.tsx├── contexts/│ ├── drawer-context.tsx│ ├── settings-modal-context.tsx│ ├── status-bar-context.tsx│ ├── user-initiated-context.tsx│ └── workspace-context.tsx├── data/│ └── index.ts├── hooks/│ ├── use-accent.js│ ├── use-accent.ts│ ├── use-boolean.js│ ├── use-boolean.ts│ ├── use-cookies.js│ ├── useFirestoreData.ts│ ├── use-lazy-leads.ts│ └── use-leads-data.ts├── layouts/│ ├── components/│ │ └── trial-expiration-modal.tsx│ ├── core/│ │ ├── header-section.tsx│ │ ├── layout-section.tsx│ │ └── main-section.tsx│ ├── dashboard/│ │ └── css-vars.ts│ └── dashboard.tsx├── lib/│ ├── firebase.ts│ ├── firestore-stubs.ts│ └── stripe.ts├── minimal-shared/│ ├── hooks.ts│ └── utils.ts├── public/│ ├── icons/│ │ ├── accounts.svg│ │ ├── add.svg│ │ ├── add_linkedin_account.svg│ │ ├── all.svg│ │ ├── analytics.svg│ │ ├── archive.svg│ │ ├── back_arrow.svg│ │ ├── banner_image.svg│ │ ├── bell.svg│ │ ├── briefcase.svg│ │ ├── calendar.svg│ │ ├── campaign.svg│ │ ├── chat.svg│ │ ├── check.svg│ │ ├── check_circle.svg│ │ ├── checklist.svg│ │ ├── clock.svg│ │ ├── close.svg│ │ ├── close2.svg│ │ ├── commented.svg│ │ ├── commentedall.svg│ │ ├── company.svg│ │ ├── company_search.svg│ │ ├── condition.svg│ │ ├── cookies.svg│ │ ├── copy.svg│ │ ├── crop.svg│ │ ├── csv.svg│ │ ├── delete.svg│ │ ├── dots.svg│ │ ├── edit.svg│ │ ├── edit_limits.svg│ │ ├── education.svg│ │ ├── event_attendees.svg│ │ ├── export.svg│ │ ├── eye.svg│ │ ├── eye_closed.svg│ │ ├── facebook.svg│ │ ├── feed.svg│ │ ├── filter.svg│ │ ├── find_leads.svg│ │ ├── followers.svg│ │ ├── globe.svg│ │ ├── headline.svg│ │ ├── help.svg│ │ ├── import.svg│ │ ├── industry.svg│ │ ├── info.svg│ │ ├── integrations.svg│ │ ├── leftarrow.svg│ │ ├── like_post.svg│ │ ├── link.svg│ │ ├── linkedin.svg│ │ ├── lists.svg│ │ ├── location.svg│ │ ├── logout.svg│ │ ├── maximise.svg│ │ ├── menu.svg│ │ ├── minimize.svg│ │ ├── new_list.svg│ │ ├── next_step.svg│ │ ├── no_leads_found.svg│ │ ├── not_connected.svg│ │ ├── notcommnted.svg│ │ ├── notrelevant.svg│ │ ├── overview.svg│ │ ├── palette.svg│ │ ├── pause.svg│ │ ├── people.svg│ │ ├── people_search.svg│ │ ├── play│ │ ├── play.svg│ │ ├── post_commenters.svg│ │ ├── post_reactors.svg│ │ ├── posts.svg│ │ ├── profile_urls.svg│ │ ├── proposed.svg│ │ ├── proxy.svg│ │ ├── reelevant.svg│ │ ├── regenerate_message.svg│ │ ├── rent_account.svg│ │ ├── replied.svg│ │ ├── rightarrow.svg│ │ ├── save.svg│ │ ├── search.svg│ │ ├── send.svg│ │ ├── settings.svg│ │ ├── sidebar.svg│ │ ├── star.svg│ │ ├── stop.svg│ │ ├── subscription.svg│ │ ├── sync.svg│ │ ├── tagline.svg│ │ ├── trending_up.svg│ │ ├── twitter.svg│ │ ├── unsend.svg│ │ ├── upload.svg│ │ ├── warning.svg│ │ ├── workflow.svg│ │ ├── workspaces.svg│ │ ├── zoomin.svg│ │ └── zoomout.svg│ ├── logo/│ │ └── logo.svg│ └── no_pic.png├── routes/│ └── paths.ts├── services/│ ├── leads-data-service.ts│ ├── linkedin-accounts-cache-service.ts│ └── manage-accounts-service.ts├── theme/│ ├── components/│ │ ├── index.js│ │ └── table-overrides.js│ ├── core/│ │ ├── components/│ │ │ ├── accordion.jsx│ │ │ ├── alert.jsx│ │ │ ├── appbar.jsx│ │ │ ├── autocomplete.jsx│ │ │ ├── avatar.jsx│ │ │ ├── backdrop.jsx│ │ │ ├── badge.jsx│ │ │ ├── breadcrumbs.jsx│ │ │ ├── button.jsx│ │ │ ├── button-fab.jsx│ │ │ ├── button-group.jsx│ │ │ ├── button-toggle.jsx│ │ │ ├── card.jsx│ │ │ ├── checkbox.jsx│ │ │ ├── chip.jsx│ │ │ ├── container.js│ │ │ ├── dialog.jsx│ │ │ ├── drawer.jsx│ │ │ ├── form.jsx│ │ │ ├── index.js│ │ │ ├── link.jsx│ │ │ ├── list.jsx│ │ │ ├── menu.jsx│ │ │ ├── mui-x-data-grid.jsx│ │ │ ├── mui-x-date-picker.jsx│ │ │ ├── mui-x-tree-view.jsx│ │ │ ├── pagination.jsx│ │ │ ├── paper.jsx│ │ │ ├── popover.jsx│ │ │ ├── progress.jsx│ │ │ ├── radio.jsx│ │ │ ├── rating.jsx│ │ │ ├── select.jsx│ │ │ ├── skeleton.jsx│ │ │ ├── slider.jsx│ │ │ ├── stack.jsx│ │ │ ├── stepper.jsx│ │ │ ├── svg-icon.jsx│ │ │ ├── switch.jsx│ │ │ ├── table.jsx│ │ │ ├── tabs.jsx│ │ │ ├── textfield.jsx│ │ │ ├── timeline.jsx│ │ │ ├── tooltip.jsx│ │ │ └── typography.jsx│ │ ├── mixins/│ │ │ ├── background.js│ │ │ ├── border.js│ │ │ ├── global-styles-components.js│ │ │ ├── index.js│ │ │ ├── mixins.js│ │ │ └── text.js│ │ ├── custom-shadows.js│ │ ├── index.js│ │ ├── palette.js│ │ ├── shadows.js│ │ └── typography.js│ ├── with-settings/│ │ ├── color-presets.js│ │ ├── index.js│ │ ├── right-to-left.jsx│ │ ├── update-components.js│ │ └── update-core.js│ ├── accent-palette.js│ ├── accent-palette.ts│ ├── create-classes.js│ ├── create-theme.js│ ├── index.js│ ├── styles.js│ ├── theme-config.js│ ├── theme-overrides.js│ └── theme-provider.jsx├── utils/│ └── account-count-service.ts├── .gitignore├── COMPLETE_FILE_LIST.txt├── config-global.ts├── COPIED_COMPONENTS.md├── COPY_PLAN.md├── CURRENT_STATUS.md├── DEPENDENCIES.md├── DIRECTORIES.txt├── DIRECTORY_LISTING.txt├── DIRECTORY_STRUCTURE.md├── DIRECTORY_SUMMARY.md├── DIRECTORY_TREE.txt├── eslint.config.mjs├── EXACT_DEPENDENCIES.md├── FILES_LIST.json├── FOLDER_STRUCTURE.txt├── next.config.ts├── next-env.d.ts├── package.json├── package-lock.json├── PLAN.md├── postcss.config.mjs├── README.md├── STATUS.md├── SUMMARY.md└── tsconfig.json
- webapp/├── api/│ └── craft-messages-api.ts├── app/│ ├── api/│ │ └── data/│ │ ├── users/│ │ │ └── [userId]/│ │ └── workspaces/│ │ └── [workspaceId]/│ ├── campaigns/│ │ ├── campaigns-content.jsx│ │ ├── campaigns-page-content.jsx│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ └── page.tsx│ ├── prospects/│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ ├── page.tsx│ │ ├── page_ui_backup.jsx│ │ └── prospects-checkbox-fix.css│ ├── favicon.ico│ ├── globals.css│ ├── layout.tsx│ └── page.tsx├── assets/│ └── data/│ ├── countries.js│ └── index.ts├── auth/│ ├── guard/│ │ ├── auth-guard.tsx│ │ ├── country-guard.tsx│ │ └── index.ts│ └── hooks/│ ├── index.ts│ └── use-auth-context.tsx├── components/│ ├── approvals/│ │ └── approvals-modal.tsx│ ├── automation-status-bar/│ │ ├── automation-status-bar.jsx│ │ ├── automation-status-bar.tsx│ │ └── index.js│ ├── campaign-workflow/│ │ ├── campaign-workflow-builder.jsx│ │ └── workflow-nodes.jsx│ ├── company-selection/│ │ └── index.tsx│ ├── country-select/│ │ ├── country-select.jsx│ │ └── index.js│ ├── custom-icon/│ │ └── custom-icon.tsx│ ├── desktop-leads-summary/│ │ ├── desktop-leads-summary-widget.jsx│ │ └── index.js│ ├── flag-icon/│ │ └── index.tsx│ ├── global-header/│ │ └── global-header.tsx│ ├── iconify/│ ├── import-popover/│ │ └── import-popover.tsx│ ├── lead-chat-popup/│ │ ├── lead-chat-popup.jsx│ │ └── lead-chat-popup-clean.jsx│ ├── lead-info-drawer-hub/│ │ ├── index.js│ │ └── lead-info-drawer-hub.jsx│ ├── left-nav-panel/│ │ └── manage-accounts-modal.tsx│ ├── mobile-block/│ │ └── mobile-block.tsx│ ├── mobile-leads-tiles/│ │ ├── leads-summary-widget.jsx│ │ ├── mobile-leads-tiles.jsx│ │ └── mobile-leads-tiles.tsx│ ├── modern-leads-table/│ │ ├── combined-filter-popover.jsx│ │ ├── modern-leads-table.jsx│ │ └── modern-leads-table-new.jsx│ ├── no-contact-popover/│ │ ├── no-contact-popover.jsx│ │ └── no-contact-popover.tsx│ ├── personalize-popover/│ │ ├── index.js│ │ └── personalize-popover.jsx│ ├── profile-avatar/│ │ ├── index.js│ │ └── profile-avatar.jsx│ ├── rewriting-status-bar/│ │ ├── index.js│ │ └── rewriting-status-bar.jsx│ ├── scraping-status-bar/│ │ └── scraping-status-bar.jsx│ ├── settings/│ │ ├── context/│ │ │ ├── index.js│ │ │ ├── settings-context.js│ │ │ ├── settings-context.tsx│ │ │ ├── settings-provider.jsx│ │ │ └── use-settings-context.js│ │ ├── drawer/│ │ │ ├── base-option.jsx│ │ │ ├── font-options.jsx│ │ │ ├── fullscreen-button.jsx│ │ │ ├── index.js│ │ │ ├── nav-layout-option.jsx│ │ │ ├── presets-options.jsx│ │ │ ├── settings-drawer.jsx│ │ │ ├── settings-drawer.tsx│ │ │ └── styles.jsx│ │ ├── accounts-modal.jsx│ │ ├── accounts-modal.tsx│ │ ├── accounts-nav-item.jsx│ │ ├── campaigns-tab-content.jsx│ │ ├── config-settings.js│ │ ├── find-leads-modal.jsx│ │ ├── find-leads-modal.tsx│ │ ├── hubspot-integration-content.jsx│ │ ├── index.js│ │ ├── index.tsx│ │ ├── integrations-content.jsx│ │ ├── integrations-modal.jsx│ │ ├── integrations-modal.tsx│ │ ├── palette-picker-content.jsx│ │ ├── server.js│ │ ├── settings-config.js│ │ ├── settings-content.jsx│ │ ├── settings-inline-view.jsx│ │ ├── settings-inline-view.tsx│ │ ├── settings-modal.jsx│ │ ├── settings-nav-item.jsx│ │ ├── smartlead-integration-content.jsx│ │ ├── smartlead-webhook-content.jsx│ │ ├── smartlead-webhook-management-content.jsx│ │ ├── subscription-content.jsx│ │ ├── subscription-pricing-content.jsx│ │ ├── theme-modal.jsx│ │ ├── theme-modal.tsx│ │ ├── webhook-management.jsx│ │ └── webhook-management-content.jsx│ ├── webhook-management-modal/│ │ └── webhook-management-modal.tsx│ ├── custom-icon.tsx│ ├── iconify.tsx│ ├── lead-info-drawer-hub.tsx│ ├── left-nav-panel.tsx│ ├── manage-accounts-content.tsx│ ├── personalize-popover.tsx│ └── theme-provider.tsx├── contexts/│ ├── drawer-context.tsx│ ├── settings-modal-context.tsx│ ├── status-bar-context.tsx│ ├── user-initiated-context.tsx│ └── workspace-context.tsx├── data/│ └── index.ts├── hooks/│ ├── use-accent.js│ ├── use-accent.ts│ ├── use-boolean.js│ ├── use-boolean.ts│ ├── use-cookies.js│ ├── useFirestoreData.ts│ ├── use-lazy-leads.ts│ └── use-leads-data.ts├── layouts/│ ├── components/│ │ └── trial-expiration-modal.tsx│ ├── core/│ │ ├── header-section.tsx│ │ ├── layout-section.tsx│ │ └── main-section.tsx│ ├── dashboard/│ │ └── css-vars.ts│ └── dashboard.tsx├── lib/│ ├── firebase.ts│ ├── firestore-stubs.ts│ └── stripe.ts├── minimal-shared/│ ├── hooks.ts│ └── utils.ts├── public/│ ├── icons/│ │ ├── accounts.svg│ │ ├── add.svg│ │ ├── add_linkedin_account.svg│ │ ├── all.svg│ │ ├── analytics.svg│ │ ├── archive.svg│ │ ├── back_arrow.svg│ │ ├── banner_image.svg│ │ ├── bell.svg│ │ ├── briefcase.svg│ │ ├── calendar.svg│ │ ├── campaign.svg│ │ ├── chat.svg│ │ ├── check.svg│ │ ├── check_circle.svg│ │ ├── checklist.svg│ │ ├── clock.svg│ │ ├── close.svg│ │ ├── close2.svg│ │ ├── commented.svg│ │ ├── commentedall.svg│ │ ├── company.svg│ │ ├── company_search.svg│ │ ├── condition.svg│ │ ├── cookies.svg│ │ ├── copy.svg│ │ ├── crop.svg│ │ ├── csv.svg│ │ ├── delete.svg│ │ ├── dots.svg│ │ ├── edit.svg│ │ ├── edit_limits.svg│ │ ├── education.svg│ │ ├── event_attendees.svg│ │ ├── export.svg│ │ ├── eye.svg│ │ ├── eye_closed.svg│ │ ├── facebook.svg│ │ ├── feed.svg│ │ ├── filter.svg│ │ ├── find_leads.svg│ │ ├── followers.svg│ │ ├── globe.svg│ │ ├── headline.svg│ │ ├── help.svg│ │ ├── import.svg│ │ ├── industry.svg│ │ ├── info.svg│ │ ├── integrations.svg│ │ ├── leftarrow.svg│ │ ├── like_post.svg│ │ ├── link.svg│ │ ├── linkedin.svg│ │ ├── lists.svg│ │ ├── location.svg│ │ ├── logout.svg│ │ ├── maximise.svg│ │ ├── menu.svg│ │ ├── minimize.svg│ │ ├── new_list.svg│ │ ├── next_step.svg│ │ ├── no_leads_found.svg│ │ ├── not_connected.svg│ │ ├── notcommnted.svg│ │ ├── notrelevant.svg│ │ ├── overview.svg│ │ ├── palette.svg│ │ ├── pause.svg│ │ ├── people.svg│ │ ├── people_search.svg│ │ ├── play│ │ ├── play.svg│ │ ├── post_commenters.svg│ │ ├── post_reactors.svg│ │ ├── posts.svg│ │ ├── profile_urls.svg│ │ ├── proposed.svg│ │ ├── proxy.svg│ │ ├── reelevant.svg│ │ ├── regenerate_message.svg│ │ ├── rent_account.svg│ │ ├── replied.svg│ │ ├── rightarrow.svg│ │ ├── save.svg│ │ ├── search.svg│ │ ├── send.svg│ │ ├── settings.svg│ │ ├── sidebar.svg│ │ ├── star.svg│ │ ├── stop.svg│ │ ├── subscription.svg│ │ ├── sync.svg│ │ ├── tagline.svg│ │ ├── trending_up.svg│ │ ├── twitter.svg│ │ ├── unsend.svg│ │ ├── upload.svg│ │ ├── warning.svg│ │ ├── workflow.svg│ │ ├── workspaces.svg│ │ ├── zoomin.svg│ │ └── zoomout.svg│ ├── logo/│ │ └── logo.svg│ └── no_pic.png├── routes/│ └── paths.ts├── services/│ ├── leads-data-service.ts│ ├── linkedin-accounts-cache-service.ts│ └── manage-accounts-service.ts├── theme/│ ├── components/│ │ ├── index.js│ │ └── table-overrides.js│ ├── core/│ │ ├── components/│ │ │ ├── accordion.jsx│ │ │ ├── alert.jsx│ │ │ ├── appbar.jsx│ │ │ ├── autocomplete.jsx│ │ │ ├── avatar.jsx│ │ │ ├── backdrop.jsx│ │ │ ├── badge.jsx│ │ │ ├── breadcrumbs.jsx│ │ │ ├── button.jsx│ │ │ ├── button-fab.jsx│ │ │ ├── button-group.jsx│ │ │ ├── button-toggle.jsx│ │ │ ├── card.jsx│ │ │ ├── checkbox.jsx│ │ │ ├── chip.jsx│ │ │ ├── container.js│ │ │ ├── dialog.jsx│ │ │ ├── drawer.jsx│ │ │ ├── form.jsx│ │ │ ├── index.js│ │ │ ├── link.jsx│ │ │ ├── list.jsx│ │ │ ├── menu.jsx│ │ │ ├── mui-x-data-grid.jsx│ │ │ ├── mui-x-date-picker.jsx│ │ │ ├── mui-x-tree-view.jsx│ │ │ ├── pagination.jsx│ │ │ ├── paper.jsx│ │ │ ├── popover.jsx│ │ │ ├── progress.jsx│ │ │ ├── radio.jsx│ │ │ ├── rating.jsx│ │ │ ├── select.jsx│ │ │ ├── skeleton.jsx│ │ │ ├── slider.jsx│ │ │ ├── stack.jsx│ │ │ ├── stepper.jsx│ │ │ ├── svg-icon.jsx│ │ │ ├── switch.jsx│ │ │ ├── table.jsx│ │ │ ├── tabs.jsx│ │ │ ├── textfield.jsx│ │ │ ├── timeline.jsx│ │ │ ├── tooltip.jsx│ │ │ └── typography.jsx│ │ ├── mixins/│ │ │ ├── background.js│ │ │ ├── border.js│ │ │ ├── global-styles-components.js│ │ │ ├── index.js│ │ │ ├── mixins.js│ │ │ └── text.js│ │ ├── custom-shadows.js│ │ ├── index.js│ │ ├── palette.js│ │ ├── shadows.js│ │ └── typography.js│ ├── with-settings/│ │ ├── color-presets.js│ │ ├── index.js│ │ ├── right-to-left.jsx│ │ ├── update-components.js│ │ └── update-core.js│ ├── accent-palette.js│ ├── accent-palette.ts│ ├── create-classes.js│ ├── create-theme.js│ ├── index.js│ ├── styles.js│ ├── theme-config.js│ ├── theme-overrides.js│ └── theme-provider.jsx├── utils/│ └── account-count-service.ts├── .gitignore├── COMPLETE_FILE_LIST.txt├── config-global.ts├── COPIED_COMPONENTS.md├── COPY_PLAN.md├── CURRENT_STATUS.md├── DEPENDENCIES.md├── DIRECTORIES.txt├── DIRECTORY_LISTING.txt├── DIRECTORY_STRUCTURE.md├── DIRECTORY_SUMMARY.md├── DIRECTORY_TREE.txt├── eslint.config.mjs├── EXACT_DEPENDENCIES.md├── FILES_LIST.json├── FOLDER_STRUCTURE.txt├── next.config.ts├── next-env.d.ts├── package.json├── package-lock.json├── PLAN.md├── postcss.config.mjs├── README.md├── STATUS.md├── SUMMARY.md└── tsconfig.json
Single executable
Run the full workflow from one command
Send connection requests
Send requests with daily limits and timing
Send messages
Send personalized messages automatically
Follow
Follow leads as part of the sequence
View profile
Open profiles before taking action
Like posts
Like recent posts to warm up outreach
Scrape connections
Pull connection data into the system
Scrape messages
Sync message history from LinkedIn
Run multi-step sequences
Run steps in the right order automatically
Human-like random waits
Add randomized delays between actions
Schedule management
Control send windows and working hours
Withdraw connection requests
Clean up old pending requests automatically
Features
All the features you need
All the features
you need
Your codebase. Your rules.
Every feature you need to run LinkedIn outreach for clients, built into a system you fully control on your own infrastructure. Customize workflows, plug in your own tools, and run it exactly how your agency operates. No SaaS vendor deciding what you can and can't do.
Account Safety
Protect your
LinkedIn account
Safe Automation
Most automation tools get accounts flagged because they cut corners on safety. Ornn doesn't. Every LinkedIn account runs inside its own isolated browser profile with a unique fingerprint, paired with a dedicated residential proxy through IPRoyal. Proxy rotation and assignment is fully automated with no manual setup. Add in human-like randomised delays between every action, and LinkedIn sees normal user behaviour, not a bot.
Build targeted prospect lists directly from LinkedIn. Filter by role, company, location, and activity signals to focus outreach on the people most likely to respond. Build targeted prospect lists directly from LinkedIn. Filter by role, company, location, and activity signals to focus outreach on the people most likely to respond.
Sending Connection Request..
United Kingdom
IT services
Founders

Jack Daniel
Founder - Xavier LLC
Not Sent

Gorge Chapel
Founder - Chapel LLC
Not Sent

Mike Tylor
Founder - CMB LLC
Not Sent

Thomas Shelby
Founder - Shelby.co
Not Sent

Jack Daniel
Founder - Xavier LLC
Not Sent

Gorge Chapel
Founder - Chapel LLC
Not Sent

Mike Tylor
Founder - CMB LLC
Not Sent

Thomas Shelby
Founder - Shelby.co
Not Sent

Jack Daniel
Founder - Xavier LLC
Not Sent

Gorge Chapel
Founder - Chapel LLC
Not Sent

Mike Tylor
Founder - CMB LLC
Not Sent

Thomas Shelby
Founder - Shelby.co
Not Sent

Jack Daniel
Founder - Xavier LLC
Not Sent

Gorge Chapel
Founder - Chapel LLC
Not Sent

Mike Tylor
Founder - CMB LLC
Not Sent

Thomas Shelby
Founder - Shelby.co
Not Sent
Draft
Schedule
Sent
Pricing
Pay once. Never pay for LinkedIn automation again.
Full LinkedIn outbound system, delivered as a complete codebase
you can deploy on your own infrastructure.
What you will get
Next.js dashboard for managing your entire outbound system - accounts, campaigns, workflows, leads, and conversations across all clients.
Python automation engine that powers the full LinkedIn outreach lifecycle - running campaigns, handling data, and executing automation across unlimited accounts.
Customer Impact
Built for GTM agencies
“Honestly, I was skeptical. We'd tried scheduling tools before and nothing stuck. But Ornn changed the way we actually think about LinkedIn - it's not a chore anymore. Content goes out, replies come in, and our pipeline reflects it
Sofia Klein
Platform Engineer
Connection Rate
Connection Rate
Reply Rate
Reply Rate
Meetings booked per month
Meetings booked per month
Meetings booked per month
Get set up
Setup in 15 minutes
Follow the setup guide to deploy Ornn on your computer. You’ll have your outbound system up and running quickly, with full control from day one.
- def _get_sequence_campaigns(account_id, workspace_id):"""Return active campaigns that include this account as a sender AND have a sequence.Returns:list[dict]: Each dict has at minimum 'id', 'sequence', 'lists', and other campaign fields.Returns an empty list if no matching sequence campaigns are found."""try:all_campaigns = storage.get_campaigns(workspace_id) or []results = []for data in all_campaigns:if data.get('status') not in ('active', 'running'):continuesenders = data.get('senders', [])seq = data.get('sequence', [])if isinstance(senders, list) and account_id in senders and isinstance(seq, list) and len(seq) > 0:results.append(data)return resultsexcept Exception as e:logging.error(f"Error fetching sequence campaigns: {e}")return []def _campaign_applies_to_lead(campaign, lead):"""Check whether a campaign's list filter matches a given lead."""lists = campaign.get('lists', [])if not isinstance(lists, list) or not lists:return Falseif '*' in lists:return Truelead_list_id = lead.get('__listId')lead_list_name = lead.get('__listName')for identifier in (lead_list_id, lead_list_name):if identifier and str(identifier) in [str(l) for l in lists]:return Truereturn Falsedef run_sequence_actions(user_id, account_id, driver, all_leads,sequence_campaigns, workspace_id=None):"""Process all leads through their campaign sequences.For each lead that belongs to a campaign with a sequence:1. Initialize the lead into the sequence if not already started2. Evaluate the current step via the sequence engine3. Execute the action (sendConnection, sendMessage, likePost, sendFollow)4. Advance the lead to the next step and persistRespects daily connection limits. Raises AccountBlockedException if theLinkedIn account is blocked."""import random as _randomfrom datetime import date# Build a lookup: campaign_id -> campaign dictcampaign_map = {camp['id']: camp for camp in sequence_campaigns}# Get daily connection stats for limit enforcementaccount_details = get_account(user_id, account_id, workspace_id=workspace_id) or {}today_str = date.today().isoformat()daily_stats = account_details.get('daily_stats', {})if today_str not in daily_stats:daily_stats[today_str] = {'connections': 0, 'messages': 0}today_limit_key = f"{today_str}_limit"if today_limit_key not in daily_stats:chosen_limit = _random.randint(17, 21)daily_stats[today_limit_key] = chosen_limitupdate_account_field(user_id, account_id, {'daily_stats': daily_stats},workspace_id=workspace_id)else:chosen_limit = daily_stats[today_limit_key]
- def _get_sequence_campaigns(account_id, workspace_id):"""Return active campaigns that include this account as a sender AND have a sequence.Returns:list[dict]: Each dict has at minimum 'id', 'sequence', 'lists', and other campaign fields.Returns an empty list if no matching sequence campaigns are found."""try:all_campaigns = storage.get_campaigns(workspace_id) or []results = []for data in all_campaigns:if data.get('status') not in ('active', 'running'):continuesenders = data.get('senders', [])seq = data.get('sequence', [])if isinstance(senders, list) and account_id in senders and isinstance(seq, list) and len(seq) > 0:results.append(data)return resultsexcept Exception as e:logging.error(f"Error fetching sequence campaigns: {e}")return []def _campaign_applies_to_lead(campaign, lead):"""Check whether a campaign's list filter matches a given lead."""lists = campaign.get('lists', [])if not isinstance(lists, list) or not lists:return Falseif '*' in lists:return Truelead_list_id = lead.get('__listId')lead_list_name = lead.get('__listName')for identifier in (lead_list_id, lead_list_name):if identifier and str(identifier) in [str(l) for l in lists]:return Truereturn Falsedef run_sequence_actions(user_id, account_id, driver, all_leads,sequence_campaigns, workspace_id=None):"""Process all leads through their campaign sequences.For each lead that belongs to a campaign with a sequence:1. Initialize the lead into the sequence if not already started2. Evaluate the current step via the sequence engine3. Execute the action (sendConnection, sendMessage, likePost, sendFollow)4. Advance the lead to the next step and persistRespects daily connection limits. Raises AccountBlockedException if theLinkedIn account is blocked."""import random as _randomfrom datetime import date# Build a lookup: campaign_id -> campaign dictcampaign_map = {camp['id']: camp for camp in sequence_campaigns}# Get daily connection stats for limit enforcementaccount_details = get_account(user_id, account_id, workspace_id=workspace_id) or {}today_str = date.today().isoformat()daily_stats = account_details.get('daily_stats', {})if today_str not in daily_stats:daily_stats[today_str] = {'connections': 0, 'messages': 0}today_limit_key = f"{today_str}_limit"if today_limit_key not in daily_stats:chosen_limit = _random.randint(17, 21)daily_stats[today_limit_key] = chosen_limitupdate_account_field(user_id, account_id, {'daily_stats': daily_stats},workspace_id=workspace_id)else:chosen_limit = daily_stats[today_limit_key]
FAQs
Got questions?
We’ve got answers.
Still have questions?
Contact us and we’ll help you out.
01
What exactly do I get when I purchase Ornn?
You get the full codebase, including the frontend dashboard, backend automation engine, database infrastructure, and campaign system. You deploy it on your own server under a perpetual self-hosted licence.
02
Do I need a developer to set it up?
No. If you can follow a setup guide, you can get Ornn running. Most users are up and running within an hour.
03
How many LinkedIn accounts can I run?
Unlimited. There are no per-seat or per-account limits. You pay once and run as many accounts as your infrastructure supports.
04
Will my clients' accounts get flagged or restricted?
Ornn is built with account safety at its core. Every account gets its own dedicated residential proxy via IPRoyal and an isolated browser profile. Combined with human-like delays, LinkedIn sees normal user behaviour.
05
Can I customise or build on top of the codebase?
Yes, that's the point. You get full codebase access so you can modify workflows, add features, integrate your own tools, or adapt it for your own client delivery.
06
How does the pricing compare to other tools?
Most LinkedIn automation tools charge around $79 per seat per month. If you're running 4 or more accounts, Ornn's one-time payment of $3,318 pays for itself within the first year. After that it costs you nothing.
07
Is there a free trial?
No free trial, but you can book a demo to see the full system before purchasing.
01
What's the Partner Program?
You get the full codebase, including the frontend dashboard, backend automation engine, database infrastructure, and campaign system. You deploy it on your own server under a perpetual self-hosted licence.
02
Do I need a developer to set it up?
No. If you can follow a setup guide, you can get Ornn running. Most users are up and running within an hour.
03
How many LinkedIn accounts can I run?
Unlimited. There are no per-seat or per-account limits. You pay once and run as many accounts as your infrastructure supports.
04
Will my clients' accounts get flagged or restricted?
Ornn is built with account safety at its core. Every account gets its own dedicated residential proxy via IPRoyal and an isolated browser profile. Combined with human-like delays, LinkedIn sees normal user behaviour.
05
Can I customise or build on top of the codebase?
Yes, that's the point. You get full codebase access so you can modify workflows, add features, integrate your own tools, or adapt it for your own client delivery.
Features
The system architecture
Ornn gives you the core LinkedIn automation layer - you get the full codebase to build anything on top of it.
Frontend / Webapp
Dashboard for managing accounts, campaigns, and workflows across all clients.
Backend / Automation Engine
- webapp/├── api/│ └── craft-messages-api.ts├── app/│ ├── api/│ │ └── data/│ │ ├── users/│ │ │ └── [userId]/│ │ └── workspaces/│ │ └── [workspaceId]/│ ├── campaigns/│ │ ├── campaigns-content.jsx│ │ ├── campaigns-page-content.jsx│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ └── page.tsx│ ├── prospects/│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ ├── page.tsx│ │ ├── page_ui_backup.jsx│ │ └── prospects-checkbox-fix.css│ ├── favicon.ico│ ├── globals.css│ ├── layout.tsx│ └── page.tsx├── assets/│ └── data/│ ├── countries.js│ └── index.ts├── auth/│ ├── guard/│ │ ├── auth-guard.tsx│ │ ├── country-guard.tsx│ │ └── index.ts│ └── hooks/│ ├── index.ts│ └── use-auth-context.tsx├── components/│ ├── approvals/│ │ └── approvals-modal.tsx│ ├── automation-status-bar/│ │ ├── automation-status-bar.jsx│ │ ├── automation-status-bar.tsx│ │ └── index.js│ ├── campaign-workflow/│ │ ├── campaign-workflow-builder.jsx│ │ └── workflow-nodes.jsx│ ├── company-selection/│ │ └── index.tsx│ ├── country-select/│ │ ├── country-select.jsx│ │ └── index.js│ ├── custom-icon/│ │ └── custom-icon.tsx│ ├── desktop-leads-summary/│ │ ├── desktop-leads-summary-widget.jsx│ │ └── index.js│ ├── flag-icon/│ │ └── index.tsx│ ├── global-header/│ │ └── global-header.tsx│ ├── iconify/│ ├── import-popover/│ │ └── import-popover.tsx│ ├── lead-chat-popup/│ │ ├── lead-chat-popup.jsx│ │ └── lead-chat-popup-clean.jsx│ ├── lead-info-drawer-hub/│ │ ├── index.js│ │ └── lead-info-drawer-hub.jsx│ ├── left-nav-panel/│ │ └── manage-accounts-modal.tsx│ ├── mobile-block/│ │ └── mobile-block.tsx│ ├── mobile-leads-tiles/│ │ ├── leads-summary-widget.jsx│ │ ├── mobile-leads-tiles.jsx│ │ └── mobile-leads-tiles.tsx│ ├── modern-leads-table/│ │ ├── combined-filter-popover.jsx│ │ ├── modern-leads-table.jsx│ │ └── modern-leads-table-new.jsx│ ├── no-contact-popover/│ │ ├── no-contact-popover.jsx│ │ └── no-contact-popover.tsx│ ├── personalize-popover/│ │ ├── index.js│ │ └── personalize-popover.jsx│ ├── profile-avatar/│ │ ├── index.js│ │ └── profile-avatar.jsx│ ├── rewriting-status-bar/│ │ ├── index.js│ │ └── rewriting-status-bar.jsx│ ├── scraping-status-bar/│ │ └── scraping-status-bar.jsx│ ├── settings/│ │ ├── context/│ │ │ ├── index.js│ │ │ ├── settings-context.js│ │ │ ├── settings-context.tsx│ │ │ ├── settings-provider.jsx│ │ │ └── use-settings-context.js│ │ ├── drawer/│ │ │ ├── base-option.jsx│ │ │ ├── font-options.jsx│ │ │ ├── fullscreen-button.jsx│ │ │ ├── index.js│ │ │ ├── nav-layout-option.jsx│ │ │ ├── presets-options.jsx│ │ │ ├── settings-drawer.jsx│ │ │ ├── settings-drawer.tsx│ │ │ └── styles.jsx│ │ ├── accounts-modal.jsx│ │ ├── accounts-modal.tsx│ │ ├── accounts-nav-item.jsx│ │ ├── campaigns-tab-content.jsx│ │ ├── config-settings.js│ │ ├── find-leads-modal.jsx│ │ ├── find-leads-modal.tsx│ │ ├── hubspot-integration-content.jsx│ │ ├── index.js│ │ ├── index.tsx│ │ ├── integrations-content.jsx│ │ ├── integrations-modal.jsx│ │ ├── integrations-modal.tsx│ │ ├── palette-picker-content.jsx│ │ ├── server.js│ │ ├── settings-config.js│ │ ├── settings-content.jsx│ │ ├── settings-inline-view.jsx│ │ ├── settings-inline-view.tsx│ │ ├── settings-modal.jsx│ │ ├── settings-nav-item.jsx│ │ ├── smartlead-integration-content.jsx│ │ ├── smartlead-webhook-content.jsx│ │ ├── smartlead-webhook-management-content.jsx│ │ ├── subscription-content.jsx│ │ ├── subscription-pricing-content.jsx│ │ ├── theme-modal.jsx│ │ ├── theme-modal.tsx│ │ ├── webhook-management.jsx│ │ └── webhook-management-content.jsx│ ├── webhook-management-modal/│ │ └── webhook-management-modal.tsx│ ├── custom-icon.tsx│ ├── iconify.tsx│ ├── lead-info-drawer-hub.tsx│ ├── left-nav-panel.tsx│ ├── manage-accounts-content.tsx│ ├── personalize-popover.tsx│ └── theme-provider.tsx├── contexts/│ ├── drawer-context.tsx│ ├── settings-modal-context.tsx│ ├── status-bar-context.tsx│ ├── user-initiated-context.tsx│ └── workspace-context.tsx├── data/│ └── index.ts├── hooks/│ ├── use-accent.js│ ├── use-accent.ts│ ├── use-boolean.js│ ├── use-boolean.ts│ ├── use-cookies.js│ ├── useFirestoreData.ts│ ├── use-lazy-leads.ts│ └── use-leads-data.ts├── layouts/│ ├── components/│ │ └── trial-expiration-modal.tsx│ ├── core/│ │ ├── header-section.tsx│ │ ├── layout-section.tsx│ │ └── main-section.tsx│ ├── dashboard/│ │ └── css-vars.ts│ └── dashboard.tsx├── lib/│ ├── firebase.ts│ ├── firestore-stubs.ts│ └── stripe.ts├── minimal-shared/│ ├── hooks.ts│ └── utils.ts├── public/│ ├── icons/│ │ ├── accounts.svg│ │ ├── add.svg│ │ ├── add_linkedin_account.svg│ │ ├── all.svg│ │ ├── analytics.svg│ │ ├── archive.svg│ │ ├── back_arrow.svg│ │ ├── banner_image.svg│ │ ├── bell.svg│ │ ├── briefcase.svg│ │ ├── calendar.svg│ │ ├── campaign.svg│ │ ├── chat.svg│ │ ├── check.svg│ │ ├── check_circle.svg│ │ ├── checklist.svg│ │ ├── clock.svg│ │ ├── close.svg│ │ ├── close2.svg│ │ ├── commented.svg│ │ ├── commentedall.svg│ │ ├── company.svg│ │ ├── company_search.svg│ │ ├── condition.svg│ │ ├── cookies.svg│ │ ├── copy.svg│ │ ├── crop.svg│ │ ├── csv.svg│ │ ├── delete.svg│ │ ├── dots.svg│ │ ├── edit.svg│ │ ├── edit_limits.svg│ │ ├── education.svg│ │ ├── event_attendees.svg│ │ ├── export.svg│ │ ├── eye.svg│ │ ├── eye_closed.svg│ │ ├── facebook.svg│ │ ├── feed.svg│ │ ├── filter.svg│ │ ├── find_leads.svg│ │ ├── followers.svg│ │ ├── globe.svg│ │ ├── headline.svg│ │ ├── help.svg│ │ ├── import.svg│ │ ├── industry.svg│ │ ├── info.svg│ │ ├── integrations.svg│ │ ├── leftarrow.svg│ │ ├── like_post.svg│ │ ├── link.svg│ │ ├── linkedin.svg│ │ ├── lists.svg│ │ ├── location.svg│ │ ├── logout.svg│ │ ├── maximise.svg│ │ ├── menu.svg│ │ ├── minimize.svg│ │ ├── new_list.svg│ │ ├── next_step.svg│ │ ├── no_leads_found.svg│ │ ├── not_connected.svg│ │ ├── notcommnted.svg│ │ ├── notrelevant.svg│ │ ├── overview.svg│ │ ├── palette.svg│ │ ├── pause.svg│ │ ├── people.svg│ │ ├── people_search.svg│ │ ├── play│ │ ├── play.svg│ │ ├── post_commenters.svg│ │ ├── post_reactors.svg│ │ ├── posts.svg│ │ ├── profile_urls.svg│ │ ├── proposed.svg│ │ ├── proxy.svg│ │ ├── reelevant.svg│ │ ├── regenerate_message.svg│ │ ├── rent_account.svg│ │ ├── replied.svg│ │ ├── rightarrow.svg│ │ ├── save.svg│ │ ├── search.svg│ │ ├── send.svg│ │ ├── settings.svg│ │ ├── sidebar.svg│ │ ├── star.svg│ │ ├── stop.svg│ │ ├── subscription.svg│ │ ├── sync.svg│ │ ├── tagline.svg│ │ ├── trending_up.svg│ │ ├── twitter.svg│ │ ├── unsend.svg│ │ ├── upload.svg│ │ ├── warning.svg│ │ ├── workflow.svg│ │ ├── workspaces.svg│ │ ├── zoomin.svg│ │ └── zoomout.svg│ ├── logo/│ │ └── logo.svg│ └── no_pic.png├── routes/│ └── paths.ts├── services/│ ├── leads-data-service.ts│ ├── linkedin-accounts-cache-service.ts│ └── manage-accounts-service.ts├── theme/│ ├── components/│ │ ├── index.js│ │ └── table-overrides.js│ ├── core/│ │ ├── components/│ │ │ ├── accordion.jsx│ │ │ ├── alert.jsx│ │ │ ├── appbar.jsx│ │ │ ├── autocomplete.jsx│ │ │ ├── avatar.jsx│ │ │ ├── backdrop.jsx│ │ │ ├── badge.jsx│ │ │ ├── breadcrumbs.jsx│ │ │ ├── button.jsx│ │ │ ├── button-fab.jsx│ │ │ ├── button-group.jsx│ │ │ ├── button-toggle.jsx│ │ │ ├── card.jsx│ │ │ ├── checkbox.jsx│ │ │ ├── chip.jsx│ │ │ ├── container.js│ │ │ ├── dialog.jsx│ │ │ ├── drawer.jsx│ │ │ ├── form.jsx│ │ │ ├── index.js│ │ │ ├── link.jsx│ │ │ ├── list.jsx│ │ │ ├── menu.jsx│ │ │ ├── mui-x-data-grid.jsx│ │ │ ├── mui-x-date-picker.jsx│ │ │ ├── mui-x-tree-view.jsx│ │ │ ├── pagination.jsx│ │ │ ├── paper.jsx│ │ │ ├── popover.jsx│ │ │ ├── progress.jsx│ │ │ ├── radio.jsx│ │ │ ├── rating.jsx│ │ │ ├── select.jsx│ │ │ ├── skeleton.jsx│ │ │ ├── slider.jsx│ │ │ ├── stack.jsx│ │ │ ├── stepper.jsx│ │ │ ├── svg-icon.jsx│ │ │ ├── switch.jsx│ │ │ ├── table.jsx│ │ │ ├── tabs.jsx│ │ │ ├── textfield.jsx│ │ │ ├── timeline.jsx│ │ │ ├── tooltip.jsx│ │ │ └── typography.jsx│ │ ├── mixins/│ │ │ ├── background.js│ │ │ ├── border.js│ │ │ ├── global-styles-components.js│ │ │ ├── index.js│ │ │ ├── mixins.js│ │ │ └── text.js│ │ ├── custom-shadows.js│ │ ├── index.js│ │ ├── palette.js│ │ ├── shadows.js│ │ └── typography.js│ ├── with-settings/│ │ ├── color-presets.js│ │ ├── index.js│ │ ├── right-to-left.jsx│ │ ├── update-components.js│ │ └── update-core.js│ ├── accent-palette.js│ ├── accent-palette.ts│ ├── create-classes.js│ ├── create-theme.js│ ├── index.js│ ├── styles.js│ ├── theme-config.js│ ├── theme-overrides.js│ └── theme-provider.jsx├── utils/│ └── account-count-service.ts├── .gitignore├── COMPLETE_FILE_LIST.txt├── config-global.ts├── COPIED_COMPONENTS.md├── COPY_PLAN.md├── CURRENT_STATUS.md├── DEPENDENCIES.md├── DIRECTORIES.txt├── DIRECTORY_LISTING.txt├── DIRECTORY_STRUCTURE.md├── DIRECTORY_SUMMARY.md├── DIRECTORY_TREE.txt├── eslint.config.mjs├── EXACT_DEPENDENCIES.md├── FILES_LIST.json├── FOLDER_STRUCTURE.txt├── next.config.ts├── next-env.d.ts├── package.json├── package-lock.json├── PLAN.md├── postcss.config.mjs├── README.md├── STATUS.md├── SUMMARY.md└── tsconfig.json
- webapp/├── api/│ └── craft-messages-api.ts├── app/│ ├── api/│ │ └── data/│ │ ├── users/│ │ │ └── [userId]/│ │ └── workspaces/│ │ └── [workspaceId]/│ ├── campaigns/│ │ ├── campaigns-content.jsx│ │ ├── campaigns-page-content.jsx│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ └── page.tsx│ ├── prospects/│ │ ├── layout.jsx│ │ ├── loading.jsx│ │ ├── page.tsx│ │ ├── page_ui_backup.jsx│ │ └── prospects-checkbox-fix.css│ ├── favicon.ico│ ├── globals.css│ ├── layout.tsx│ └── page.tsx├── assets/│ └── data/│ ├── countries.js│ └── index.ts├── auth/│ ├── guard/│ │ ├── auth-guard.tsx│ │ ├── country-guard.tsx│ │ └── index.ts│ └── hooks/│ ├── index.ts│ └── use-auth-context.tsx├── components/│ ├── approvals/│ │ └── approvals-modal.tsx│ ├── automation-status-bar/│ │ ├── automation-status-bar.jsx│ │ ├── automation-status-bar.tsx│ │ └── index.js│ ├── campaign-workflow/│ │ ├── campaign-workflow-builder.jsx│ │ └── workflow-nodes.jsx│ ├── company-selection/│ │ └── index.tsx│ ├── country-select/│ │ ├── country-select.jsx│ │ └── index.js│ ├── custom-icon/│ │ └── custom-icon.tsx│ ├── desktop-leads-summary/│ │ ├── desktop-leads-summary-widget.jsx│ │ └── index.js│ ├── flag-icon/│ │ └── index.tsx│ ├── global-header/│ │ └── global-header.tsx│ ├── iconify/│ ├── import-popover/│ │ └── import-popover.tsx│ ├── lead-chat-popup/│ │ ├── lead-chat-popup.jsx│ │ └── lead-chat-popup-clean.jsx│ ├── lead-info-drawer-hub/│ │ ├── index.js│ │ └── lead-info-drawer-hub.jsx│ ├── left-nav-panel/│ │ └── manage-accounts-modal.tsx│ ├── mobile-block/│ │ └── mobile-block.tsx│ ├── mobile-leads-tiles/│ │ ├── leads-summary-widget.jsx│ │ ├── mobile-leads-tiles.jsx│ │ └── mobile-leads-tiles.tsx│ ├── modern-leads-table/│ │ ├── combined-filter-popover.jsx│ │ ├── modern-leads-table.jsx│ │ └── modern-leads-table-new.jsx│ ├── no-contact-popover/│ │ ├── no-contact-popover.jsx│ │ └── no-contact-popover.tsx│ ├── personalize-popover/│ │ ├── index.js│ │ └── personalize-popover.jsx│ ├── profile-avatar/│ │ ├── index.js│ │ └── profile-avatar.jsx│ ├── rewriting-status-bar/│ │ ├── index.js│ │ └── rewriting-status-bar.jsx│ ├── scraping-status-bar/│ │ └── scraping-status-bar.jsx│ ├── settings/│ │ ├── context/│ │ │ ├── index.js│ │ │ ├── settings-context.js│ │ │ ├── settings-context.tsx│ │ │ ├── settings-provider.jsx│ │ │ └── use-settings-context.js│ │ ├── drawer/│ │ │ ├── base-option.jsx│ │ │ ├── font-options.jsx│ │ │ ├── fullscreen-button.jsx│ │ │ ├── index.js│ │ │ ├── nav-layout-option.jsx│ │ │ ├── presets-options.jsx│ │ │ ├── settings-drawer.jsx│ │ │ ├── settings-drawer.tsx│ │ │ └── styles.jsx│ │ ├── accounts-modal.jsx│ │ ├── accounts-modal.tsx│ │ ├── accounts-nav-item.jsx│ │ ├── campaigns-tab-content.jsx│ │ ├── config-settings.js│ │ ├── find-leads-modal.jsx│ │ ├── find-leads-modal.tsx│ │ ├── hubspot-integration-content.jsx│ │ ├── index.js│ │ ├── index.tsx│ │ ├── integrations-content.jsx│ │ ├── integrations-modal.jsx│ │ ├── integrations-modal.tsx│ │ ├── palette-picker-content.jsx│ │ ├── server.js│ │ ├── settings-config.js│ │ ├── settings-content.jsx│ │ ├── settings-inline-view.jsx│ │ ├── settings-inline-view.tsx│ │ ├── settings-modal.jsx│ │ ├── settings-nav-item.jsx│ │ ├── smartlead-integration-content.jsx│ │ ├── smartlead-webhook-content.jsx│ │ ├── smartlead-webhook-management-content.jsx│ │ ├── subscription-content.jsx│ │ ├── subscription-pricing-content.jsx│ │ ├── theme-modal.jsx│ │ ├── theme-modal.tsx│ │ ├── webhook-management.jsx│ │ └── webhook-management-content.jsx│ ├── webhook-management-modal/│ │ └── webhook-management-modal.tsx│ ├── custom-icon.tsx│ ├── iconify.tsx│ ├── lead-info-drawer-hub.tsx│ ├── left-nav-panel.tsx│ ├── manage-accounts-content.tsx│ ├── personalize-popover.tsx│ └── theme-provider.tsx├── contexts/│ ├── drawer-context.tsx│ ├── settings-modal-context.tsx│ ├── status-bar-context.tsx│ ├── user-initiated-context.tsx│ └── workspace-context.tsx├── data/│ └── index.ts├── hooks/│ ├── use-accent.js│ ├── use-accent.ts│ ├── use-boolean.js│ ├── use-boolean.ts│ ├── use-cookies.js│ ├── useFirestoreData.ts│ ├── use-lazy-leads.ts│ └── use-leads-data.ts├── layouts/│ ├── components/│ │ └── trial-expiration-modal.tsx│ ├── core/│ │ ├── header-section.tsx│ │ ├── layout-section.tsx│ │ └── main-section.tsx│ ├── dashboard/│ │ └── css-vars.ts│ └── dashboard.tsx├── lib/│ ├── firebase.ts│ ├── firestore-stubs.ts│ └── stripe.ts├── minimal-shared/│ ├── hooks.ts│ └── utils.ts├── public/│ ├── icons/│ │ ├── accounts.svg│ │ ├── add.svg│ │ ├── add_linkedin_account.svg│ │ ├── all.svg│ │ ├── analytics.svg│ │ ├── archive.svg│ │ ├── back_arrow.svg│ │ ├── banner_image.svg│ │ ├── bell.svg│ │ ├── briefcase.svg│ │ ├── calendar.svg│ │ ├── campaign.svg│ │ ├── chat.svg│ │ ├── check.svg│ │ ├── check_circle.svg│ │ ├── checklist.svg│ │ ├── clock.svg│ │ ├── close.svg│ │ ├── close2.svg│ │ ├── commented.svg│ │ ├── commentedall.svg│ │ ├── company.svg│ │ ├── company_search.svg│ │ ├── condition.svg│ │ ├── cookies.svg│ │ ├── copy.svg│ │ ├── crop.svg│ │ ├── csv.svg│ │ ├── delete.svg│ │ ├── dots.svg│ │ ├── edit.svg│ │ ├── edit_limits.svg│ │ ├── education.svg│ │ ├── event_attendees.svg│ │ ├── export.svg│ │ ├── eye.svg│ │ ├── eye_closed.svg│ │ ├── facebook.svg│ │ ├── feed.svg│ │ ├── filter.svg│ │ ├── find_leads.svg│ │ ├── followers.svg│ │ ├── globe.svg│ │ ├── headline.svg│ │ ├── help.svg│ │ ├── import.svg│ │ ├── industry.svg│ │ ├── info.svg│ │ ├── integrations.svg│ │ ├── leftarrow.svg│ │ ├── like_post.svg│ │ ├── link.svg│ │ ├── linkedin.svg│ │ ├── lists.svg│ │ ├── location.svg│ │ ├── logout.svg│ │ ├── maximise.svg│ │ ├── menu.svg│ │ ├── minimize.svg│ │ ├── new_list.svg│ │ ├── next_step.svg│ │ ├── no_leads_found.svg│ │ ├── not_connected.svg│ │ ├── notcommnted.svg│ │ ├── notrelevant.svg│ │ ├── overview.svg│ │ ├── palette.svg│ │ ├── pause.svg│ │ ├── people.svg│ │ ├── people_search.svg│ │ ├── play│ │ ├── play.svg│ │ ├── post_commenters.svg│ │ ├── post_reactors.svg│ │ ├── posts.svg│ │ ├── profile_urls.svg│ │ ├── proposed.svg│ │ ├── proxy.svg│ │ ├── reelevant.svg│ │ ├── regenerate_message.svg│ │ ├── rent_account.svg│ │ ├── replied.svg│ │ ├── rightarrow.svg│ │ ├── save.svg│ │ ├── search.svg│ │ ├── send.svg│ │ ├── settings.svg│ │ ├── sidebar.svg│ │ ├── star.svg│ │ ├── stop.svg│ │ ├── subscription.svg│ │ ├── sync.svg│ │ ├── tagline.svg│ │ ├── trending_up.svg│ │ ├── twitter.svg│ │ ├── unsend.svg│ │ ├── upload.svg│ │ ├── warning.svg│ │ ├── workflow.svg│ │ ├── workspaces.svg│ │ ├── zoomin.svg│ │ └── zoomout.svg│ ├── logo/│ │ └── logo.svg│ └── no_pic.png├── routes/│ └── paths.ts├── services/│ ├── leads-data-service.ts│ ├── linkedin-accounts-cache-service.ts│ └── manage-accounts-service.ts├── theme/│ ├── components/│ │ ├── index.js│ │ └── table-overrides.js│ ├── core/│ │ ├── components/│ │ │ ├── accordion.jsx│ │ │ ├── alert.jsx│ │ │ ├── appbar.jsx│ │ │ ├── autocomplete.jsx│ │ │ ├── avatar.jsx│ │ │ ├── backdrop.jsx│ │ │ ├── badge.jsx│ │ │ ├── breadcrumbs.jsx│ │ │ ├── button.jsx│ │ │ ├── button-fab.jsx│ │ │ ├── button-group.jsx│ │ │ ├── button-toggle.jsx│ │ │ ├── card.jsx│ │ │ ├── checkbox.jsx│ │ │ ├── chip.jsx│ │ │ ├── container.js│ │ │ ├── dialog.jsx│ │ │ ├── drawer.jsx│ │ │ ├── form.jsx│ │ │ ├── index.js│ │ │ ├── link.jsx│ │ │ ├── list.jsx│ │ │ ├── menu.jsx│ │ │ ├── mui-x-data-grid.jsx│ │ │ ├── mui-x-date-picker.jsx│ │ │ ├── mui-x-tree-view.jsx│ │ │ ├── pagination.jsx│ │ │ ├── paper.jsx│ │ │ ├── popover.jsx│ │ │ ├── progress.jsx│ │ │ ├── radio.jsx│ │ │ ├── rating.jsx│ │ │ ├── select.jsx│ │ │ ├── skeleton.jsx│ │ │ ├── slider.jsx│ │ │ ├── stack.jsx│ │ │ ├── stepper.jsx│ │ │ ├── svg-icon.jsx│ │ │ ├── switch.jsx│ │ │ ├── table.jsx│ │ │ ├── tabs.jsx│ │ │ ├── textfield.jsx│ │ │ ├── timeline.jsx│ │ │ ├── tooltip.jsx│ │ │ └── typography.jsx│ │ ├── mixins/│ │ │ ├── background.js│ │ │ ├── border.js│ │ │ ├── global-styles-components.js│ │ │ ├── index.js│ │ │ ├── mixins.js│ │ │ └── text.js│ │ ├── custom-shadows.js│ │ ├── index.js│ │ ├── palette.js│ │ ├── shadows.js│ │ └── typography.js│ ├── with-settings/│ │ ├── color-presets.js│ │ ├── index.js│ │ ├── right-to-left.jsx│ │ ├── update-components.js│ │ └── update-core.js│ ├── accent-palette.js│ ├── accent-palette.ts│ ├── create-classes.js│ ├── create-theme.js│ ├── index.js│ ├── styles.js│ ├── theme-config.js│ ├── theme-overrides.js│ └── theme-provider.jsx├── utils/│ └── account-count-service.ts├── .gitignore├── COMPLETE_FILE_LIST.txt├── config-global.ts├── COPIED_COMPONENTS.md├── COPY_PLAN.md├── CURRENT_STATUS.md├── DEPENDENCIES.md├── DIRECTORIES.txt├── DIRECTORY_LISTING.txt├── DIRECTORY_STRUCTURE.md├── DIRECTORY_SUMMARY.md├── DIRECTORY_TREE.txt├── eslint.config.mjs├── EXACT_DEPENDENCIES.md├── FILES_LIST.json├── FOLDER_STRUCTURE.txt├── next.config.ts├── next-env.d.ts├── package.json├── package-lock.json├── PLAN.md├── postcss.config.mjs├── README.md├── STATUS.md├── SUMMARY.md└── tsconfig.json
Pricing
Pay once.
Never pay for LinkedIn automation again.
Full LinkedIn outbound system, delivered as a complete codebase so you can deploy on your own infrastructure.
What you will get
Frontend application (dashboard to manage messages, campaigns, and accounts)
Backend & automation engine (LinkedIn-safe sequencing, rate limits, execution)
Database & lead infrastructure (store leads, activity, and campaign data)
Outreach campaign engine
Self-hosted deployment
Single executable
Run the full workflow from one command
Send connection requests
Send requests with daily limits and timing
Send messages
Send personalized messages automatically
Follow
Follow leads as part of the sequence
View profile
Open profiles before taking action
Like posts
Like recent posts to warm up outreach
Scrape connections
Pull connection data into the system
Scrape messages
Sync message history from LinkedIn
Run multi-step sequences
Run steps in the right order automatically
Human-like random waits
Add randomized delays between actions
Schedule management
Control send windows and working hours
Withdraw connection requests
Clean up old pending requests automatically
Features
All the features
you need
Find Leads
Every feature you need to run LinkedIn outreach for clients, built into a system you fully control on your own infrastructure. Customize workflows, plug in your own tools, and run it exactly how your agency operates. No SaaS vendor deciding what you can and can't do.
Features
Protect your
LinkedIn account
Find Leads
Build targeted prospect lists directly from LinkedIn. Filter by role, company, location, and activity signals to focus outreach on the people most likely to respond. Build targeted prospect lists directly from LinkedIn. Filter by role, company, location, and activity signals to focus outreach on the people most likely to respond.
Sending Connection Request..
United Kingdom
IT services
Founders

Jack Daniel
Founder - Xavier LLC
Not Sent

Gorge Chapel
Founder - Chapel LLC
Not Sent

Mike Tylor
Founder - CMB LLC
Not Sent

Thomas Shelby
Founder - Shelby.co
Not Sent

Jack Daniel
Founder - Xavier LLC
Not Sent

Gorge Chapel
Founder - Chapel LLC
Not Sent

Mike Tylor
Founder - CMB LLC
Not Sent

Thomas Shelby
Founder - Shelby.co
Not Sent

Jack Daniel
Founder - Xavier LLC
Not Sent

Gorge Chapel
Founder - Chapel LLC
Not Sent

Mike Tylor
Founder - CMB LLC
Not Sent

Thomas Shelby
Founder - Shelby.co
Not Sent

Jack Daniel
Founder - Xavier LLC
Not Sent

Gorge Chapel
Founder - Chapel LLC
Not Sent

Mike Tylor
Founder - CMB LLC
Not Sent

Thomas Shelby
Founder - Shelby.co
Not Sent
Draft
Schedule
Sent
Fix your LinkedIn outreach margins
Get full access to the Ornn codebase and run unlimited client accounts on your own infrastructure. Eliminate per-account costs, remove subscriptions, and scale outbound without increasing tool spend.
Fix your LinkedIn outreach margins
Get full access to the Ornn codebase and run unlimited client accounts on your own infrastructure. Eliminate per-account costs, remove subscriptions, and scale outbound without increasing tool spend.









