Skip to content

Add ionos-sync extension#26582

Open
wdeu wants to merge 6 commits intoraycast:mainfrom
wdeu:ext/ionos-sync
Open

Add ionos-sync extension#26582
wdeu wants to merge 6 commits intoraycast:mainfrom
wdeu:ext/ionos-sync

Conversation

@wdeu
Copy link
Copy Markdown

@wdeu wdeu commented Mar 23, 2026

Description

IONOS Sync lets you sync local web projects to your IONOS hosting server via rsync over SSH — without leaving Raycast or opening a terminal.
IONOS is the leading web hosting provider in the DACH region (Germany, Austria, Switzerland) with millions of customers. There is currently no Raycast extension for IONOS hosting workflows.

What it does:
Dry-run preview before every sync — see exactly what would change
Push and pull with streaming rsync output line by line
Per-project configuration: local path, remote path, excludes, --delete toggle
Automatic safety lock: --delete is disabled for root-level remotes (~/) to prevent accidental data loss
Last-sync timestamp per project (direction, mode, success/failure)
Default projects seeded on first run — works immediately after entering SSH credentials

Who it's for:
Web developers and freelancers in the DACH region who host on IONOS and want a fast, visual alternative to running rsync manually.

Screencast

screenshot-1 screenshot-3

Checklist

@raycastbot raycastbot added new extension Label for PRs with new extensions platform: macOS labels Mar 23, 2026
@raycastbot
Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 10-15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@wdeu wdeu marked this pull request as ready for review March 23, 2026 14:39
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Mar 23, 2026

Greptile Summary

This PR adds the ionos-sync extension, which lets users sync local web projects to an IONOS hosting server via rsync over SSH, with dry-run preview, push/pull, and per-project configuration — all from within Raycast. Previous review feedback has been addressed well: UI strings are now in English, the .prettierrc is present, personal seed projects and CLAUDE.md from DEFAULT_EXCLUDES have been removed, the automatic --delete safety lock for root-level remotes is correctly implemented in buildRsyncArgs, and the Preferences interface is no longer manually defined.

One reliability concern remains before merge:

  • JSON.parse without a try-catch in storage.ts:9 — a corrupt LocalStorage entry will throw an unhandled exception that both sync-project.tsx and manage-projects.tsx propagate silently, leaving the UI stuck in an infinite loading state. This is a straightforward fix.
  • Missing Action.OpenExtensionPreferences in the credentials-missing view — the user is instructed to press ⌘,, but no actions panel is rendered so the shortcut may not be reachable from within the view.

Confidence Score: 3/5

  • Safe to merge after fixing the unhandled JSON.parse in storage.ts, which can permanently break the extension for users with corrupted LocalStorage.
  • The extension is well-structured, prior concerns have been addressed, and the core sync logic is sound. The unhandled JSON.parse in storage.ts is a concrete reliability bug that will silently break the UI for any user whose storage becomes malformed — a low-probability but high-impact failure mode. It warrants a targeted fix before publishing.
  • extensions/ionos-sync/src/storage.ts — the bare JSON.parse needs a try-catch fallback.

Important Files Changed

Filename Overview
extensions/ionos-sync/src/storage.ts Storage layer with a bare JSON.parse that will throw an unhandled exception if LocalStorage data is ever corrupted, permanently breaking the extension for that user.
extensions/ionos-sync/src/rsync.ts Core rsync wrapper — safety lock for root-level remotes is now correctly implemented. SSH key path quoting and hardcoded PATH are minor but acceptable trade-offs for this use-case.
extensions/ionos-sync/src/sync-project.tsx Main sync command — UI strings are now in English and locale is system-default. The credentials-missing view lacks an Action.OpenExtensionPreferences shortcut. loadProjects rejections are unhandled in the useEffect.
extensions/ionos-sync/src/manage-projects.tsx Project management form — clean, English UI strings, correct validation. loadProjects rejection is unhandled in useEffect (same as sync-project.tsx).
extensions/ionos-sync/src/types.ts Type definitions and constants — personal paths and CLAUDE.md have been removed from DEFAULT_EXCLUDES; only standard patterns remain.
extensions/ionos-sync/package.json Extension manifest — correct categories, platforms, scripts, and preferences. .prettierrc is present in the extension root.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/ionos-sync/src/storage.ts
Line: 9

Comment:
**Unhandled `JSON.parse` can permanently brick the extension**

If the value stored in `LocalStorage` is ever malformed (e.g. truncated write, manual edit, or a future migration bug), `JSON.parse` will throw synchronously. Because `loadProjects` is called inside a bare `.then()` in both `sync-project.tsx` and `manage-projects.tsx` with no `.catch()`, the rejection propagates silently and `isLoading` is never set to `false`, leaving the user with a permanently spinning list they cannot escape from.

```suggestion
  let data: StorageData;
  try {
    data = JSON.parse(raw);
  } catch {
    return [];
  }
  return data.projects ?? [];
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/ionos-sync/src/sync-project.tsx
Line: 220-230

Comment:
**Missing `Action.OpenExtensionPreferences` in credentials-missing view**

When credentials are not set, the `Detail` view tells the user to press `⌘,` but provides no actions panel — so the keyboard shortcut may not work from within this view. Adding `Action.OpenExtensionPreferences` gives users a reliable one-click path to the settings screen.

```suggestion
    return (
      <Detail
        markdown={`# ⚠️ Credentials missing\n\nPlease open the **Extension Settings** and enter your host and username.\n\n\`⌘ + ,\` → IONOS Sync → Settings`}
        actions={
          <ActionPanel>
            <Action.OpenExtensionPreferences title="Open Extension Preferences" />
          </ActionPanel>
        }
      />
    );
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (3): Last reviewed commit: "fix: greptile review round 2" | Re-trigger Greptile

- fix: clean up uncommitted changes
- fix: address Greptile review feedback
- chore: add .gitignore, remove node_modules from tracking
@wdeu
Copy link
Copy Markdown
Author

wdeu commented Mar 23, 2026

@greptileai review

wdeu added 2 commits March 23, 2026 17:25
- chore: ignore .claude/ directory
- chore: update metadata screenshots
- fix: enforce root-remote safety lock in buildRsyncArgs
@wdeu
Copy link
Copy Markdown
Author

wdeu commented Mar 23, 2026

@greptileai review

@raycastbot
Copy link
Copy Markdown
Collaborator

This pull request has been automatically marked as stale because it did not have any recent activity.

It will be closed if no further activity occurs in the next 7 days to keep our backlog clean 😊

@raycastbot raycastbot added the status: stalled Stalled due inactivity label Apr 6, 2026
@wdeu
Copy link
Copy Markdown
Author

wdeu commented Apr 6, 2026

Still actively maintained and ready for review.

@raycastbot raycastbot removed the status: stalled Stalled due inactivity label Apr 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants