Simple Newsletter Documentation

Simple Newsletter turns your Joomla site into a self-hosted mailing list: a subscribe form on the front end, double opt-in confirmation, e-mail templates with placeholders, and batched sending that survives a PHP timeout. This page is the complete manual.

Contents

  1. What gets installed
  2. Requirements
  3. Installation
  4. Quick start
  5. Options reference
  6. Subscribers
  7. Templates and placeholders
  8. Starter layouts
  9. Sending a newsletter
  10. Send history and resuming
  11. The subscribe module
  12. A subscription page
  13. Unsubscribing
  14. Permissions
  15. Database tables
  16. Troubleshooting
  17. Updating and uninstalling

1. What gets installed

The package pkg_simplenewsletter.zip installs two extensions:

  • Simple Newsletter (com_simplenewsletter) — the component, with its administrator screens and the front-end endpoints that handle confirmation and unsubscribe links.
  • Simple Newsletter Subscribe (mod_simplenewsletter) — the site module holding the subscribe form.

It also creates four database tables and one example template called Default newsletter, so there is something to look at immediately.

In the administrator you will find Components → Simple Newsletter with four screens: Subscribers, Templates, Send Newsletter and Send History.

2. Requirements

  • Joomla 5.1 or newer, including Joomla 6
  • PHP 8.1 or newer
  • MySQL or MariaDB
  • A working mail setup in Global Configuration → Server → Mail

No cron job and no external service are needed. If your contact form already delivers mail, so will this.

3. Installation

  1. Log in to the administrator as a Super User.
  2. System → Install → Extensions.
  3. On the Upload Package File tab, drop in pkg_simplenewsletter.zip.
  4. Wait for the success message.

If the install fails, the usual cause is an upload limit rather than the package: check upload_max_filesize and post_max_size in your PHP configuration, or use the Install from Folder tab after uploading the ZIP by FTP.

4. Quick start

Five minutes, in this order:

  1. Check the sender. Components → Simple Newsletter → Options → Sender. The default, Use Joomla Global Configuration, is usually correct.
  2. Publish the module. Content → Site Modules → New → Simple Newsletter Subscribe. Pick a position and publish.
  3. Subscribe yourself from the front end and click the link in the confirmation e-mail. This proves the whole opt-in chain works before you invite anyone.
  4. Look at a template. Templates → open Default newsletter, or create one and press Start from a layout.
  5. Send a test. Send Newsletter → pick the template → put your address in the test field → Send test. When that looks right, press Send Now.

5. Options reference

Components → Simple Newsletter → Options.

Sender

Sender settings Either Use Joomla Global Configuration (default) or Enter settings manually. The three fields below appear only in manual mode.
From name The name recipients see. Left empty, the Global Configuration value is used.
From email The address messages are sent from. Left empty, the Global Configuration value is used. It must be an address your SMTP account is allowed to send from.
Reply-to Where replies go. Left empty, replies go to the From address.

Whatever you choose here, the Send screen shows the address that will actually be used and where it came from, so there is no guessing.

Sending

Emails per batch Default 25. How many messages are sent per request. Lower it if your server times out; raise it on a fast host to finish sooner.
Add List-Unsubscribe header Default Yes. Adds the Unsubscribe control that Gmail and Outlook show next to your name. Leave it on: readers who can unsubscribe in one click do that instead of reporting spam, which protects your domain.
Keep recipient detail for (days) Default 30. Each send stores one row per recipient so you can see which addresses failed. Rows older than this are removed automatically when a send finishes. The summary line in the history is always kept. Set 0 to keep everything forever.
Pause between emails (ms) Default 0. Waits this long after each message. Use it when your host enforces an hourly sending limit — 200–500 ms is a common setting on shared hosting.

Opt-in

Ask for name Whether the subscription form on a menu item shows a name field. The module has its own setting for this.
Confirmation subject Subject of the confirmation e-mail. Left empty, a sensible default including your site name is used. Placeholders work here.
Confirmation email Body of the confirmation e-mail, edited in your normal Joomla editor. It must contain {confirm_link}, or nobody can confirm. Left empty, a plain built-in text is used.
Confirmation link validity (days) Default 7. After this, clicking the link issues a fresh one instead of confirming, and the visitor is told to check their inbox again. Set 0 for links that never expire.
Landing page The menu item visitors land on after confirming or unsubscribing. Left empty, they land on the site root. A short "thank you" article makes a better landing page than the front page.

6. Subscribers

Every address has one of four states:

Pending Signed up but has not clicked the confirmation link. Receives nothing.
Confirmed Clicked the link. Only these receive newsletters.
Unsubscribed Opted out. The row is deliberately kept rather than deleted, so the same address cannot quietly be added again by a later sign-up without a fresh confirmation.
Trashed Hidden from the default list. Use Delete to remove permanently.

From the toolbar you can:

  • New — add an address by hand. Setting it straight to Confirmed skips the opt-in e-mail, which is what you want when importing a list people already agreed to.
  • Actions — mark the selected rows Confirmed, Pending or Unsubscribed, resend the confirmation e-mail, or delete.
  • Export CSV — downloads the list as currently filtered and searched, with id, name, e-mail, state, sign-up date and confirmation date.

