From 306ba25c38f864280c9f78a06816d713f1113416 Mon Sep 17 00:00:00 2001
From: erikjohnston
To enable this, first create templates for the policy and success pages. These should be stored on the local filesystem.
These templates use the Jinja2 templating language, -and docs/privacy_policy_templates +and docs/privacy_policy_templates gives examples of the sort of thing that can be done.
Note that the templates must be stored under a name giving the language of the
template - currently this must always be Note how the commit comment explains clearly what is changing and why. Also
note the absence of merge commits, as well as the absence of commits called
things like (to pick a few culprits):
-“pep8”, “fix broken
+“pep8”, “fix broken
test”,
-“oops”,
-“typo”, or “Who's
+“oops”,
+“typo”, or “Who's
the president?”. There are a number of reasons why keeping a clean commit history is a good
thing: Synapse has a concept of "streams", which are roughly described in Synapse has a concept of "streams", which are roughly described in en
(for "English");
diff --git a/develop/development/git.html b/develop/development/git.html
index cd675a4207..854bb64b23 100644
--- a/develop/development/git.html
+++ b/develop/development/git.html
@@ -168,10 +168,10 @@ before. Here, by way of an arbitrary example, is the top of git log --grap
Streams
-id_generators.py
.
+id_generators.py
.
Generally speaking, streams are a series of notifications that something in Synapse's database has changed that the application might need to respond to.
For example:
@@ -168,9 +168,9 @@ For example:
See synapse.replication.tcp.streams
for the full list of streams.
See synapse.replication.tcp.streams
for the full list of streams.
It is very helpful to understand the streams mechanism when working on any part of Synapse that needs to respond to changes—especially if those changes are made by different workers.
-To that end, let's describe streams formally, paraphrasing from the docstring of AbstractStreamIdGenerator
.
AbstractStreamIdGenerator
.
A stream is an append-only log T1, T2, ..., Tn, ...
of facts1 which grows over time.
Only "writers" can add facts to a stream, and there may be multiple writers.
Read the Contributing Guide. It is meant to walk new contributors through the process of developing and submitting a -change to the Synapse codebase (which is hosted on +change to the Synapse codebase (which is hosted on GitHub).
Look at the issue tracker for +
Look at the issue tracker for bugs to fix or features to add. If you're new, it may be best to start with -those labeled good first +those labeled good first issue.
And finally, contribute to this documentation! The source for which is -located here.
+located here.metrics
resource.
Restart Prometheus.
Consider using the grafana dashboard -and required recording rules
+Consider using the grafana dashboard +and required recording rules
synapse.module_api.ModuleApi
class. The configuration is a dict
either the output of the module's parse_config
static method (see below), or the
configuration associated with the module in Synapse's configuration file.
See the documentation for the ModuleApi
class
-here.
If Synapse is running with other modules configured, the order each module appears in
within the modules
section of the Synapse configuration file might restrict what it can
diff --git a/develop/print.html b/develop/print.html
index 599fd0e164..c267fcf4ed 100644
--- a/develop/print.html
+++ b/develop/print.html
@@ -198,7 +198,7 @@ following documentation:
Read the Contributing Guide. It is meant to walk new contributors through the process of developing and submitting a -change to the Synapse codebase (which is hosted on +change to the Synapse codebase (which is hosted on GitHub).
Look at the issue tracker for +
Look at the issue tracker for bugs to fix or features to add. If you're new, it may be best to start with -those labeled good first +those labeled good first issue.
And finally, contribute to this documentation! The source for which is -located here.
+located here.As announced with the release of Synapse 1.47.0,
the deprecated user_may_create_room_with_invites
module callback has been removed.
Modules relying on it can instead implement user_may_invite
-and use the get_room_state
+and use the get_room_state
module API to infer whether the invite is happening while creating a room (see this function
as an example). Alternately, modules can also implement on_create_room
.
The user_may_create_room_with_invites
is deprecated and will be removed in a future
version of Synapse. Modules implementing this callback can instead implement
user_may_invite
-and use the get_room_state
+and use the get_room_state
module API method to infer whether the invite is happening in the context of creating a
room.
We plan to remove this callback in January 2022.
@@ -2573,8 +2573,8 @@ federation requests. Delete Room API.This may affect you if you make use of custom HTML templates for the
-reCAPTCHA (synapse/res/templates/recaptcha.html
) or
-terms (synapse/res/templates/terms.html
) fallback pages.
synapse/res/templates/recaptcha.html
) or
+terms (synapse/res/templates/terms.html
) fallback pages.
The template is now provided an error
variable if the authentication
process failed. See the default templates linked above for an example.
A new HTML template,
-password_reset_confirmation.html,
+password_reset_confirmation.html,
has been added to the synapse/res/templates
directory. If you are
using a custom template directory, you may want to copy the template
over and modify it.
sso_redirect_confirm_template_dir
configuration then these templates
will need to be copied from
-synapse/res/templates
into that directory.
+synapse/res/templates
into that directory.
Plugins using the complete_sso_login
method of
synapse.module_api.ModuleApi
should update to using the async/await
@@ -3169,7 +3169,7 @@ included.
Synapse will expect these files to exist inside the configured template directory, and will fail to start if they are absent. To view the default templates, see -synapse/res/templates.
+synapse/res/templates.Note: As of this release, users will be unable to add phone numbers or
email addresses to their accounts, without changes to the Synapse
@@ -4933,7 +4933,7 @@ caches:
If you are running multiple workers, you must individually update the worker
config file and send this signal to each worker process. If you're using the example systemd service
+ If you're using the example systemd service
file in Synapse's contrib
directory, you can send a SIGHUP
signal by using
systemctl reload matrix-synapse
.
@@ -7823,7 +7823,7 @@ remote endpoint at 10.1.2.3:9999.
Synapse uses parametrised templates to generate the content of emails it sends and webpages it shows to users.
-By default, Synapse will use the templates listed here. +
By default, Synapse will use the templates listed here. Server admins can configure an additional directory for Synapse to look for templates in, allowing them to specify custom templates:
templates:
@@ -8902,7 +8902,7 @@ usually returned as part of the Default OpenID Mapping Provider
Synapse has a built-in OpenID mapping provider if a custom provider isn't
specified in the config. It is located at
-synapse.handlers.oidc.JinjaOidcMappingProvider
.
+synapse.handlers.oidc.JinjaOidcMappingProvider
.
SAML Mapping Providers
The SAML mapping provider can be customized by editing the
saml2_config.user_mapping_provider.module
@@ -9017,7 +9017,7 @@ complete registration using methods from the ModuleApi
.
Default SAML Mapping Provider
Synapse has a built-in SAML mapping provider if a custom provider isn't
specified in the config. It is located at
-synapse.handlers.saml.DefaultSamlMappingProvider
.
+synapse.handlers.saml.DefaultSamlMappingProvider
.
This page of the Synapse documentation is now deprecated. For up to date
documentation on setting up or writing a password auth provider module, please see
@@ -9477,7 +9477,7 @@ database and shows a success page.
To enable this, first create templates for the policy and success pages.
These should be stored on the local filesystem.
These templates use the Jinja2 templating language,
-and docs/privacy_policy_templates
+and docs/privacy_policy_templates
gives examples of the sort of thing that can be done.
Note that the templates must be stored under a name giving the language of the
template - currently this must always be en
(for "English");
@@ -9958,7 +9958,7 @@ the synapse.module_api.ModuleApi
class. The configuration is a dict
either the output of the module's parse_config
static method (see below), or the
configuration associated with the module in Synapse's configuration file.
See the documentation for the ModuleApi
class
-here.
+here.
When Synapse runs with several modules configured
If Synapse is running with other modules configured, the order each module appears in
within the modules
section of the Synapse configuration file might restrict what it can
@@ -11983,9 +11983,9 @@ managing workers. It provides a matrix-synapse
service for the mast
well as a matrix-synapse-worker@
service template for any workers you
require. Additionally, to group the required services, it sets up a
matrix-synapse.target
.
-See the folder system
+
See the folder system
for the systemd unit files.
-The folder workers
+
The folder workers
contains an example configuration for the generic_worker
worker.
Synapse configuration files
See the worker documentation for information on how to set up the
@@ -12012,7 +12012,7 @@ the provided *.service
files accordingly.
Set up
- Adjust synapse configuration files as above.
-- Copy the
*.service
and *.target
files in system
+ - Copy the
*.service
and *.target
files in system
to /etc/systemd/system
.
- Run
systemctl daemon-reload
to tell systemd to load the new unit files.
- Run
systemctl enable matrix-synapse.service
. This will configure the
@@ -12047,7 +12047,7 @@ systemctl restart matrix-synapse.target
Hardening
Optional: If further hardening is desired, the file
override-hardened.conf
may be copied from
-contrib/systemd/override-hardened.conf
+contrib/systemd/override-hardened.conf
in this repository to the location
/etc/systemd/system/matrix-synapse.service.d/override-hardened.conf
(the
directory may have to be created). It enables certain sandboxing features in
@@ -15608,8 +15608,8 @@ the listener port configured with the metrics
resource.
Restart Prometheus.
-
-
Consider using the grafana dashboard
-and required recording rules
+Consider using the grafana dashboard
+and required recording rules
Monitoring workers
@@ -15938,11 +15938,11 @@ registered accounts on the homeserver.
It is possible to monitor much of the internal state of Synapse using Prometheus
metrics and Grafana.
A guide for configuring Synapse to provide metrics is available here
-and information on setting up Grafana is here.
+and information on setting up Grafana is here.
In this setup, Prometheus will periodically scrape the information Synapse provides and
store a record of it over time. Grafana is then used as an interface to query and
present this information through a series of pretty graphs.
-Once you have grafana set up, and assuming you're using our grafana dashboard template, look for the following graphs when debugging a slow/overloaded Synapse:
+Once you have grafana set up, and assuming you're using our grafana dashboard template, look for the following graphs when debugging a slow/overloaded Synapse:
Message Event Send Time
This, along with the CPU and Memory graphs, is a good way to check the general health of your Synapse instance. It represents how long it takes for a user on your homeserver to send a message.
@@ -15969,7 +15969,7 @@ present this information through a series of pretty graphs.
This is quite a useful graph. It shows how many times Synapse attempts to retrieve a piece of data from a cache which the cache did not contain, thus resulting in a call to the database. We can see here that the _get_joined_profile_from_event_id
cache is being requested a lot, and often the data we're after is not cached.
Cross-referencing this with the Eviction Rate graph, which shows that entries are being evicted from _get_joined_profile_from_event_id
quite often:
-we should probably consider raising the size of that cache by raising its cache factor (a multiplier value for the size of an individual cache). Information on doing so is available here (note that the configuration of individual cache factors through the configuration file is available in Synapse v1.14.0+, whereas doing so through environment variables has been supported for a very long time). Note that this will increase Synapse's overall memory usage.
+we should probably consider raising the size of that cache by raising its cache factor (a multiplier value for the size of an individual cache). Information on doing so is available here (note that the configuration of individual cache factors through the configuration file is available in Synapse v1.14.0+, whereas doing so through environment variables has been supported for a very long time). Note that this will increase Synapse's overall memory usage.
Forward Extremities
Forward extremities are the leaf events at the end of a DAG in a room, aka events that have no children. The more that exist in a room, the more state resolution that Synapse needs to perform (hint: it's an expensive operation). While Synapse has code to prevent too many of these existing at one time in a room, bugs can sometimes make them crop up again.
@@ -16180,7 +16180,7 @@ WHERE room_stats_state.room_id = event_json.room_id" | psql -d synapse -h l
Compression tool
There is a tool at https://github.com/matrix-org/rust-synapse-compress-state which can compress the state_groups_state
on a room by-room basis (essentially, it reduces the number of "full" state groups). This can result in dramatic reductions of the storage used.
Request log format
-HTTP request logs are written by synapse (see synapse/http/site.py
for details).
+HTTP request logs are written by synapse (see synapse/http/site.py
for details).
See the following for how to decode the dense data available from the default logging configuration.
2020-10-01 12:00:00,000 - synapse.access.http.8008 - 311 - INFO - PUT-1000- 192.168.0.1 - 8008 - {another-matrix-server.com} Processed request: 0.100sec/-0.000sec (0.000sec, 0.000sec) (0.001sec/0.090sec/3) 11B !200 "PUT /_matrix/federation/v1/send/1600000000000 HTTP/1.1" "Synapse/1.20.1" [0 dbevts]
-AAAAAAAAAAAAAAAAAAAAA- -BBBBBBBBBBBBBBBBBBBBBB- -C- -DD- -EEEEEE- -FFFFFFFFF- -GG- -HHHHHHHHHHHHHHHHHHHHHHH- -IIIIII- -JJJJJJJ- -KKKKKK-, -LLLLLL- -MMMMMMM- -NNNNNN- O -P- -QQ- -RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR- -SSSSSSSSSSSS- -TTTTTT-
@@ -17065,10 +17065,10 @@ before. Here, by way of an arbitrary example, is the top of git log --grap
Note how the commit comment explains clearly what is changing and why. Also
note the absence of merge commits, as well as the absence of commits called
things like (to pick a few culprits):
-“pep8”, “fix broken
+“pep8”, “fix broken
test”,
-“oops”,
-“typo”, or “Who's
+“oops”,
+“typo”, or “Who's
the president?”.
There are a number of reasons why keeping a clean commit history is a good
thing:
@@ -18544,7 +18544,7 @@ minimal.
the classes interact, can be found in
synapse/replication/tcp/__init__.py
Streams
-Synapse has a concept of "streams", which are roughly described in id_generators.py
.
+
Synapse has a concept of "streams", which are roughly described in id_generators.py
.
Generally speaking, streams are a series of notifications that something in Synapse's database has changed that the application might need to respond to.
For example:
@@ -18552,9 +18552,9 @@ For example:
- The account data stream reports changes to users' account data.
- The to-device stream reports when a device has a new to-device message.
-See synapse.replication.tcp.streams
for the full list of streams.
+See synapse.replication.tcp.streams
for the full list of streams.
It is very helpful to understand the streams mechanism when working on any part of Synapse that needs to respond to changes—especially if those changes are made by different workers.
-To that end, let's describe streams formally, paraphrasing from the docstring of AbstractStreamIdGenerator
.
+To that end, let's describe streams formally, paraphrasing from the docstring of AbstractStreamIdGenerator
.
Definition
A stream is an append-only log T1, T2, ..., Tn, ...
of facts1 which grows over time.
Only "writers" can add facts to a stream, and there may be multiple writers.
diff --git a/develop/sso_mapping_providers.html b/develop/sso_mapping_providers.html
index 1081f5d053..78b8d7f8f3 100644
--- a/develop/sso_mapping_providers.html
+++ b/develop/sso_mapping_providers.html
@@ -300,7 +300,7 @@ usually returned as part of the Default OpenID Mapping Provider
Synapse has a built-in OpenID mapping provider if a custom provider isn't
specified in the config. It is located at
-synapse.handlers.oidc.JinjaOidcMappingProvider
.
+synapse.handlers.oidc.JinjaOidcMappingProvider
.
SAML Mapping Providers
The SAML mapping provider can be customized by editing the
saml2_config.user_mapping_provider.module
@@ -415,7 +415,7 @@ complete registration using methods from the ModuleApi
.
Default SAML Mapping Provider
Synapse has a built-in SAML mapping provider if a custom provider isn't
specified in the config. It is located at
-synapse.handlers.saml.DefaultSamlMappingProvider
.
+synapse.handlers.saml.DefaultSamlMappingProvider
.
diff --git a/develop/systemd-with-workers/index.html b/develop/systemd-with-workers/index.html
index 7fb197be27..4061654a3b 100644
--- a/develop/systemd-with-workers/index.html
+++ b/develop/systemd-with-workers/index.html
@@ -165,9 +165,9 @@ managing workers. It provides a matrix-synapse
service for the mast
well as a matrix-synapse-worker@
service template for any workers you
require. Additionally, to group the required services, it sets up a
matrix-synapse.target
.
-See the folder system
+
See the folder system
for the systemd unit files.
-The folder workers
+
The folder workers
contains an example configuration for the generic_worker
worker.
Synapse configuration files
See the worker documentation for information on how to set up the
@@ -194,7 +194,7 @@ the provided *.service
files accordingly.
Set up
- Adjust synapse configuration files as above.
-- Copy the
*.service
and *.target
files in system
+ - Copy the
*.service
and *.target
files in system
to /etc/systemd/system
.
- Run
systemctl daemon-reload
to tell systemd to load the new unit files.
- Run
systemctl enable matrix-synapse.service
. This will configure the
@@ -229,7 +229,7 @@ systemctl restart matrix-synapse.target
Hardening
Optional: If further hardening is desired, the file
override-hardened.conf
may be copied from
-contrib/systemd/override-hardened.conf
+contrib/systemd/override-hardened.conf
in this repository to the location
/etc/systemd/system/matrix-synapse.service.d/override-hardened.conf
(the
directory may have to be created). It enables certain sandboxing features in
diff --git a/develop/templates.html b/develop/templates.html
index 4c5b1bdb21..00f6d621df 100644
--- a/develop/templates.html
+++ b/develop/templates.html
@@ -162,7 +162,7 @@
Templates
Synapse uses parametrised templates to generate the content of emails it sends and
webpages it shows to users.
-By default, Synapse will use the templates listed here.
+
By default, Synapse will use the templates listed here.
Server admins can configure an additional directory for Synapse to look for templates
in, allowing them to specify custom templates:
templates:
diff --git a/develop/upgrade.html b/develop/upgrade.html
index f00194b71f..b76caa81e8 100644
--- a/develop/upgrade.html
+++ b/develop/upgrade.html
@@ -955,7 +955,7 @@ becomes stable.
As announced with the release of Synapse 1.47.0,
the deprecated user_may_create_room_with_invites
module callback has been removed.
Modules relying on it can instead implement user_may_invite
-and use the get_room_state
+and use the get_room_state
module API to infer whether the invite is happening while creating a room (see this function
as an example). Alternately, modules can also implement on_create_room
.
Upgrading to v1.52.0
@@ -992,7 +992,7 @@ longer supported upstream.
The user_may_create_room_with_invites
is deprecated and will be removed in a future
version of Synapse. Modules implementing this callback can instead implement
user_may_invite
-and use the get_room_state
+and use the get_room_state
module API method to infer whether the invite is happening in the context of creating a
room.
We plan to remove this callback in January 2022.
@@ -1025,8 +1025,8 @@ federation requests.
Delete Room API.
User-interactive authentication fallback templates can now display errors
This may affect you if you make use of custom HTML templates for the
-reCAPTCHA (synapse/res/templates/recaptcha.html
) or
-terms (synapse/res/templates/terms.html
) fallback pages.
+reCAPTCHA (synapse/res/templates/recaptcha.html
) or
+terms (synapse/res/templates/terms.html
) fallback pages.
The template is now provided an error
variable if the authentication
process failed. See the default templates linked above for an example.
Removal of out-of-date email pushers
@@ -1410,7 +1410,7 @@ endpoint can be handled
update your reverse proxy configuration to reflect this change.
New HTML templates
A new HTML template,
-password_reset_confirmation.html,
+password_reset_confirmation.html,
has been added to the synapse/res/templates
directory. If you are
using a custom template directory, you may want to copy the template
over and modify it.
@@ -1490,7 +1490,7 @@ INSERT INTO background_updates (update_name, progress_json, depends_on) VALUES
is configured to use SSO and a custom
sso_redirect_confirm_template_dir
configuration then these templates
will need to be copied from
-synapse/res/templates
into that directory.
+synapse/res/templates
into that directory.
Synapse SSO Plugins Method Deprecation
Plugins using the complete_sso_login
method of
synapse.module_api.ModuleApi
should update to using the async/await
@@ -1621,7 +1621,7 @@ included.
Synapse will expect these files to exist inside the configured template
directory, and will fail to start if they are absent. To view the
default templates, see
-synapse/res/templates.
+synapse/res/templates.
3pid verification changes
Note: As of this release, users will be unable to add phone numbers or
email addresses to their accounts, without changes to the Synapse
diff --git a/develop/usage/administration/request_log.html b/develop/usage/administration/request_log.html
index e426f8a613..ca966d58ae 100644
--- a/develop/usage/administration/request_log.html
+++ b/develop/usage/administration/request_log.html
@@ -160,7 +160,7 @@
Request log format
-HTTP request logs are written by synapse (see synapse/http/site.py
for details).
+HTTP request logs are written by synapse (see synapse/http/site.py
for details).
See the following for how to decode the dense data available from the default logging configuration.
2020-10-01 12:00:00,000 - synapse.access.http.8008 - 311 - INFO - PUT-1000- 192.168.0.1 - 8008 - {another-matrix-server.com} Processed request: 0.100sec/-0.000sec (0.000sec, 0.000sec) (0.001sec/0.090sec/3) 11B !200 "PUT /_matrix/federation/v1/send/1600000000000 HTTP/1.1" "Synapse/1.20.1" [0 dbevts]
-AAAAAAAAAAAAAAAAAAAAA- -BBBBBBBBBBBBBBBBBBBBBB- -C- -DD- -EEEEEE- -FFFFFFFFF- -GG- -HHHHHHHHHHHHHHHHHHHHHHH- -IIIIII- -JJJJJJJ- -KKKKKK-, -LLLLLL- -MMMMMMM- -NNNNNN- O -P- -QQ- -RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR- -SSSSSSSSSSSS- -TTTTTT-
diff --git a/develop/usage/administration/understanding_synapse_through_grafana_graphs.html b/develop/usage/administration/understanding_synapse_through_grafana_graphs.html
index 051d85c464..11c85d56b1 100644
--- a/develop/usage/administration/understanding_synapse_through_grafana_graphs.html
+++ b/develop/usage/administration/understanding_synapse_through_grafana_graphs.html
@@ -163,11 +163,11 @@
It is possible to monitor much of the internal state of Synapse using Prometheus
metrics and Grafana.
A guide for configuring Synapse to provide metrics is available here
-and information on setting up Grafana is here.
+and information on setting up Grafana is here.
In this setup, Prometheus will periodically scrape the information Synapse provides and
store a record of it over time. Grafana is then used as an interface to query and
present this information through a series of pretty graphs.
-Once you have grafana set up, and assuming you're using our grafana dashboard template, look for the following graphs when debugging a slow/overloaded Synapse:
+Once you have grafana set up, and assuming you're using our grafana dashboard template, look for the following graphs when debugging a slow/overloaded Synapse:
Message Event Send Time
This, along with the CPU and Memory graphs, is a good way to check the general health of your Synapse instance. It represents how long it takes for a user on your homeserver to send a message.
@@ -194,7 +194,7 @@ present this information through a series of pretty graphs.
This is quite a useful graph. It shows how many times Synapse attempts to retrieve a piece of data from a cache which the cache did not contain, thus resulting in a call to the database. We can see here that the _get_joined_profile_from_event_id
cache is being requested a lot, and often the data we're after is not cached.
Cross-referencing this with the Eviction Rate graph, which shows that entries are being evicted from _get_joined_profile_from_event_id
quite often:
-we should probably consider raising the size of that cache by raising its cache factor (a multiplier value for the size of an individual cache). Information on doing so is available here (note that the configuration of individual cache factors through the configuration file is available in Synapse v1.14.0+, whereas doing so through environment variables has been supported for a very long time). Note that this will increase Synapse's overall memory usage.
+we should probably consider raising the size of that cache by raising its cache factor (a multiplier value for the size of an individual cache). Information on doing so is available here (note that the configuration of individual cache factors through the configuration file is available in Synapse v1.14.0+, whereas doing so through environment variables has been supported for a very long time). Note that this will increase Synapse's overall memory usage.
Forward Extremities
Forward extremities are the leaf events at the end of a DAG in a room, aka events that have no children. The more that exist in a room, the more state resolution that Synapse needs to perform (hint: it's an expensive operation). While Synapse has code to prevent too many of these existing at one time in a room, bugs can sometimes make them crop up again.
diff --git a/develop/usage/configuration/config_documentation.html b/develop/usage/configuration/config_documentation.html
index 02fb965b31..f0c18150a6 100644
--- a/develop/usage/configuration/config_documentation.html
+++ b/develop/usage/configuration/config_documentation.html
@@ -1367,7 +1367,7 @@ caches:
If you are running multiple workers, you must individually update the worker
config file and send this signal to each worker process.
-If you're using the example systemd service
+
If you're using the example systemd service
file in Synapse's contrib
directory, you can send a SIGHUP
signal by using
systemctl reload matrix-synapse
.
diff --git a/develop/welcome_and_overview.html b/develop/welcome_and_overview.html
index ee4408d5a2..3000c91d2b 100644
--- a/develop/welcome_and_overview.html
+++ b/develop/welcome_and_overview.html
@@ -200,7 +200,7 @@ following documentation:
-
Read the Contributing Guide. It is meant
to walk new contributors through the process of developing and submitting a
-change to the Synapse codebase (which is hosted on
+change to the Synapse codebase (which is hosted on
GitHub).
-
@@ -210,9 +210,9 @@ how to lint an
test your code.
-
-
Look at the issue tracker for
+
Look at the issue tracker for
bugs to fix or features to add. If you're new, it may be best to start with
-those labeled good first
+those labeled good first
issue.
-
@@ -228,7 +228,7 @@ do so!
-
And finally, contribute to this documentation! The source for which is
-located here.
+located here.
Reporting a security vulnerability