<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ali Aygör</title>
    <description>The latest articles on DEV Community by Ali Aygör (@aliaygor).</description>
    <link>https://dev.to/aliaygor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3935601%2F39c125e3-4b3b-48bb-a705-1cde6f956900.jpg</url>
      <title>DEV Community: Ali Aygör</title>
      <link>https://dev.to/aliaygor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aliaygor"/>
    <language>en</language>
    <item>
      <title>6 debugging checks for JSON, JWT, SQL, regex, timestamps and URLs</title>
      <dc:creator>Ali Aygör</dc:creator>
      <pubDate>Fri, 09 Oct 2026 22:18:31 +0000</pubDate>
      <link>https://dev.to/aliaygor/6-debugging-checks-for-json-jwt-sql-regex-timestamps-and-urls-bhm</link>
      <guid>https://dev.to/aliaygor/6-debugging-checks-for-json-jwt-sql-regex-timestamps-and-urls-bhm</guid>
      <description>&lt;p&gt;An API failure is often easier to investigate when you separate six questions: what did the response contain, what does the token prove, which date are you reading, what does the query actually return, what does the pattern match, and what will the generated request send?&lt;/p&gt;

&lt;p&gt;The examples below are synthetic. You can reproduce them locally without an account, a real credential or a running API.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Valid JSON can still have the wrong shape
&lt;/h2&gt;

&lt;p&gt;The first response below is an object. The second is a JSON string containing the serialized representation of an object. Both are valid JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;objectText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wrappedText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;objectText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;objectValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;objectText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stringValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wrappedText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;objectValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// object&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;stringValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// string&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stringValue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Formatting checks readability; syntax validation checks whether the text parses; schema validation checks the resulting value against a contract. Those are different operations.&lt;/p&gt;

&lt;p&gt;If your client expects an object, confirm that it is neither &lt;code&gt;null&lt;/code&gt; nor an array. Parse a second time only if the API contract specifies an encoded string. Removing every backslash is not a reliable repair: backslashes can be legitimate string content.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A decoded JWT is evidence, not authentication
&lt;/h2&gt;

&lt;p&gt;Reading JWT claims does not verify the signature, issuer, audience or authorization rules. Even an unexpired token can be forged, intended for another service or revoked.&lt;/p&gt;

&lt;p&gt;JWT NumericDate values use seconds. JavaScript dates use milliseconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;claims&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;aud&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;api&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reports&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1700000000&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exp&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// 2023-11-14T22:13:20.000Z&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The audience can also be an array. A decoder that assumes every &lt;code&gt;aud&lt;/code&gt; value is a string can misrepresent an otherwise legitimate claim set.&lt;/p&gt;

&lt;p&gt;Use a synthetic token for inspection. Your server must verify the token with its trusted keys and configured validation rules. A browser decoder should never label a token authentic just because its payload is readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A timestamp can be correct and still be interpreted incorrectly
&lt;/h2&gt;

&lt;p&gt;If an event appears in 1970, first check the unit before changing a timezone setting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1700000000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// 1970-01-20T16:13:20.000Z: interpreted as milliseconds&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1700000000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// 2023-11-14T22:13:20.000Z: seconds converted to milliseconds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the original value, its documented unit and the UTC representation together. Digit count is a useful hint, not a universal contract. Local-time displays also depend on the viewer's timezone, so compare UTC values when connecting events from different systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Pretty SQL can reveal an unintended join
&lt;/h2&gt;

&lt;p&gt;Consider a report intended to retain every customer and attach a pending order when present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an unmatched customer, &lt;code&gt;o.status&lt;/code&gt; is null. The &lt;code&gt;WHERE&lt;/code&gt; predicate therefore removes that customer. If you intend to retain every customer while matching only pending orders, move that condition into the join:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;
  &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These queries express different results. Test a customer with no orders, one with only a completed order, and one with a pending order. Formatting helps expose the distinction; it cannot certify performance. Use the database's execution plan with representative data for that separate question.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Regex flags change the answer
&lt;/h2&gt;

&lt;p&gt;Testing one positive example can hide an anchoring or flag problem. Start with multiple matches and a counterexample:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ORDER-123 noop ORDER-456 ORDER-ABC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/ORDER-&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// first match: ORDER-123&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/ORDER-&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;+/g&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// ["ORDER-123", "ORDER-456"]&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^ORDER-&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prefix ORDER-123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// false: whole-string validation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript and other regex engines do not support exactly the same syntax. Check the target engine and escaping rules before copying a pattern into another language. Expensive expressions can also stall a browser tab; a worker with an execution limit is useful for a tester, but not a substitute for reviewing production patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Query decoding must preserve repeated values
&lt;/h2&gt;

&lt;p&gt;An encoded plus sign and a literal plus sign are not interchangeable in form-style query parsing. Repeated parameters also matter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/search?tag=api&amp;amp;tag=java&amp;amp;q=C%2B%2B#section&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// ["api", "java"]&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;q&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;      &lt;span class="c1"&gt;// C++&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;q=C++&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;q&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// C followed by two spaces&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fragment is not part of the query sent to the server. When rebuilding a request, preserve repeated values unless the API explicitly requires a single value. Converting the parameters straight into a plain object can discard duplicates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep a small investigation record
&lt;/h2&gt;