Search accepts a name or an e-mail address, or id:12 to jump to a specific row.

7. Templates and placeholders

A template is a reusable newsletter: a title (for your eyes only), a subject line, and an HTML body edited in your normal Joomla editor. Unpublished templates do not appear in the Send screen.

These placeholders work in both the subject and the body, and are replaced for each recipient at the moment the message is sent:

{name} The subscriber's name. Empty if they never gave one — so write "Hello {name}," rather than relying on it.
{email} The subscriber's e-mail address.
{unsubscribe_link} That subscriber's personal opt-out URL. Every newsletter should contain this. All six supplied layouts already do.
{confirm_link} The opt-in URL. Only meaningful in the confirmation e-mail in Options.
{sitename} Site name from Global Configuration.
{siteurl} Your site's root URL.
{date} Today's date, formatted for the site language.

The eye icon in the Templates list opens a preview rendered with sample data, so you can see the result without sending anything.

Two things worth knowing about e-mail HTML: mail clients ignore most modern CSS, which is why the supplied layouts use tables and inline styles; and images must be referenced by absolute URL, because a recipient's mail client cannot resolve a relative path on your site.

8. Starter layouts

In the template editor, Start from a layout opens a picker with six designs. Select one to preview it on the right, then Use this to insert it. If the body already has content you are asked to confirm first, and the subject is filled in only when you have not written one yourself.

Simple letterOne column, no images. Reads like a personal note.
Hero and call to actionDark banner, headline, short body, one prominent button.
Two-column roundupDated masthead with two story cards side by side.
Product gridFour tiles with price and button.
Event invitationDate badge, details block, RSVP button.
Minimal, text onlySerif type, hairline rules, no boxes. Tends to avoid the Promotions tab.

The layouts are ordinary HTML files in administrator/components/com_simplenewsletter/presets/. To add your own, drop in my-layout.html and add an entry to presets.json in the same folder.

9. Sending a newsletter

Components → Simple Newsletter → Send Newsletter.

  1. Choose a template. The preview pane on the right updates as you switch.
  2. Adjust the subject if you want something different from the template's own.
  3. Check the summary: how many confirmed recipients there are, the batch size, and the From address with a note saying whether it comes from Global Configuration or from this component's options.
  4. Send a test first. Put an address in the test field and press Send test. Placeholders are rendered, and if that address is already a subscriber its real token is used, so the unsubscribe link in the test is live.
  5. Press Send Now and confirm.

What happens then: a job record is created and one queue row is written per confirmed subscriber. Messages go out in batches, and the progress bar counts sent and failed as it goes. Each recipient's result is stored individually, so one rejected address does not abort the run.

Sending runs in this browser tab. Leaving the page stops it — but nothing is lost, see the next section. Cancel stops after the current batch; recipients not yet reached are simply left unsent.

10. Send history and resuming

Send History lists every newsletter you have sent, with its status and its sent / failed / total counts. Opening one shows each recipient, and for every failure the reason your mail server gave — an invalid address, a rejected sender, a full mailbox. Filter by Failed to see only the problems.

If a send was interrupted, the job stays in Running with recipients still queued. Both the Send screen and the history list then offer Resume, which picks up exactly where it stopped. Because state is tracked per recipient, nobody receives the message twice.

Housekeeping: per-recipient rows are removed automatically once a finished job passes the retention window set in Options, and Clean up detail rows in the toolbar does it on demand. Delete removes selected jobs and their rows entirely.

11. The subscribe module

Content → Site Modules → New → Simple Newsletter Subscribe.

Intro textA line above the form. HTML allowed.
Show name fieldWhether to ask for a name as well as an address.
Name requiredOnly shown when the name field is on. Asking for less gets you more sign-ups.
Button textDefaults to "Subscribe".
Button CSS classDefaults to btn btn-primary. Put your template's own button class here to match the rest of the site.
Form layoutStacked for sidebars, Inline for a footer strip.
Privacy noteSmall print under the button — a good place for a link to your privacy policy.

The form carries a hidden honeypot field that a human never fills in; submissions that fill it are silently accepted and discarded, so bots get no feedback. It also carries a Joomla CSRF token, which is worth knowing if you cache aggressively — see Troubleshooting.

12. A subscription page

If you prefer a dedicated page to a module, create a menu item of type Simple Newsletter → Subscription Form. It renders the same form full width. Whether the name field appears is controlled by Ask for name in the component Options.

This also makes a good Landing page target for confirm and unsubscribe links.

13. Unsubscribing

Every layout's footer contains {unsubscribe_link}, which resolves to a URL unique to that subscriber. Clicking it sets the row to Unsubscribed and shows a confirmation message on your landing page. Clicking it twice is harmless.

With Add List-Unsubscribe header switched on, messages also carry the RFC 8058 headers that make Gmail, Outlook and Apple Mail display their own Unsubscribe control next to the sender name. That control posts to a dedicated endpoint which answers immediately without redirecting, as the standard requires.

One consequence worth knowing: because the unsubscribe URL is a plain link, a security scanner that follows links in e-mail can occasionally unsubscribe somebody who never clicked. It is rare. If it matters to you, point the Landing page at an article that explains what happened and offers a link back to the subscribe form.

14. Permissions

Options → Permissions exposes the usual Joomla actions plus one of our own:

