Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

feat: user configuration of editors by file extension#1197

Merged
lazysegtree merged 5 commits into
yorukot:mainyorukot/superfile:mainfrom
litvinov-git:configure-editors-by-file-extensionlitvinov-git/superfile:configure-editors-by-file-extensionCopy head branch name to clipboard
Dec 17, 2025
Merged

feat: user configuration of editors by file extension#1197
lazysegtree merged 5 commits into
yorukot:mainyorukot/superfile:mainfrom
litvinov-git:configure-editors-by-file-extensionlitvinov-git/superfile:configure-editors-by-file-extensionCopy head branch name to clipboard

Conversation

@litvinov-git

@litvinov-git litvinov-git commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

I added user configuration of default commands (apps/editors) to open files with specific file extensions.
In the very end of the config.toml, there is a table [open_with] containing entries of the format:

[open_with]
md = "obsidian"
xopp = "xournalpp"
txt = "gedit"

In config_type.go, this table is read as a string to string map:

// The table (map) for editor by file extension
	OpenWith map[string]string `toml:"open_with" comment:"\nCustom open commands by file extension."`

In handle_panel_movement.go, I changed the executeOpenCommand() function:

// opens the file with respective default editor
func (m *model) executeOpenCommand() {
	panel := m.getFocusedFilePanel()
	filePath := panel.element[panel.cursor].location

	openCommand := "xdg-open"
	switch runtime.GOOS {
	case utils.OsDarwin:
		openCommand = "open"
	case utils.OsWindows:
		dllpath := filepath.Join(os.Getenv("SYSTEMROOT"), "System32", "rundll32.exe")
		dllfile := "url.dll,FileProtocolHandler"

		cmd := exec.Command(dllpath, dllfile, filePath)

		err := cmd.Start()
		if err != nil {
			slog.Error("Error while open file with", "error", err)
		}

		return
	}

	// for now open_with works only for mac and linux

	// get the file extension, trim the dot and make it lowercase
	ext := filepath.Ext(filePath)
	ext = strings.ToLower(strings.TrimPrefix(ext, "."))

	ext_editor, ok := common.Config.OpenWith[ext]
	// If the extension is in the config table
	if ok {
		// change the command to the matching one from the config
		openCommand = ext_editor
	}

	cmd := exec.Command(openCommand, filePath)
	utils.DetachFromTerminal(cmd)
	err := cmd.Start()
	if err != nil {
		slog.Error("Error while open file with", "error", err)
	}
}