&lt;p&gt;For each check, retain the redacted input, expected result, actual result, selected options and environment. That makes the observation reproducible rather than dependent on whichever tool happens to look convincing.&lt;/p&gt;

&lt;p&gt;For copyable inputs with expected outputs, use the &lt;a href="https://gist.github.com/aliaygor/8282a6b71323696739b024c7276afb00" rel="noopener noreferrer"&gt;synthetic fixture pack&lt;/a&gt;. It also includes Base64 decoding and a local check script. The unsigned JWT is an expired inspection example, not an authentication credential.&lt;/p&gt;

&lt;p&gt;Disclosure: I maintain &lt;a href="https://www.developerdebugtools.com/tools?utm_source=devto&amp;amp;utm_medium=community&amp;amp;utm_campaign=six_debugging_checks" rel="noopener noreferrer"&gt;Developer Debug Tools&lt;/a&gt;, a free collection covering these workflows plus SQL formatting, request generation, JSON Schema, Java stacktraces and OpenAPI comparison. Core tool processing runs in the browser; hosting and optional analytics/advertising are separate services.&lt;/p&gt;

&lt;p&gt;This article was prepared with AI assistance; its JavaScript examples and SQL join fixture were checked locally.&lt;/p&gt;

&lt;p&gt;References: &lt;a href="https://www.rfc-editor.org/rfc/rfc8259" rel="noopener noreferrer"&gt;JSON specification&lt;/a&gt;, &lt;a href="https://www.rfc-editor.org/rfc/rfc7519" rel="noopener noreferrer"&gt;JWT specification&lt;/a&gt;, &lt;a href="https://www.postgresql.org/docs/current/queries-table-expressions.html" rel="noopener noreferrer"&gt;PostgreSQL join semantics&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match" rel="noopener noreferrer"&gt;JavaScript match&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams" rel="noopener noreferrer"&gt;URLSearchParams&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>debugging</category>
      <category>api</category>
    </item>
    <item>
      <title>10 Free Browser Tools Every Backend Developer Should Bookmark</title>
      <dc:creator>Ali Aygör</dc:creator>
      <pubDate>Sun, 07 Jun 2026 20:43:00 +0000</pubDate>
      <link>https://dev.to/aliaygor/10-free-browser-tools-every-backend-developer-should-bookmark-163e</link>
      <guid>https://dev.to/aliaygor/10-free-browser-tools-every-backend-developer-should-bookmark-163e</guid>
      <description>&lt;p&gt;As a backend developer, I constantly switch between small utility websites.&lt;/p&gt;

&lt;p&gt;Formatting JSON, decoding JWTs, testing regex patterns, converting timestamps...&lt;/p&gt;

&lt;p&gt;After years of using the same tools, here are the 10 browser-based utilities I use most often.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. JSON Formatter
&lt;/h2&gt;

&lt;p&gt;Still my most used tool. Essential for API debugging and log inspection.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. JWT Decoder
&lt;/h2&gt;

&lt;p&gt;Quickly inspect claims, expiration dates and payload data without writing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. SQL Formatter
&lt;/h2&gt;

&lt;p&gt;Makes large SQL queries much easier to read and review.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Regex Tester
&lt;/h2&gt;

&lt;p&gt;Perfect for validating patterns before putting them into code.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Timestamp Converter
&lt;/h2&gt;

&lt;p&gt;A daily tool when investigating logs and production issues.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built My Own Toolkit
&lt;/h2&gt;

&lt;p&gt;Switching between 10 different websites became annoying.&lt;/p&gt;

&lt;p&gt;So I built a free browser-based toolkit that brings these utilities together in one place:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developerdebugtools.com" rel="noopener noreferrer"&gt;https://developerdebugtools.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No signup. No installation. Just open and use.&lt;/p&gt;

&lt;p&gt;What browser-based tool do you use most often?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>java</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a free browser-based developer debugging toolkit</title>
      <dc:creator>Ali Aygör</dc:creator>
      <pubDate>Sat, 16 May 2026 23:10:49 +0000</pubDate>
      <link>https://dev.to/aliaygor/i-built-a-free-browser-based-developer-debugging-toolkit-3eai</link>
      <guid>https://dev.to/aliaygor/i-built-a-free-browser-based-developer-debugging-toolkit-3eai</guid>
      <description>&lt;p&gt;As a backend developer, I kept wasting time switching between random tools for JSON formatting, JWT decoding, regex testing, SQL formatting, Base64 encoding, timestamps, API debugging, and log inspection.&lt;/p&gt;

&lt;p&gt;So I built my own browser-based toolkit that brings these practical tools together in one place:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developerdebugtools.com" rel="noopener noreferrer"&gt;https://developerdebugtools.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s completely free, no signup required, and focused on actual developer workflows.&lt;/p&gt;

&lt;p&gt;Would love honest feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What tools am I missing?&lt;/li&gt;
&lt;li&gt;What would make this worth bookmarking?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