Access Administration InterfaceSee the component at all.
Create / Edit / Delete / Edit StateManage subscribers and templates.
Send NewsletterSeparate from editing. An editor can prepare templates without being able to send to the whole list.

15. Database tables

#__simplenewsletter_subscribersOne row per address, with state, token and timestamps.
#__simplenewsletter_templatesYour newsletters.
#__simplenewsletter_jobsOne row per send, with counts. Small, kept indefinitely.
#__simplenewsletter_queueOne row per recipient per send, pruned by the retention setting.

#__ is Joomla's table prefix token; on your site it becomes whatever prefix you chose at install.

16. Troubleshooting

Nothing arrives, and no error is shown

Check Global Configuration → Server → Mail → Send Mail. If it is off, Joomla sends nothing and reports no error. The Send screen warns you about this, but it is the first thing to check.

Messages are sent but land in spam, or fail with a rejection

Almost always the From address. If Joomla is sending through SMTP, most providers only allow the account's own address in the From field — sending as This email address is being protected from spambots. You need JavaScript enabled to view it. through an SMTP account belonging to This email address is being protected from spambots. You need JavaScript enabled to view it. gets rejected or silently dropped. The Send screen compares the two and warns when they differ.

Beyond that, deliverability is a domain matter rather than a software one: publish SPF and DKIM records for the domain you send from, and prefer authenticated SMTP over PHP mail.

The send stops partway through

A PHP timeout, or the tab was closed. Open Send Newsletter or Send History and press Resume. To stop it happening again, lower Emails per batch.

"Invalid token" when someone subscribes

The page holding the form was served from cache with a stale CSRF token. Exclude pages carrying the module from your page cache, or turn off Joomla's System - Page Cache plugin for them. This affects every Joomla front-end form, not just this one.

The confirmation e-mail arrives with {confirm_link} shown literally

The custom confirmation body in Options lost the placeholder, or an editor escaped it. Clear the field to fall back to the built-in text, then re-add your wording around a working {confirm_link}.

Confirmation links point at the wrong host

Links are built from your site's own root URL. If the site redirects between the bare domain and www, set the canonical form in Global Configuration so the links match it from the start.

An admin screen shows an error that persists after a fix

Joomla renders error pages with an HTTP 404 status, which browsers and server-side caches happily remember for that exact URL. Add &x=1 to the address to force a fresh request; if that works, the fix is fine and only the cached page was stale.

17. Updating and uninstalling

Updates arrive through System → Update → Extensions like any other Joomla extension — no download key and no account. You can also install a newer package over the old one; Joomla treats it as an upgrade and your subscribers, templates and history are untouched.

To uninstall, remove the Simple Newsletter package from System → Manage → Extensions. That removes the component and the module together.

Uninstalling drops all four tables, including your subscriber list. Export your subscribers to CSV first if there is any chance you will want them back.

Root Explorer Documentation

Secure administrator file manager for Joomla 5 & 6 · v1.0.0

Overview

Root Explorer is a file manager that runs inside the Joomla administrator. It lets you browse, edit, upload, download and organise your site's files without FTP or a hosting control panel. All activity is restricted to Super Users and confined ("sandboxed") to a configurable root folder.

Requirements

Joomla 5.0 or newer (also runs on 6.x)
PHP 8.1 or newer
PHP extensions zip — required for the zip / extract features
Access level Super User (core.admin)

Installation

  1. Log in to the Joomla administrator as a Super User.
  2. Go to System → Install → Extensions.
  3. On the Upload Package File tab, drop in com_rootexplorer-1.0.0.zip.
  4. Wait for the success message.
  5. Open it from Components → Root Explorer.

Updating later uses the same package or the built-in updater — see Updates.

Configuration

Open Components → Root Explorer, then click Options (top right). There is one setting:

Base Path The root folder Root Explorer is jailed to. Enter an absolute path (e.g. /var/www/html) or a path relative to your Joomla root (e.g. images). Leave it empty to use the Joomla root — the recommended default.
Whole-server access. You can set Base Path to / to browse the entire server filesystem. Only do this if your host's open_basedir allows it and you understand the exposure. On shared hosting this is usually restricted — keep the default Joomla-root jail.

The interface

The screen has four zones:

  • Toolbar — actions: Up, Refresh, New Folder, New File, Upload, Copy, Move, Zip, Delete.
  • Breadcrumb — your current path; click any segment to jump there. / (root) returns to the Base Path.
  • File table — name, size, permissions and modified date, with per-row actions on the right.
  • Status bar — confirmation or error messages after each action.

Browsing

  • Click a folder name to open it.
  • Click Up to go to the parent folder, or use the breadcrumb.
  • Click Refresh to reload the current folder.
  • Use the header checkbox to select all items, or the per-row checkboxes for a subset. Copy, Move, Zip and Delete act on the selection.

Create & upload

  • New Folder / New File — enter a name; it is created in the current folder.
  • Upload — pick one or more files; they are uploaded into the current folder. Multiple files at once are supported.
Large uploads are bounded by your server's PHP settings (upload_max_filesize, post_max_size). Adjust those on the host if you need bigger uploads.

Editing files

Click a text file name (or its Edit action) to open the built-in editor. Recognised text types include php, html, css, js, json, xml, ini, txt, md, sql, htaccess, yml, conf and more. Save with the Save button or Ctrl/Cmd + S; press Esc to close.

Non-text or very large files aren't opened in the editor — use Download instead. The editor limit protects the browser from binary content.

Rename, copy, move, delete

  • Rename — per-row action; enter the new name.
  • Copy — select items, click Copy, enter a destination folder path (from root).
  • Move — same as Copy, but the originals are moved.
  • Delete — select items and confirm. Folders are deleted recursively.
Deletes and overwrites are permanent. There is no recycle bin. Back up anything important first.

Permissions (chmod)

Use the CHMOD row action and enter an octal mode such as 644 (files) or 755 (folders). Some hosts forbid changing permissions; if so you'll see a clear error.

Zip & extract

  • Zip — select items, click Zip, name the archive. It is created in the current folder.
  • Extract — the Extract action on a .zip file unpacks it into a folder beside it. Extraction is protected against "zip-slip" (archives that try to write outside the target).

Downloading

Click a non-text file name, or the Download row action. Files are streamed as a download and never executed on the server.

Security model

Root Explorer is built security-first:

  • Super Users only. Both the interface and every action require core.admin.
  • CSRF protection. A valid Joomla token is required on every request.
  • Sandbox jail. Every path from the browser is normalised and verified to stay inside the Base Path. Directory traversal (../), absolute paths, Windows drive prefixes, symlink escapes and zip-slip are all rejected.
  • Safe uploads/downloads. Uploads use is_uploaded_file/move_uploaded_file; downloads are sent as application/octet-stream.
  • No external calls. No telemetry, no license phone-home — nothing leaves your server.
Because it can modify any file inside the Base Path, only grant Super User access to people you trust, and keep your admin login protected.

Updates

Updates are delivered in place. Go to System → Update → Extensions and click Find Updates; if a new version is available it installs like any Joomla extension. A valid subscription is required to receive downloads and updates.

Troubleshooting

SymptomCause & fix
"Invalid security token" The page sat open too long and the session token expired. Reload the page and retry.
"You are not authorised" Your account isn't a Super User. Root Explorer is Super Users only by design.
Can't write / save / chmod Filesystem permissions or ownership on the host. The web server user must be able to write the target. Check with your host.
Zip features missing or error The PHP zip extension isn't installed/enabled. Enable it in your PHP configuration.
Base Path / shows nothing / errors open_basedir restricts PHP to certain paths. Use a Base Path inside the allowed area (e.g. the Joomla root).
Upload rejected (too large) Raise upload_max_filesize and post_max_size in PHP settings.

Uninstall

Go to System → Manage → Extensions, find Root Explorer, select it and click Uninstall. Files you created with the tool are not removed — only the component itself.

Support

Support is available to customers with an active subscription via saintartdesigns.com. When reporting an issue, include your Joomla and PHP versions and the exact error text from the status bar.

Root Explorer v1.0.0 · © 2026 SaintArt Designs · saintartdesigns.com
Joomla!® is a registered trademark of Open Source Matters, Inc. This product is not affiliated with or endorsed by Open Source Matters, Inc.

Embed Instagram Posts Documentation

A Joomla site module that displays public Instagram posts through Instagram’s official embed. No API key, app registration or account login required.

Version 1.0.0 · Joomla 4.4 / 5 / 6 · PHP 8.1+ · GPLv2+ · by Saint Art Designs

Contents

  1. Overview
  2. Requirements
  3. Installation
  4. Creating the module
  5. Using a manual list of posts
  6. Using an RSS bridge feed
  7. All configuration options
  8. Render modes explained
  9. Styling & CSS customisation
  10. Caching behaviour
  11. Troubleshooting
  12. FAQ
  13. License

1. Overview

Embed Instagram Posts resolves a list of Instagram post permalinks and renders each one using Instagram’s public embed. Because it never talks to the Instagram Graph API, there is nothing to authenticate: you do not create a Meta app, you do not generate tokens, and there is no token expiry to maintain. The only requirement is that the posts are public.

Permalinks come from one of two sources, selected with the Post source option:

  • Manual list – you paste post URLs directly.
  • RSS bridge feed – the module fetches an RSS feed and extracts Instagram links from it automatically.

2. Requirements

Joomla 4.4, 5.x or 6.x
PHP 8.1 or newer
Posts Must be public (private accounts cannot be embedded).
Outbound HTTP Required only in RSS mode, so the server can retrieve the feed.

3. Installation

  1. Log in to the Joomla administrator.
  2. Go to System → Install → Extensions.
  3. On the Upload Package File tab, drop mod_embed_instagram_posts-1.0.0.zip or browse for it.
  4. Wait for the “Installation successful” message.

To update later, install the newer ZIP the same way — the package uses method="upgrade", so it installs over the existing version without losing your settings.

4. Creating the module

  1. Go to Content → Site Modules and click New.
  2. Select Embed Instagram Posts from the list.
  3. Give it a title (or hide the title), choose a Position, and set Status to Published.
  4. On the Menu Assignment tab, choose where it should appear (all pages or specific menu items).
  5. Configure the options (below) and click Save.

Helix Ultimate / template positions: a module only renders if its position is actually output by the active template. If you see nothing on the front end, verify the position first – see Troubleshooting.

