{"id":359027,"date":"2026-09-02T17:53:17","date_gmt":"2026-09-02T17:53:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/portalpress\/"},"modified":"2026-09-02T19:21:38","modified_gmt":"2026-09-02T19:21:38","slug":"portalpilot","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/portalpilot\/","author":194143,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.4","stable_tag":"1.0.4","tested":"7.1","requires":"6.9","requires_php":"8.2","requires_plugins":null,"header_name":"PortalPilot - Client Portal, File Sharing and Client Management","header_author":"cartpauj","header_description":"A client portal for WordPress: share files, exchange notes, manage client profiles and control what each client can do.","assets_banners_color":"93a1b0","last_updated":"2026-09-02 19:21:38","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/cartpauj\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":77,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"cartpauj","date":"2026-09-02 17:53:02","revision":3678489},"1.0.3":{"tag":"1.0.3","author":"cartpauj","date":"2026-09-02 18:17:20","revision":3678522},"1.0.4":{"tag":"1.0.4","author":"cartpauj","date":"2026-09-02 19:21:38","revision":3678571}},"upgrade_notice":{"1.0.1":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3678522,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3678522,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3678522,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3678522,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2","1.0.3","1.0.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3678489,"resolution":"1","location":"assets","locale":"","width":2880,"height":1960},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3678489,"resolution":"10","location":"assets","locale":"","width":1450,"height":1126},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3678489,"resolution":"11","location":"assets","locale":"","width":1450,"height":1392},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3678489,"resolution":"12","location":"assets","locale":"","width":1000,"height":894},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3678489,"resolution":"2","location":"assets","locale":"","width":2880,"height":1600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3678489,"resolution":"3","location":"assets","locale":"","width":2880,"height":1960},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3678489,"resolution":"4","location":"assets","locale":"","width":2880,"height":1550},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3678489,"resolution":"5","location":"assets","locale":"","width":2880,"height":1960},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3678489,"resolution":"6","location":"assets","locale":"","width":2880,"height":1960},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3678489,"resolution":"7","location":"assets","locale":"","width":2880,"height":1788},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3678489,"resolution":"8","location":"assets","locale":"","width":2880,"height":1960},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3678489,"resolution":"9","location":"assets","locale":"","width":1450,"height":1392}},"screenshots":{"1":"Dashboard \u2014 client count, file and note totals, recent registrations and file activity at a glance.","2":"Clients appear as a filtered view on the WordPress Users screen, with a Manage Portal link on every row.","3":"One screen per client: summary counts, starred notes, recent files and recent notes.","4":"The client's files, in folders you control, managed from the admin side.","5":"Notes read as a conversation. Mark a note admin-only, share it with the client, or star it.","6":"Per-client permission overrides \u2014 each one inherits the global default until you change it.","7":"Settings: choose the portal, login and register pages, and edit the messages clients see.","8":"Add custom fields for client profiles and the registration form, and drag to reorder them.","9":"What the client sees when they sign in: their stats, files and notes on your own front end.","10":"Clients browse and download their own files without ever entering the WordPress admin.","11":"Clients write back from the portal, and their replies land in the same thread you see.","12":"The front-end login form, on a page of your choosing."}},"plugin_section":[],"plugin_tags":[27930,17989,8848,3843,4538],"plugin_category":[],"plugin_contributors":[79576],"plugin_business_model":[],"class_list":["post-359027","plugin","type-plugin","status-publish","hentry","plugin_tags-client-management","plugin_tags-client-portal","plugin_tags-file-manager","plugin_tags-notes","plugin_tags-portal","plugin_contributors-cartpauj","plugin_committers-cartpauj"],"banners":{"banner":"https:\/\/ps.w.org\/portalpilot\/assets\/banner-772x250.png?rev=3678522","banner_2x":"https:\/\/ps.w.org\/portalpilot\/assets\/banner-1544x500.png?rev=3678522","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/portalpilot\/assets\/icon-128x128.png?rev=3678522","icon_2x":"https:\/\/ps.w.org\/portalpilot\/assets\/icon-256x256.png?rev=3678522","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-1.png?rev=3678489","caption":"Dashboard \u2014 client count, file and note totals, recent registrations and file activity at a glance."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-2.png?rev=3678489","caption":"Clients appear as a filtered view on the WordPress Users screen, with a Manage Portal link on every row."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-3.png?rev=3678489","caption":"One screen per client: summary counts, starred notes, recent files and recent notes."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-4.png?rev=3678489","caption":"The client's files, in folders you control, managed from the admin side."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-5.png?rev=3678489","caption":"Notes read as a conversation. Mark a note admin-only, share it with the client, or star it."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-6.png?rev=3678489","caption":"Per-client permission overrides \u2014 each one inherits the global default until you change it."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-7.png?rev=3678489","caption":"Settings: choose the portal, login and register pages, and edit the messages clients see."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-8.png?rev=3678489","caption":"Add custom fields for client profiles and the registration form, and drag to reorder them."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-9.png?rev=3678489","caption":"What the client sees when they sign in: their stats, files and notes on your own front end."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-10.png?rev=3678489","caption":"Clients browse and download their own files without ever entering the WordPress admin."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-11.png?rev=3678489","caption":"Clients write back from the portal, and their replies land in the same thread you see."},{"src":"https:\/\/ps.w.org\/portalpilot\/assets\/screenshot-12.png?rev=3678489","caption":"The front-end login form, on a page of your choosing."}],"raw_content":"<!--section=description-->\n<p>PortalPilot turns your WordPress site into a client portal. Clients sign in on your own front end, open their files, write notes back to you and keep their profile up to date \u2014 without ever seeing the WordPress admin.<\/p>\n\n<p>You work from a portal page inside the admin: one screen per client with their files, their notes, their profile and their permissions.<\/p>\n\n<p><strong>Managing clients<\/strong><\/p>\n\n<ul>\n<li>Mark any WordPress user as a client from their profile screen, or while creating them<\/li>\n<li>A Clients view in the admin, filtered to just your clients<\/li>\n<li>A dashboard showing client, file, folder and note counts, plus recent registrations, file activity and notes from clients<\/li>\n<li>One portal page per client with Overview, Profile, Files, Notes and Permissions tabs<\/li>\n<li>Block a client's portal access without touching their WordPress account<\/li>\n<li>Optional welcome email when you create a new client<\/li>\n<\/ul>\n\n<p><strong>File manager<\/strong><\/p>\n\n<ul>\n<li>Upload files and build folders for each client, or let clients do it themselves<\/li>\n<li>Rename, move, trash, restore and permanently delete<\/li>\n<li>A trash view with restore and empty-trash<\/li>\n<li>Folder nesting up to five levels deep, or turn folders off entirely<\/li>\n<li>Mark any file or folder admin-only so the client never sees it<\/li>\n<li>Uploads up to 2 MB, capped by whatever your server allows<\/li>\n<li>Choose which file types are accepted: documents, images, spreadsheets, presentations, archives, audio<\/li>\n<li>Downloads are streamed by PHP, so real file paths are never exposed<\/li>\n<li>Optional email to the client when you add a file, asked each time or set once<\/li>\n<\/ul>\n\n<p><strong>Notes<\/strong><\/p>\n\n<ul>\n<li>Write notes for yourself, or share them with the client<\/li>\n<li>Clients reply from their portal; their notes arrive on the client's Notes tab<\/li>\n<li>Star notes you want to keep at hand, and filter by admin-only, shared, received, starred or trashed<\/li>\n<li>Trash and restore, with a per-client option to let clients delete their own notes<\/li>\n<\/ul>\n\n<p><strong>Client profiles and custom fields<\/strong><\/p>\n\n<ul>\n<li>Clients edit their name, email, password and avatar themselves<\/li>\n<li>Built-in address fields with country and state or province lists<\/li>\n<li>Add your own fields: text, textarea, checkbox, checkboxes, radio, email and phone<\/li>\n<li>Phone fields include international formatting and country selection<\/li>\n<li>Decide per field whether it appears on registration, on the profile, or admin-only<\/li>\n<li>Mark fields required, and drag to reorder them<\/li>\n<\/ul>\n\n<p><strong>Permissions<\/strong><\/p>\n\n<ul>\n<li>Global defaults for what clients may do: upload, create folders, rename files, rename folders, move files, move folders, trash files, trash folders, view trash, restore from trash, delete their own notes<\/li>\n<li>Override any of them for an individual client on their portal page<\/li>\n<\/ul>\n\n<p><strong>Sign-in, registration and passwords<\/strong><\/p>\n\n<ul>\n<li>Front-end login, registration and password reset pages, built from your own pages<\/li>\n<li>Self-registration can be switched off, leaving account creation to you<\/li>\n<li>Custom messages for the portal welcome, access denied and registration disabled screens<\/li>\n<li>Choose where clients land after logging out<\/li>\n<\/ul>\n\n<p><strong>Email notifications<\/strong><\/p>\n\n<ul>\n<li>Eight notifications, each one switchable: new client registered, file uploaded, client note received, client profile updated, welcome, admin added a file, admin shared a note, password reset<\/li>\n<li>Edit every subject and body in a visual editor<\/li>\n<li>Merge tags for <code>{{first_name}}<\/code>, <code>{{last_name}}<\/code>, <code>{{email}}<\/code>, <code>{{site_name}}<\/code>, <code>{{portal_url}}<\/code>, <code>{{login_url}}<\/code>, <code>{{file_name}}<\/code>, <code>{{file_count}}<\/code> and <code>{{reset_url}}<\/code><\/li>\n<li>Set the From name and address, and send admin notices to more than one recipient<\/li>\n<li>Sent with WordPress's own <code>wp_mail()<\/code>, so any SMTP plugin works alongside it<\/li>\n<\/ul>\n\n<p><strong>Security<\/strong><\/p>\n\n<ul>\n<li>Nonce checks and capability checks on every form and AJAX endpoint<\/li>\n<li>Ownership checks so one client's files and notes can never be reached by another<\/li>\n<li>Prepared statements for every database query<\/li>\n<li>Uploads validated three ways: an allowed-types list, a blocked list of executable types, and magic-byte inspection of the file itself<\/li>\n<li>Double-extension uploads rejected<\/li>\n<li>Files stored flat under UUID names in a protected directory, served only through PHP with no-store headers<\/li>\n<\/ul>\n\n<p><strong>For developers<\/strong><\/p>\n\n<ul>\n<li>Actions and filters throughout for extending the plugin<\/li>\n<li>Custom tables rather than post types, and no REST API dependency<\/li>\n<li>Scripts and styles load only on PortalPilot screens<\/li>\n<li>Fully translatable through the <code>portalpilot<\/code> text domain<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install through <strong>Plugins \u2192 Add New<\/strong>, or upload the <code>portalpilot<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate PortalPilot on the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>PortalPilot \u2192 Settings<\/strong> and pick or create your portal, login and registration pages.<\/li>\n<li>Create a client from <strong>Users \u2192 Add New<\/strong>, or edit an existing user and tick <strong>This user is a client<\/strong>.<\/li>\n<li>Set your permissions, email notifications and custom fields under <strong>PortalPilot \u2192 Settings<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20clients%20need%20a%20wordpress%20account%3F\"><h3>Do clients need a WordPress account?<\/h3><\/dt>\n<dd><p>Yes. PortalPilot uses WordPress accounts for sign-in, but clients only ever see your front-end portal, never the admin.<\/p><\/dd>\n<dt id=\"does%20it%20add%20a%20new%20user%20role%3F\"><h3>Does it add a new user role?<\/h3><\/dt>\n<dd><p>No. Being a client is a flag on the user, so their WordPress role stays exactly as you set it.<\/p><\/dd>\n<dt id=\"can%20i%20control%20what%20clients%20are%20allowed%20to%20do%3F\"><h3>Can I control what clients are allowed to do?<\/h3><\/dt>\n<dd><p>Yes. Every file and folder action has a global default, and you can override any of them for one client on their portal page.<\/p><\/dd>\n<dt id=\"are%20uploaded%20files%20publicly%20accessible%3F\"><h3>Are uploaded files publicly accessible?<\/h3><\/dt>\n<dd><p>No. Files are stored under generated UUID names in a protected directory, and downloads are streamed by PHP after an ownership check. Real paths are never exposed.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20some%20files%20hidden%20from%20a%20client%3F\"><h3>Can I keep some files hidden from a client?<\/h3><\/dt>\n<dd><p>Yes. Mark any file or folder admin-only and it disappears from the client's portal while staying in yours.<\/p><\/dd>\n<dt id=\"how%20large%20can%20uploads%20be%3F\"><h3>How large can uploads be?<\/h3><\/dt>\n<dd><p>Up to 2 MB, or less if your server's own upload limit is lower. PortalPilot only offers sizes your server can actually accept.<\/p><\/dd>\n<dt id=\"can%20i%20stop%20people%20registering%20on%20their%20own%3F\"><h3>Can I stop people registering on their own?<\/h3><\/dt>\n<dd><p>Yes. Turn off self-registration under <strong>PortalPilot \u2192 Settings \u2192 Registration<\/strong> and only you can create client accounts.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20block%20a%20client%27s%20access%3F\"><h3>What happens when I block a client's access?<\/h3><\/dt>\n<dd><p>They can no longer open the portal, upload, download or write notes. Their WordPress account and any other access it has are untouched.<\/p><\/dd>\n<dt id=\"does%20portalpilot%20create%20custom%20post%20types%3F\"><h3>Does PortalPilot create custom post types?<\/h3><\/dt>\n<dd><p>No. It uses its own tables: <code>portalpilot_files<\/code>, <code>portalpilot_folders<\/code>, <code>portalpilot_notes<\/code> and <code>portalpilot_custom_fields<\/code>.<\/p><\/dd>\n<dt id=\"how%20are%20emails%20sent%3F\"><h3>How are emails sent?<\/h3><\/dt>\n<dd><p>Through WordPress's <code>wp_mail()<\/code>. No external service is needed, and any SMTP plugin works alongside it.<\/p><\/dd>\n<dt id=\"is%20it%20multisite%20compatible%3F\"><h3>Is it multisite compatible?<\/h3><\/dt>\n<dd><p>Not at this time. PortalPilot is built for single-site installs.<\/p><\/dd>\n<dt id=\"what%20are%20the%20requirements%3F\"><h3>What are the requirements?<\/h3><\/dt>\n<dd><p>WordPress 6.9 or newer and PHP 8.2 or newer.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>The file upload panel is now a distinct section that reports each upload's result and stays until dismissed.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed the logo and icon artwork being cropped at the top, which flattened the crown of the portal arch. Affects the admin menu icon, the admin header logo and the directory assets.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fixed a fatal error when rendering a radio or checkbox custom field whose stored options were malformed.<\/li>\n<li>The clients list header now renders through <code>in_admin_header<\/code> instead of <code>admin_notices<\/code>.<\/li>\n<li>Removed the version-check admin notices; WordPress enforces the plugin header requirements itself.<\/li>\n<li>The plugin name now describes what it does.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<\/ul>","raw_excerpt":"A client portal for WordPress: share files, exchange notes, manage client profiles and control what each client can do.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/359027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=359027"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/cartpauj"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=359027"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=359027"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=359027"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=359027"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=359027"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=359027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}