The comments are self-explanatory. I implemented the feature only for linux and mac, plan to do it for windows later (i dont know how cmd works there(( )

Tested on Arch Linux, works perfectly fine there. I dont have any other machines to test on unfortunately.

Why is this needed: xdg-open and other default openers do not properly recognize specific file types (like xournals xopp and such), also some people want to open toml and txt with different editors, but xdg-open would open them with the same one. There are other examples.

If you find any issues, please contact me. I am very eager to contribute and will fix anything)

Summary by CodeRabbit

  • New Features

    • Added per-extension "open with" support so users can map file extensions to custom open commands.
  • Documentation

    • Added documentation and a config example explaining the new [open_with] mapping and placement requirements.
  • Config

    • Introduced a new configuration section to store extension-to-command mappings.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitai Bot commented Dec 15, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

Adds a new per-extension open-command configuration. ConfigType gains an OpenWith map; the file-open handler applies extension-based overrides on non-Windows platforms; config and docs receive a new [open_with] section and example.

Changes

Cohort / File(s) Change Summary
Configuration Definition
src/internal/common/config_type.go
Added OpenWith map[string]string to ConfigType with TOML tag toml:"open_with" and comment describing custom open commands by extension.
Open Handler Implementation
src/internal/handle_panel_movement.go
Applied per-extension open-command override (non-Windows): extract extension, strip dot, lowercase via strings, and if present use common.Config.OpenWith[ext] before launching the command.
Config File Example
src/superfile_config/config.toml
Added new top-level [open_with] table with example entries (e.g., xopp = "xournalpp") and explanatory comments about placement and behavior.
Documentation
website/src/content/docs/configure/superfile-config.mdx
Added "open_with" documentation describing extension→command mapping, example TOML, and note about last-line placement in the config file.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10–15 minutes

  • Review extension extraction/normalization (dot removal, lowercase) and guard for empty/invalid extensions.
  • Verify non-Windows conditional and that Windows behavior remains unchanged.
  • Confirm TOML tag/serialization for OpenWith and that docs/example match actual behavior.

Poem

🐰 In fields of files I hop and peep,
Extensions whisper what to keep.
A map of commands beneath my paw,
I open swiftly — without a flaw.
Hooray for shortcuts, neat and small! 🥕✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly and clearly summarizes the main feature: user configuration of editors by file extension, which aligns with all changes in the PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 56a2d0d and 8ed7037.

📒 Files selected for processing (3)
  • src/internal/handle_panel_movement.go (2 hunks)
  • src/superfile_config/config.toml (1 hunks)
  • website/src/content/docs/configure/superfile-config.mdx (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • website/src/content/docs/configure/superfile-config.mdx
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/internal/handle_panel_movement.go
  • src/superfile_config/config.toml

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
src/superfile_config/config.toml (1)

149-158: Clarify open_with semantics and reconsider the “must be at end” note

The [open_with] table and example mapping are consistent with the new feature, but two small clarity tweaks might help:

  • Keys are interpreted as lowercased extensions without a leading dot (per executeOpenCommand), so explicitly saying “use bare, lowercase extensions like md, xopp, conf” here would avoid ambiguity.
  • The comment “MUST BE IN THE VERY END OF THE FILE BECAUSE TOML CANNOT CLOSE TABLES” is a bit strong; TOML tables don’t require an explicit close. If this is just a tooling or convention constraint, consider rephrasing so it doesn’t unnecessarily restrict adding future config fields after this section.
src/internal/handle_panel_movement.go (1)

70-105: Extension-based override looks correct; consider documenting/handling commands with args

The new open_with override logic is sound:

  • Uses filepath.Ext + strings.ToLower + TrimPrefix so lookups are case-insensitive and omit the dot.
  • Safe read from common.Config.OpenWith even when the map is nil.
  • Correctly leaves Windows behavior unchanged and applies overrides only on macOS/Linux.

One practical limitation: values like pdf = "zathura --fork" in the config won’t work as expected because exec.Command(openCommand, filePath) treats the entire string as the executable, not as ["zathura", "--fork"]. Only bare executable names (e.g. "zathura", "obsidian") are currently supported.

Two options:

  • Document this constraint in the config comments: “value must be a single executable name; arguments are not supported”.
  • Or, if you want to support simple arguments, parse the value into command + args before calling exec.Command, e.g.:
parts := strings.Fields(ext_editor)
if len(parts) > 0 {
    openCommand = parts[0]
    cmd := exec.Command(openCommand, append(parts[1:], filePath)...)
    // ...
}

This would make open_with more flexible without changing the external API.

src/internal/common/config_type.go (1)

68-71: Config wiring for OpenWith is good; clarify expected key format

The OpenWith map is correctly added and matches the [open_with] table in config.toml. To align with how executeOpenCommand normalizes extensions, consider tightening the comment to specify that:

  • Keys are file extensions without a leading dot, and
  • Matching is case-insensitive (keys are treated as lowercase).

E.g. “Custom open commands by file extension (keys are bare, lowercase extensions like md, xopp).”

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a12b862 and 56a2d0d.

📒 Files selected for processing (3)
  • src/internal/common/config_type.go (1 hunks)
  • src/internal/handle_panel_movement.go (4 hunks)
  • src/superfile_config/config.toml (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/internal/handle_panel_movement.go (1)
src/internal/common/default_config.go (1)
  • Config (11-11)
🔇 Additional comments (1)
src/internal/handle_panel_movement.go (1)

3-9: Import of strings is appropriate

The added strings import is correctly used for extension normalization in executeOpenCommand and keeps the import set minimal.

@litvinov-git litvinov-git changed the title Configure editors by file extension feat: user configuration of editors by file extension Dec 15, 2025
@booth-w

booth-w commented Dec 16, 2025

Copy link
Copy Markdown
Contributor

I don't really see what problem this is a solution to, when, if you want to change default app, it can be changed system/user-wide with xdg-mime default. For your problem of xdg-open not recognising .xopp files, I feel a more appropriate fix would be creating a mime type for it using xdg-mime install. This way, other programs will know how to open the file, too.

@litvinov-git

litvinov-git commented Dec 16, 2025

Copy link
Copy Markdown
Contributor Author

I don't really see what problem this is a solution to, when, if you want to change default app, it can be changed system/user-wide with xdg-mime default. For your problem of xdg-open not recognising .xopp files, I feel a more appropriate fix would be creating a mime type for it using xdg-mime install. This way, other programs will know how to open the file, too.

Implementing this feature was literally just as fast as creating a mime type. It is a basic file manager feature (nautilus has it and it does not generate new mime types, it just internally sets defaults). I saw many people asking for it as well.

Being user friendly is nice overall. You shouldnt even have to know what mime types are to be able to use superfile just like any other file manager.

@booth-w

booth-w commented Dec 16, 2025

Copy link
Copy Markdown
Contributor

Huh. I always thought nautilus and others changed the mime database -- didn't know it keeps a local one instead.

I think it would be nice to also be able to put either an extention or a mime type in the config. This way, people who are not familiar with them can put the extention, and other people can have a single definition for files like JPEGs instead of requiring one for .jpg and another for .jpeg.

@litvinov-git

Copy link
Copy Markdown
Contributor Author

Huh. I always thought nautilus and others changed the mime database -- didn't know it keeps a local one instead.

I think it would be nice to also be able to put either an extention or a mime type in the config. This way, people who are not familiar with them can put the extention, and other people can have a single definition for files like JPEGs instead of requiring one for .jpg and another for .jpeg.

Yeah i agree, I will do that if my PR gets merged. I added what was necessary for me as a user, anything past that would be in vain if the owner doesnt think its needed.

My vision for the complete feature is a separate keybind "open with", that would initiate a dialogue pop-up (like the one when creating a new item) with the following elements:

  1. Space for typing the opening command
  2. Checkbox "globally or locally"
  3. Open once
  4. Cancel

Local - would put this in the extension table in the config
Globally - creates a mime type for it in your system

@lazysegtree lazysegtree left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. This makes certain use cases easier.

@lazysegtree
lazysegtree requested a review from yorukot December 16, 2025 14:20
@lazysegtree

Copy link
Copy Markdown
Collaborator

@litvinov-git Let @yorukot check. I am good to merge it.

@litvinov-git

Copy link
Copy Markdown
Contributor Author

@litvinov-git Let @yorukot check. I am good to merge it.

Glad to hear that! Thank you for review and edtis

@lazysegtree
lazysegtree merged commit 7717cfb into yorukot:main Dec 17, 2025
8 of 11 checks passed
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jan 17, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [yorukot/superfile](https://github.com/yorukot/superfile) | minor | `v1.4.0` → `v1.5.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>yorukot/superfile (yorukot/superfile)</summary>

### [`v1.5.0`](https://github.com/yorukot/superfile/releases/tag/v1.5.0)

[Compare Source](yorukot/superfile@v1.4.0...v1.5.0)

This release brings major new features, including video and PDF preview support, multi-column file panels, and configurable navigation, alongside significant code refactoring and comprehensive bug fixes.

#### Install:

[**Click me to know how to install**](https://github.com/yorukot/superfile?tab=readme-ov-file#installation)

#### Highlights

- Added video and PDF preview support via loading the first frame/page as an image. Thanks [@&#8203;Yassen-Higazi](https://github.com/Yassen-Higazi) for the implementation

<details><summary>Screenshots</summary>
<p>

<img width="951" height="596" alt="image" src="https://github.com/user-attachments/assets/6edfa9c2-ebcd-4622-a115-f71fa533b3e1" />

<img width="949" height="594" alt="image" src="https://github.com/user-attachments/assets/8d15fa46-5178-422d-8eea-455cac31fdd0" />

</p>
</details>

- Multi-column file panel view with date/size/permission columns. Thanks [@&#8203;xelavopelk](https://github.com/xelavopelk) for the implementation

<details><summary>Screenshots</summary>
<p>

<img width="420" height="264" alt="image" src="https://github.com/user-attachments/assets/e172f1e8-c2a5-42d2-8eeb-62e721f61a4f" />

</p>
</details>

- Configurable fast navigation in the Filepanel. See this MR for more details: [#&#8203;1220](yorukot/superfile#1220)
- You can now configure `spf` to open files with specific extensions with your choice of editor application. Thanks  [@&#8203;litvinov-git](https://github.com/litvinov-git) for the implementation See this MR for more details: [#&#8203;1197](yorukot/superfile#1197)
- Terminal stdout support for shell commands
- Allow launching with the filename. `spf /a/b/c.txt` will launch in `/a/b` with `c.txt` as the selected file.
- Various bug fixes, including modal confirmations, layout issues, and race conditions. See 'Detailed Change Summary'

##### Internal Updates

- Separated FilePanel and FileModel into a dedicated package for better code organization
- Comprehensive end-to-end testing with layout fixes
- Enhanced dimension validation and sidebar fixes
- Updated multiple dependencies including Astro, Go toolchain, and linters
- Added gosec linter and MND linter with magic number cleanup

#### Detailed Change Summary

<details><summary>Details</summary>
<p>

##### Update
- allow hover to file [`#1177`](yorukot/superfile#1177) by @&#8203;lazysegtree
- show count selected items in select mode [`#1187`](yorukot/superfile#1187) by @&#8203;xelavopelk
- Add icon alias for kts to kt [`#1153`](yorukot/superfile#1153) by @&#8203;nicolaic
- link icon and metadata [`#1171`](yorukot/superfile#1171) by @&#8203;xelavopelk
- user configuration of editors by file extension [`#1197`](yorukot/superfile#1197) by @&#8203;litvinov-git
- add video preview support [`#1178`](yorukot/superfile#1178) by @&#8203;Yassen-Higazi
- Add pdf preview support [`#1198`](yorukot/superfile#1198) by @&#8203;Yassen-Higazi
- Add icons in pinned directories [`#1215`](yorukot/superfile#1215) by @&#8203;lazysegtree
- Enable fast configurable navigation [`#1220`](yorukot/superfile#1220) by @&#8203;lazysegtree
- add Trash bin to default directories for Linux [`#1236`](yorukot/superfile#1236) by @&#8203;lazysegtree
- add terminal stdout support for shell commands [`#1250`](yorukot/superfile#1250) by @&#8203;majiayu000
- More columns in file panel (MVP) [`#1268`](yorukot/superfile#1268) by @&#8203;xelavopelk

##### Bug Fix
- only calculate checksum on files [`#1119`](yorukot/superfile#1119) by @&#8203;nikero41
- Linter issue with PrintfAndExit [`#1133`](yorukot/superfile#1133) by @&#8203;xelavopelk
- Remove repeated os.ReadDir calls [`#1155`](yorukot/superfile#1155) by @&#8203;lazysegtree
- Disable COPYFILE in macOS [`#1194`](yorukot/superfile#1194) by @&#8203;lazysegtree
- add missing hotkeys to help menu [`#1192`](yorukot/superfile#1192) by @&#8203;lazysegtree
- Fetch latest version automatically [`#1127`](yorukot/superfile#1127) by @&#8203;lazysegtree
- Use async methods to prevent test race conditions [`#1201`](yorukot/superfile#1201) by @&#8203;lazysegtree
- update metadata and process bar sizes when toggling footer [`#1218`](yorukot/superfile#1218) by @&#8203;lazysegtree
- File panel dimension management [`#1222`](yorukot/superfile#1222) by @&#8203;lazysegtree
- Layout fixes with full end-to-end tests [`#1227`](yorukot/superfile#1227) by @&#8203;lazysegtree
- Fix flaky tests [`#1233`](yorukot/superfile#1233) by @&#8203;lazysegtree
- modal confirmation bug with arrow keys [`#1243`](yorukot/superfile#1243) by @&#8203;lazysegtree
- small file panel optimization [`#1241`](yorukot/superfile#1241) by @&#8203;xelavopelk
- use ExtractOperationMsg for extraction [`#1248`](yorukot/superfile#1248) by @&#8203;lazysegtree
- skip open_with from missing field validation [`#1251`](yorukot/superfile#1251) by @&#8203;lazysegtree
- border height validation fixes [`#1267`](yorukot/superfile#1267) by @&#8203;lazysegtree
- fix case with two active panes [`#1271`](yorukot/superfile#1271) by @&#8203;xelavopelk
- help model formatting [`#1277`](yorukot/superfile#1277) by @&#8203;booth-w

##### Optimization
- simplify renameIfDuplicate logic [`#1100`](yorukot/superfile#1100) by @&#8203;sarff
- separate FilePanel into dedicated package [`#1195`](yorukot/superfile#1195) by @&#8203;lazysegtree
- File model separation [`#1223`](yorukot/superfile#1223) by @&#8203;lazysegtree
- Dimension validations [`#1224`](yorukot/superfile#1224) by @&#8203;lazysegtree
- layout validation and sidebar dimension fixes [`#1228`](yorukot/superfile#1228) by @&#8203;lazysegtree
- user rendering package and removal of unused preview code [`#1245`](yorukot/superfile#1245) by @&#8203;lazysegtree
- user rendering package for file preview [`#1249`](yorukot/superfile#1249) by @&#8203;lazysegtree

##### Documentation
- update Fish shell setup docs [`#1142`](yorukot/superfile#1142) by @&#8203;wleoncio
- fix macOS typo [`#1212`](yorukot/superfile#1212) by @&#8203;wcbing
- stylistic and linguistic cleanup of config documentation [`#1184`](yorukot/superfile#1184) by @&#8203;ninetailedtori

##### Dependencies
- update astro monorepo [`#1010`](yorukot/superfile#1010) by @&#8203;renovate[bot]
- update starlight-giscus [`#1020`](yorukot/superfile#1020) by @&#8203;renovate[bot]
- bump astro versions [`#1138`](yorukot/superfile#1138), [`#1157`](yorukot/superfile#1157), [`#1158`](yorukot/superfile#1158) by @&#8203;dependabot[bot], @&#8203;renovate[bot]
- bump vite [`#1134`](yorukot/superfile#1134) by @&#8203;dependabot[bot]
- update setup-go action [`#1038`](yorukot/superfile#1038) by @&#8203;renovate[bot]
- update expressive-code plugins [`#1189`](yorukot/superfile#1189), [`#1246`](yorukot/superfile#1246) by @&#8203;renovate[bot]
- update sharp [`#1256`](yorukot/superfile#1256) by @&#8203;renovate[bot]
- update fontsource monorepo [`#1257`](yorukot/superfile#1257) by @&#8203;renovate[bot]
- update urfave/cli [`#1136`](yorukot/superfile#1136), [`#1190`](yorukot/superfile#1190) by @&#8203;renovate[bot]
- update astro / starlight / ansi / toolchain deps [`#1275`](yorukot/superfile#1275), [`#1278`](yorukot/superfile#1278), [`#1280`](yorukot/superfile#1280) by @&#8203;renovate[bot]
- update python and go versions [`#1276`](yorukot/superfile#1276), [`#1191`](yorukot/superfile#1191) by @&#8203;renovate[bot]
- update golangci-lint action [`#1286`](yorukot/superfile#1286) by @&#8203;renovate[bot]

##### Misc
- update CI input names [`#1120`](yorukot/superfile#1120) by @&#8203;nikero41
- Everforest Dark Hard theme [`#1114`](yorukot/superfile#1114) by @&#8203;fzahner
- migrate tutorial demo assets to local [`#1140`](yorukot/superfile#1140) by @&#8203;yorukot
- new logo asset [`#1145`](yorukot/superfile#1145) by @&#8203;nonepork
- mirror repository to codeberg [`#1141`](yorukot/superfile#1141) by @&#8203;yorukot
- sync package lock [`#1143`](yorukot/superfile#1143) by @&#8203;yorukot
- bump golangci-lint version [`#1135`](yorukot/superfile#1135) by @&#8203;lazysegtree
- add gosec linter [`#1185`](yorukot/superfile#1185) by @&#8203;lazysegtree
- enable MND linter and clean magic numbers [`#1180`](yorukot/superfile#1180) by @&#8203;lazysegtree
- skip permission tests when running as root [`#1186`](yorukot/superfile#1186) by @&#8203;lazysegtree
- release v1.4.1-rc [`#1203`](yorukot/superfile#1203) by @&#8203;lazysegtree
- 1.5.0-rc1 housekeeping changes [`#1264`](yorukot/superfile#1264) by @&#8203;lazysegtree

</p>
</details> 

#### New Contributors
* @&#8203;fzahner made their first contribution in yorukot/superfile#1114
* @&#8203;sarff made their first contribution in yorukot/superfile#1100
* @&#8203;nicolaic made their first contribution in yorukot/superfile#1153
* @&#8203;Yassen-Higazi made their first contribution in yorukot/superfile#1178
* @&#8203;ninetailedtori made their first contribution in yorukot/superfile#1184
* @&#8203;litvinov-git made their first contribution in yorukot/superfile#1197
* @&#8203;wcbing made their first contribution in yorukot/superfile#1212
* @&#8203;majiayu000 made their first contribution in yorukot/superfile#1250

**Full Changelog**: <yorukot/superfile@v1.4.0...v1.5.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44MC4xIiwidXBkYXRlZEluVmVyIjoiNDIuODAuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90IiwiYXV0b21hdGlvbjpib3QtYXV0aG9yZWQiLCJkZXBlbmRlbmN5LXR5cGU6Om1pbm9yIl19-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

Morty Proxy This is a proxified and sanitized view of the page, visit original site.