Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,25 +133,29 @@ See also [a list of milestones][milestones].

### v0.2.0 (Beta) - Released

* :nest_with_eggs: [Basic option (at minimum, the port of the GhostText server)](https://github.com/exteditor/ghostbird/issues/3)
* :nest_with_eggs: [Prepare for i18n (Make texts translatable)](https://github.com/exteditor/ghostbird/issues/4)
* :white_check_mark: [Basic option (at minimum, the port of the GhostText server)](https://github.com/exteditor/ghostbird/issues/3)
* :white_check_mark: [Prepare for i18n (Make texts translatable)](https://github.com/exteditor/ghostbird/issues/4)

### v0.2.1 (Beta) - Released

* :nest_with_eggs: [Fix empty host field being sent to the server](https://github.com/exteditor/ghostbird/issues/22)
* :white_check_mark: [Fix empty host field being sent to the server](https://github.com/exteditor/ghostbird/issues/22)

### v0.3.0 (Beta) - Current
### v0.3.0 (Beta) - Released

* :nest_with_eggs: [Show notifications](https://github.com/exteditor/ghostbird/issues/24)
* :nest_with_eggs: [Continue i18n (Add more languages)](https://github.com/exteditor/ghostbird/issues/26)

### v0.4.0 (Beta) - Current

* :nest_with_eggs: [Add a way to disconnect using only a mouse](https://github.com/exteditor/ghostbird/issues/30)

### v0.4.0 (Beta) - 2025 Q4
### v0.5.0 (Beta) - 2025 Q4

* :construction: [Add a way to disconnect using only a mouse](https://github.com/exteditor/ghostbird/issues/30)
* :construction: [Edit a HTML email as if it were a plain text email](https://github.com/exteditor/ghostbird/issues/6)

### v0.x.x (Beta) - 2025 Q4

* :construction: [Website with some screenshots](https://github.com/exteditor/ghostbird/issues/5)
* :construction: [Edit a HTML email as if it were a plain text email](https://github.com/exteditor/ghostbird/issues/6)

### v1.0.0 (Stable) - 2026 Q2

Expand All @@ -160,7 +164,6 @@ See also [a list of milestones][milestones].
### v1.x.x (Stable) - 2026 Q4

* :white_large_square: [Edit Address and Subject fields](https://github.com/exteditor/ghostbird/issues/8)
* :nest_with_eggs: [Continue i18n (Add more languages)](https://github.com/exteditor/ghostbird/issues/26)
* :white_large_square: [Support text editors that lack a GhostText add-on (e.g., Notepad)*](https://github.com/exteditor/ghostbird/issues/25)

> \*Requires protocol extension and server-side support. I intend to develop one by forking [GhostText-Any](https://github.com/newsch/GhostText-Any/).
Expand All @@ -184,7 +187,7 @@ See also [a list of milestones][milestones].

If you like the idea, please:

* [Star the repo](#repository-container-header).
* [Star the repo](https://github.com/exteditor/ghostbird/#repository-container-header).
* [Rate the add-on][review].
* Feel free to open issues and submit pull requests. See [CONTRIBUTING.md](./CONTRIBUTING.md) to get started.
* See our [milestones page][milestones] or [issues](https://github.com/exteditor/ghostbird/issues) for tasks you can contribute to, and use the [Discussions](https://github.com/exteditor/ghostbird/discussions) page for general discussions.
Expand Down Expand Up @@ -232,7 +235,7 @@ We need help with:

Please consider the following options:

* [Star the repo](#repository-container-header)
* [Star the repo](https://github.com/exteditor/ghostbird/#repository-container-header)
* [Rate the add-on][review]
* [Donate to Thunderbird](https://www.thunderbird.net/en-US/donate/) (It's financially separate from Firefox)
* [Donate to @fregante, the author of the original GhostText](https://github.com/sponsors/fregante)
Expand Down Expand Up @@ -261,6 +264,7 @@ If you've looked at the options above and still want to motivate the maintainer
[![Github Actions Status](https://github.com/exteditor/ghostbird/actions/workflows/build.yml/badge.svg)](https://github.com/exteditor/ghostbird/actions/workflows/build.yml)
[![Reviewed by CodeRabbit](https://img.shields.io/coderabbit/prs/github/exteditor/ghostbird?utm_source=oss&utm_medium=github&utm_campaign=exteditor%2Fghostbird&color=FF570A&link=https%3A%2F%2Fcoderabbit.ai&label=CodeRabbit+Reviews&logo=coderabbit&logoSize=auto)](https://github.com/search?q=repo%3Aexteditor%2Fghostbird&type=pullrequests&s=created&o=desc)
[![Covered by Codecov](https://codecov.io/github/exteditor/ghostbird/graph/badge.svg?token=NDWAK8NEC6)](https://app.codecov.io/github/exteditor/ghostbird/commits)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/exteditor/ghostbird)

## License

Expand Down
2 changes: 1 addition & 1 deletion doc/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ This is how user actions are handled:
* [Barrelsby](https://github.com/bencoveney/barrelsby) generates `index.ts`.
* See [building.md](./building.md) for details on build script internals.

## Structure of the code<a name="structure"></a>
## Structure of the code<a id="structure"></a>

The code loosely follows the [Ports and Adapters architecture](https://8thlight.com/insights/a-color-coded-guide-to-ports-and-adapters) and adheres to the [Dependency Inversion Principle](https://en.wikipedia.org/wiki/Dependency_inversion_principle).
* Interface implementations are preferred over class inheritance.
Expand Down
4 changes: 2 additions & 2 deletions doc/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

* Try searching the GitHub pages like [discussion][discussion], [wiki][wiki], and [issue][issue] pages. Please post to the [discussion][discussion] or [issue][issue] page if you don't find anything relevant.

### How do I switch between HTML mode and Plain Text mode?<a name="mode"></a>
### How do I switch between HTML mode and Plain Text mode?<a id="mode"></a>

> TL;DR: Set your preferred format in `Account Settings`>`Composition & Addressing`, then start a new message.

Expand Down Expand Up @@ -71,7 +71,7 @@
* As for the icon, I'm planning to add an option to choose between icons so that you can switch them. Please upvote [the issue][chooseicon] if it bothers you.
* New icons are welcome, of course, preferably in SVG.

### Why not just fork the original GhostText add-on, or contribute to it?<a name="why"></a>
### Why not just fork the original GhostText add-on, or contribute to it?<a id="why"></a>

* I have a specific requirement to extend [the GhostText protocol][protocol] on both the client and server sides, which would allow configuration made in the client UI to be sent to the server. I think the original add-on, which is supposed to be simple, is not suitable for that purpose.
* Thunderbird-specific changes also seem hard to incorporate without complicating the code. For example, the concepts of a compose window and address lines do not exist in browsers.
Expand Down
10 changes: 6 additions & 4 deletions src/util/time.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
export interface Disposable {
[Symbol.dispose]: () => void
}

/**
* Starts a timer and returns a Disposable that logs the elapsed time when disposed. Intended to use it with `using` statements.
*
* @param label Text used as the message label when logging the elapsed time
* @returns A Disposable which logs the elapsed time in milliseconds when disposed
*/
export function time(label: string): Disposable {
const start = performance.now()
return {
Expand Down
4 changes: 2 additions & 2 deletions tools/tsdown_path.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ export function makeRelativeSourcePath(relativeSourcePath: string): string {
// For release builds, we strip the path to make it easier to navigate in Thunderbird devtools
let libPath = findPrefix("/node_modules/", relativeSourcePath)
if (libPath) {
return libPath.slice(1)
return `.${libPath}`
}
let srcPath = findPrefix("/src/", relativeSourcePath)
if (srcPath) {
// Make it relative to the root
return `../${srcPath.slice(1)}`
return `..${srcPath}`
}
throw Error(`unexpected source path: ${relativeSourcePath}`)
}
Expand Down