5. Using a manual list of posts

  1. Set Post source to Manual list of post URLs.
  2. In Post URLs, paste one URL per line, for example:
https://www.instagram.com/p/DbC3mk_inwo/
https://www.instagram.com/reel/Cxyz1234abc/
https://www.instagram.com/username/p/DdEf5678ghi/

Post, reel and IGTV (/tv/) URLs are all accepted, with or without the username in the path. Duplicate posts are removed automatically, and the module shows at most Number of posts items.

6. Using an RSS bridge feed

Instagram does not provide RSS itself, so RSS mode relies on a third-party bridge that turns an Instagram profile into an RSS feed (for example RSS.app or FetchRSS). The module then reads that feed and pulls out the Instagram links.

  1. Create a feed for your Instagram profile in the bridge service.
  2. Copy the direct feed URL – the one that returns XML. On RSS.app this is the RSS Feed URL and usually ends in .xml, e.g. https://rss.app/feeds/XXXXXXXX.xml.
  3. Set Post source to RSS bridge feed URL and paste the URL into RSS feed URL.
  4. Save.

Most common mistake: pasting the feed’s share / preview page link (e.g. https://rss.app/r/feed/…) instead of the direct .xml feed. The preview page returns HTML, not a feed, so the module finds no Instagram links and shows nothing. Always use the URL that ends in .xml.

The module requires the feed items to contain real Instagram permalinks (instagram.com/p/…, /reel/… or /tv/…). Some free bridges rewrite item links to their own redirect domain – if so, the module cannot detect the posts.

7. All configuration options

Source

OptionDefaultDescription
Post source Manual Where permalinks come from: manual list or RSS bridge feed.
Post URLs Manual mode: one Instagram post/reel/IGTV URL per line.
RSS feed URL RSS mode: the direct feed URL (usually ending in .xml).
Number of posts 3 Maximum posts to display (1–24).
Cache time (minutes) 60 RSS mode only: how long the fetched feed is cached before refetching (5–10080).
Profile URL Optional link to your Instagram profile, used by the follow link.

Layout

OptionDefaultDescription
Render mode Iframe iframe (no external script) or Instagram embed.js. See below.
Show captions Yes Include the post caption inside each embed (iframe mode).
Embed height (px) 720 Fixed height of each iframe embed (200–1400).
Columns (desktop) 3 Grid columns on large screens (≥ 992px).
Columns (tablet) 2 Grid columns on medium screens (≥ 576px).
Columns (mobile) 1 Grid columns on small screens.
Grid gap (px) 16 Spacing between grid items.
Follow link text Text for a link below the grid. Requires a Profile URL; leave empty to hide.
Load module CSS Yes Load the bundled responsive-grid stylesheet. Turn off to style from your template.

Advanced

Standard Joomla module options are available too: alternative Layout, Module Class Suffix, module tag, Bootstrap size, header tag/class and module style (chrome).

8. Render modes explained

Iframe (recommended)

Each post is embedded in its own <iframe> pointing at Instagram’s /embed/ endpoint. No third-party JavaScript is loaded into your page, embeds are isolated from your site, and the height is fixed by the Embed height option.

Instagram embed.js

Posts are rendered as Instagram’s official blockquote cards, enhanced by Instagram’s embed.js script loaded from instagram.com. This produces the familiar rich card and auto-sizes to content, but it does load remote JavaScript from Meta.

9. Styling & CSS customisation

The bundled stylesheet lays posts out in a responsive CSS grid driven by CSS custom properties. The module wrapper uses the class eip; the grid, items, embeds, follow link and notice use eip-grid, eip-item, eip-embed, eip-follow and eip-notice.

To override styles from your template, target those classes, for example:

.eip-embed { border-radius: 16px; }
.eip-grid  { gap: 24px; }
.eip-follow a { font-weight: 700; }

If you prefer to control everything yourself, set Load module CSS to No and add your own rules. You can also add a Module Class Suffix to scope your CSS to a single module instance.

10. Caching behaviour

In RSS mode the fetched feed is cached per module instance under Joomla’s cache directory for the number of minutes set in Cache time. This avoids querying the bridge on every page view. If a refresh fails, the module keeps serving the last successful set of posts and, for logged-in administrators only, shows a small notice that cached content is being used. Manual mode does not fetch anything, so it is not cached.

11. Troubleshooting

Nothing appears on the page

  1. Check the module position. The most common cause. Enable Preview Module Positions in Templates → Options, then open your page with ?tp=1 appended to the URL. If the assigned position outline does not appear, the template does not output that position there – move the module to a position that is rendered.
  2. Check Menu Assignment. Make sure the module is assigned to the page you are viewing.
  3. View the page as a Super User. Configuration errors (bad feed, no URLs) are shown only to administrators, as a warning box. Visitors just see nothing, by design.
  4. Read the module log. Problems are written to administrator/logs/mod_embed_instagram_posts.php with the exact reason (HTTP code, empty body, or “Feed contained no Instagram permalinks”).

RSS mode shows nothing

  • Confirm you used the direct .xml feed URL, not the bridge’s share/preview page.
  • Open the feed URL in a browser and check the items actually link to instagram.com/p/….
  • Make sure your host allows outbound HTTP requests.
  • Clear the module cache (or wait for Cache time to expire) after fixing the URL.

An embed shows a blank/empty box

That specific post is probably deleted, private, or region-restricted. Replace it, or switch the account/post to public.

12. FAQ

Do I need an Instagram or Meta developer account?

No. The module uses Instagram’s public embed only. There is no API key or token.

Will it show a private account’s posts?

No. Only public posts can be embedded.

How do I keep posts updating automatically?

Use RSS mode with a bridge feed. New posts in the feed appear after the cache expires.

Can I put several instances on one page?

Yes. Each module instance has its own settings and its own cache.

13. License

Embed Instagram Posts is free software released under the GNU General Public License, version 2 or later (GPLv2+); the full text is in LICENSE.txt in the package. It is provided without warranty of any kind.

Instagram is a trademark of Meta Platforms, Inc. This extension is independent and is not affiliated with, endorsed by, or sponsored by Meta; it uses only Instagram’s publicly documented embed feature.

Developed and maintained by Saint Art Designs.

Pay Drop Documentation

Everything you need to sell your first file with PayDrop, from installation to the day-to-day work of adding products. If something is not covered here, use the contact form.

1. Installation

  1. Log in to the Joomla administrator as a Super User.
  2. Go to System → Install → Extensions.
  3. On the Upload Package File tab, drop in pkg_paydrop.zip.

The package installs one component and three plugins, and enables all of them:

  • PayDrop — the component, where your products and sales live
  • System – PayDrop — guards the thank-you page, verifies payments, issues download links
  • Content – PayDrop — turns the shortcode into a buy button
  • Button – PayDrop — the button under the editor that inserts shortcodes

A folder called /files/ is created and closed to the web for you. If any plugin ends up disabled, enable it in System → Plugins by searching for paydrop.

2. Preparing your PayPal account

PayDrop verifies every payment with PayPal before serving a file. For that it needs a PDT identity token.

  1. Sign in to paypal.com with the business account that receives payments.
  2. Click the gear icon (Account Settings), then Website payments in the left menu.
  3. Next to Website preferences click Update.
  4. Set Auto return to On and enter any return URL. PayPal will not enable PDT without this.
  5. Set Payment data transfer to On.
  6. Scroll down and click Save. The token is not shown until you save.
  7. Open Website preferences → Update again. The Identity Token now appears under Payment data transfer.

While you are on that page: set PayPal account optional to On if you want buyers to be able to pay by card without opening a PayPal account. Leave Encrypted website payments off — it is unrelated.

3. Options

Open Components → PayDrop → Products and click Options in the toolbar.

PayPal

  • PayPal e-mail — the account that receives payments.
  • PDT identity token — the token from step 2.
  • Verify payments (PDT) — leave this on. With it off, anyone who knows a product token can download without paying.
  • Show card form first — sends buyers straight to the card form instead of the PayPal login. Requires PayPal account optional on the PayPal side.
  • PayPal sandbox — for testing with a sandbox account.

Downloads

  • Files folder — where your files live. Pick it from the list; PayDrop closes it to the web by itself.
  • Link lifetime (hours) — how long a download link stays valid after payment. Default 72.
  • Maximum downloads — how many times one link may be used. 0 means unlimited until it expires.
  • Button text — the wording on the download and buy buttons.

E-mail

  • E-mail the link to the buyer — on by default, and worth keeping on.
  • Subject and Message — your own wording. Placeholders: {name}, {product}, {link}, {hours}, {sitename}. Leave empty for the built-in text.

Mail matters. Set your site to SMTP in Global Configuration → Server → Mail, and make sure the From address is the same as the SMTP account. Most hosts silently reject mail when they differ, and PHP's own mail function reports success even when nothing was delivered.

4. The thank-you page

Create one ordinary Joomla article, for example titled Thank you, with a short message. This is where PayPal returns your buyers, and where the download button appears.

One article is enough for every product. It is unreachable without a valid token, so nobody stumbles onto it.

5. Adding a product

Components → PayDrop → Products → New

  • Product name — shown on the PayPal checkout page.
  • Thank-you article — the article from step 4.
  • Upload file — upload the file you are selling. It goes into the protected folder and is selected below automatically.
  • File name — or pick a file that is already in the folder.
  • Product token — leave empty and a strong one is generated.
  • PayPal item number — a unique id per product, for example ebook-01. Recommended: it stops a payment for a cheap product from unlocking an expensive one.
  • Price and Currency.

Save. The edit screen then shows the shortcode for this product, something like Pay and Download.

6. Putting the buy button on a page

Open the article where you sell the product and either paste the shortcode, or click the PayDrop button under the editor and pick the product from the list. Nothing else is needed — price, name and return address all come from the product.

If the shortcode shows up as plain text on the page, the Content – PayDrop plugin is disabled.

7. What the buyer sees

  1. Clicks the button and pays at PayPal, with an account or by card.
  2. Comes back to your thank-you page. The address is cleaned of PayPal's parameters, so their name and e-mail are not left in the URL.
  3. Clicks Download and gets the file.
  4. Receives the same link by e-mail, valid for as long as you configured.

8. Sales

Components → PayDrop → Sales & Downloads lists every verified purchase: buyer name and e-mail, amount, PayPal transaction id, how many times the link was used, and when it expires. The three figures at the top are your totals.

9. Folder protection

PayDrop writes .htaccess, web.config and an empty index.html into your files folder, and shows the status above the product list. Green means direct downloads are blocked.

On nginx those files are ignored, and PayDrop tells you so. Add the rule to your server configuration instead:

location ^~ /files/ { deny all; }

You can check it yourself at any time: open the direct address of one of your files in a private browser window. It must return 403 Forbidden. If the file downloads, the folder is not protected.

10. Troubleshooting

The shortcode is printed as text

The Content – PayDrop plugin is disabled, or the page is cached from before you added it. Enable the plugin and clear the cache.

“Access forbidden” on the thank-you page

Expected when the page is opened without a valid token, and after PayDrop has cleaned the address. If it happens right after a real payment, check that the PayPal item number on the product matches what PayPal sent back, and that the PDT identity token is correct.

I changed the price, but PayPal still shows the old one

The buy button is part of the page HTML, so a cached page keeps the old price. Clear the cache in System → Clear Cache after changing a price, and check the page in a private browser window. The same applies when you change a product name or swap its file.

The buyer got no e-mail

Almost always the site mailer. Send a test mail from Global Configuration → Server → Mail, use SMTP, and make sure the From address matches the SMTP account. The download link is also shown on screen, so the sale is not lost.

Two buyers got the same file

This cannot happen on a current version — tokens are never written into cached HTML. If you see it, clear the Joomla cache and make sure you are on the latest release.

The download link stopped working

It expired, or it reached the download limit. Both are set in Options. You can raise the limits at any time; they apply to links issued afterwards.

11. Updates

Your purchase includes a licence key in the form SA-XXXX-XXXX-XXXX-XXXX. Enter it once:

  1. Go to System → Update → Update Sites.
  2. Click the PayDrop entry to open it.
  3. Paste the key into the Download Key field and save.

From then on System → Update → Extensions offers new versions exactly as it does for free extensions. If no update appears after a release, click Clear Cache on that screen first — Joomla caches update sites for a while.

Without a key the check still runs, but the download is refused: the packages are not public. Your installed copy keeps working either way — a lapsed licence only stops new versions.

Malware scanner documentation

com_malscan — Documentation

com_malscan is a backend malware scanning component for Joomla. It scans your site's files for known malicious code patterns, tracks changes against a baseline snapshot, and lets you quarantine or restore suspicious files — all from your Joomla admin panel.

1. Installation

  1. Go to System → Install → Extensions in your Joomla admin panel.
  2. Upload the com_malscan_v1.3.1.zip file you received after purchase.
  3. Once installed, find Malware Scanner in the left admin menu.

2. Generating a Baseline

Before your first scan, generate a baseline — a snapshot of your current file hashes, used to detect future changes.

  1. Go to Malware Scanner → Core.
  2. Click Generate / Reset Baseline.

Only generate a baseline when you're confident your site is currently clean — this snapshot becomes the reference point for detecting future tampering.

3. Running a Scan

  1. Go to Malware Scanner → Scan.
  2. Click Start Scan.
  3. The scan checks your files against:
    • Known malware/webshell signatures (e.g. injected eval/base64 code, known backdoor filenames)
    • Changes against your saved baseline
    • Known vulnerable extension versions installed on your site
  4. Progress is shown live; large sites are processed in batches to avoid timeouts.

4. Reviewing Findings

Go to Malware Scanner → Findings to see everything the scan flagged, with a severity rating (High / Medium) and a short description of what was matched and why.

5. Quarantine & Restore

From the Findings list, you can:

  • Quarantine a file — moves it out of its live location so it can no longer run, without permanently deleting it.
  • Restore a quarantined file — moves it back if it turns out to be a false positive.

6. Automatic Updates

com_malscan checks Joomla's built-in update system for new versions automatically. Update through System → Update → Extensions like any other component.

Requirements

  • Joomla 4.x or 5.x
  • MySQL-compatible database

Need Help?

See the product page for support contact details.

Thank you

Thank You for Your Purchase!

We truly appreciate your business. Your payment has been successfully processed. You will receive a confirmation email shortly.

If you have any questions or need assistance, feel free to contact us. Enjoy your purchase!

Terms of Service

Effective Date: [April 2025]

Welcome to Saint Art Designs. By using our website and services, you agree to comply with and be bound by the following Terms of Service. Please read these terms carefully before using our website and services.

1. Acceptance of Terms

By accessing or using the services provided by Saint Art Designs, you agree to comply with these Terms of Service and our Privacy Policy. If you do not agree with these terms, you should not use our services.

2. Services Provided

Saint Art Designs offers Joomla-based web design, development, and customization services. These services include, but are not limited to, website design, web development, website maintenance, and SEO services.

3. User Responsibilities

As a user of our services, you agree to:

  • Provide accurate and up-to-date information when contacting us or using our services.
  • Not engage in any unlawful activities or activities that could damage the website or its services.
  • Be responsible for any content you upload, publish, or display on your website created using our services.
  • Abide by all applicable local, state, and international laws when using our services.

4. Payment Terms

Payment for services is due according to the terms agreed upon in the service contract. Payments are accepted via the methods specified on our website or in the contract. Late payments may incur additional fees as specified in the service contract.

5. Client Content

You retain all rights to any content that you provide to us for use in the creation or management of your website. You grant Saint Art Designs a non-exclusive, worldwide license to use, store, and display your content as necessary for the performance of our services.

6. Intellectual Property

All designs, logos, and materials created by Saint Art Designs, including the website design and code, are the intellectual property of Saint Art Designs and may not be reproduced or used without our permission. The exception is the content you provide, for which you retain ownership.

7. Limitation of Liability

Saint Art Designs is not liable for any damages or losses resulting from the use or inability to use our website or services. We are not responsible for any indirect, incidental, or consequential damages, including data loss or interruption of business operations.

8. Privacy

Your privacy is important to us. Please refer to our Privacy Policy for details on how we collect, use, and protect your personal information.

9. Termination

We reserve the right to suspend or terminate access to our services at any time, without notice, if we believe you have violated these Terms of Service or for any other reason at our discretion. You may terminate your relationship with Saint Art Designs at any time by providing written notice. In such cases, any outstanding fees for services rendered will be due immediately.

10. Changes to Terms

We reserve the right to modify or replace these Terms of Service at any time. Changes will be posted on this page, and the “Effective Date” will be updated accordingly. It is your responsibility to review these terms periodically to stay informed about any changes.

11. Governing Law

These Terms of Service will be governed by and construed in accordance with the laws. Any disputes arising from these terms shall be resolved in the appropriate courts.

12. Contact Us

If you have any questions or concerns regarding these Terms of Service, please contact us at:

Saint Art Designs
Email: This email address is being protected from spambots. You need JavaScript enabled to view it.

Privacy Policy

Effective Date: [April 2025]

At Saint Art Designs, we respect and protect your privacy. This Privacy Policy explains how we collect, use, and safeguard your personal information when you visit our website or use our services. By using our website, you consent to the practices outlined in this Privacy Policy.

1. Information We Collect

We may collect the following types of information:

  • Personal Information: When you contact us, request services, or subscribe to our newsletter, we may collect personal details such as your name, email address, phone number, and any other information you provide.
  • Usage Data: We may collect information on how you access and use our website, such as your IP address, browser type, pages visited, and time spent on the site.
  • Cookies: Our website may use cookies to improve user experience. You can control the use of cookies through your browser settings.

2. How We Use Your Information

We use your personal information for the following purposes:

  • To communicate with you regarding our services or inquiries.
  • To improve our website and services based on your feedback and usage patterns.
  • To send promotional emails or newsletters (if you have opted in).
  • To process transactions and provide customer support.

3. Data Protection

We take the security of your personal information seriously. We implement appropriate technical and organizational measures to safeguard your data from unauthorized access, alteration, disclosure, or destruction. However, no data transmission over the internet is 100% secure, and we cannot guarantee the absolute security of your information.

4. Sharing Your Information

We do not sell or rent your personal information to third parties. However, we may share your information with trusted third-party service providers who assist us in operating our website, conducting business, or providing services to you. These third parties are obligated to protect your data and may not use it for any other purpose.

We may also disclose your information if required by law, to protect our rights or the safety of others.

5. GDPR Compliance

In accordance with the General Data Protection Regulation (GDPR), you have the following rights:

  • Right to Access: You have the right to request access to the personal data we hold about you.
  • Right to Rectification: You have the right to request corrections to any inaccurate or incomplete personal data we hold.
  • Right to Erasure: You have the right to request the deletion of your personal data under certain conditions.
  • Right to Restrict Processing: You have the right to request the restriction of processing your personal data under certain conditions.
  • Right to Object: You have the right to object to the processing of your personal data under certain conditions.
  • Right to Data Portability: You have the right to receive your personal data in a structured, commonly used format for transfer to another organization.
  • Right to Withdraw Consent: You have the right to withdraw your consent at any time, especially in relation to marketing communications.

To exercise any of these rights, please contact us at This email address is being protected from spambots. You need JavaScript enabled to view it..

6. Third-Party Links

Our website may contain links to third-party sites. We are not responsible for the privacy practices of these external sites. We encourage you to review the privacy policies of any third-party websites before sharing your personal information.

7. Children’s Privacy

Our website is not intended for individuals under the age of 13. We do not knowingly collect personal information from children. If we discover that we have collected personal data from a child, we will take steps to delete that information.

8. Changes to This Privacy Policy

We may update this Privacy Policy from time to time. When we make changes, we will update the “Effective Date” at the top of this page. We encourage you to periodically review this page for any updates.

9. Contact Us

If you have any questions or concerns about this Privacy Policy, please contact us at:

Saint Art Designs
Email: This email address is being protected from spambots. You need JavaScript enabled to view it.

About

Saint Art Designs is a freelance Joomla web developer specializing in modern, responsive, and secure websites.

  • Joomla Web Development Service
  • Joomla Web Design
  • Joomla Upgrade
  • Joomla SEO

Why Hire Me?

With over two decades of experience in Joomla development, I deliver high-quality, stable, and scalable websites.

Each project is approached with precision, clear communication, and a focus on long-term value.

Get a Quote

Online Profiles

Freelancer
Upwork
Linkedin
Facebook
Google Review

Contact Info