{"id":23802896,"url":"https://github.com/binaryfields/tour-de-lang","last_synced_at":"2026-02-10T10:37:23.693Z","repository":{"id":54734552,"uuid":"79865512","full_name":"binaryfields/tour-de-lang","owner":"binaryfields","description":"Programming language tour de force, a high level comparison of language features and syntax.","archived":false,"fork":false,"pushed_at":"2024-07-20T19:59:51.000Z","size":34,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-04T14:47:35.252Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/binaryfields.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-01-24T01:04:08.000Z","updated_at":"2022-09-28T12:00:05.000Z","dependencies_parsed_at":"2025-01-01T22:28:33.836Z","dependency_job_id":"158db962-e952-4e95-8161-d3f492c96e7a","html_url":"https://github.com/binaryfields/tour-de-lang","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/binaryfields/tour-de-lang","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binaryfields%2Ftour-de-lang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binaryfields%2Ftour-de-lang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binaryfields%2Ftour-de-lang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binaryfields%2Ftour-de-lang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/binaryfields","download_url":"https://codeload.github.com/binaryfields/tour-de-lang/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binaryfields%2Ftour-de-lang/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268738960,"owners_count":24299558,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-04T02:00:09.867Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-01T22:28:20.595Z","updated_at":"2026-02-10T10:37:18.640Z","avatar_url":"https://github.com/binaryfields.png","language":null,"readme":"# tour-de-lang\n\n## Overview\n\ntoure-de-lang is a point-by-point comparision between 5 modern programming languages. It focuses on main language features as well as a number of library aspects.\n\n## TOC\n\n* Language Basics\n  - Variables\n  - Control Flow\n  - Basic Types\n  - Functions\n  - Classes\n  - Modules\n* Language Advanced\n  - Closures\n  - Generics\n  - Enums\n  - Pattern Matching\n  - Traits\n* Library\n  - Arrays\n  - Collections\n  - Error Handling?\n  - Futures\n  - Json\n  - Strings\n  - Tuples\n  - Testing?\n\n## Language Basics\n\n### Variables\n\n* Scala\n\n``` scala\n  val x = 5\n  val y: Int = 5\n  var z = 5\n```\n\n* Kotlin\n\n``` kotlin\n  val x = 5\n  val y: Int = 5\n  var z = 5\n```\n\n* Rust\n\n``` rust\n  let x = 5;\n  let y: i32 = 5;\n  let mut z = 5;\n```\n\n* Dart\n\n``` dart\n  final x = 5;\n  final int y = 5;\n  var z = 5;\n```\n\n* TypeScript\n\n``` typescript\n  const x = 5;\n  const y: number = 5;\n  let z = 5;\n```\n\n### Control Flow\n\n* Scala\n\n``` scala\n  val max = if (a \u003e b) a else b\n\n  for (item \u003c- collection) {\n    // ...\n  }\n\n  while (!done) {\n    // ...\n  }\n```\n\n* Kotlin\n\n``` kotlin\n  val max = if (a \u003e b) a else b\n\n  for (item in collection) {\n    // ...\n  }\n\n  while (!done) {\n    // ...\n  }\n```\n\n* Rust\n\n``` rust\n  let max = if a \u003e b { a } else { b };\n\n  for item in collection {\n    // ...\n  }\n\n  while !done {\n    // ...\n  }\n```\n\n* Dart\n\n``` dart\n  final max = a \u003e b ? a : b;\n  \n  for (var item in collection) {\n    // ...\n  }      \n\n  while (!done) {\n    // ...\n  }\n```\n\n* TypeScript\n\n``` typescript\n  let max;\n  if (a \u003e b) {\n    max = a;\n  } else {\n    max = b;\n  }\n\n  for (let item in collection) {\n    // ...\n  }\n\n  while (!done) {\n    // ...\n  }\n```\n\n### Basic Types\n\n* Scala\n\n    Byte, Short, Int, Long, Float, Double, Boolean, Char, Unit \n\n* Kotlin\n\n    Byte, Short, Int, Long, Float, Double, Boolean, Char, Unit\n\n* Rust\n\n    i8, i16, i32, i64, u8, u16, u32, u64, isize, usize, f32, f64, bool, char, ()\n\n* Dart\n\n    int, double, bool, String, void\n\n* TypeScript\n\n    number, boolean, string, void\n\n### Functions\n\n* Scala\n\n``` scala\n  def sum(a: Int, b: Int): Int = {\n    a + b\n  }\n```\n\n* Kotlin\n\n``` kotlin\n  fun sum(a: Int, b: Int): Int {\n    return a + b\n  }\n```\n\n* Rust\n\n``` rust\n  fn sum(a: i32, b: i32) -\u003e i32 {\n    a + b\n  }\n```\n\n* Dart\n\n``` dart\n  int sum(int a, int b) {\n    return a + b;\n  }\n```\n\n* TypeScript\n\n``` typescript\n  function sum(a: number, b: number): number {\n    return a + b;\n  }\n```\n\n### Classes\n\n* Scala\n\n``` scala\n  class Circle(val x: Double, val y: Double, val radius: Double) {\n\n    def area(): Double = {\n      Math.PI * (radius * radius)\n    }\n  }\n\n  object Circle {\n    def apply(x: Double, y: Double, radius: Double): Circle = {\n      new Circle(x, y, radius)\n    }\n  }\n```\n\n* Kotlin\n\n``` kotlin\n  class Circle(val x: Double, val y: Double, val radius: Double) {\n    fun area(): Double {\n      return Math.PI * (radius * radius)\n    }\n\n    companion object {\n      fun create(): Circle = Circle(0.0, 0.0, 2.0)\n    }\n  }\n```\n\n* Rust\n\n``` rust\n  struct Circle {\n    x: f64,\n    y: f64,\n    radius: f64,\n  }\n\n  impl Circle {\n    fn new(x: f64, y: f64, radius: f64) -\u003e Circle {\n      Circle {\n        x,\n        y,\n        radius,\n      }\n    }\n\n    fn area(\u0026self) -\u003e f64 {\n      std::f64::consts::PI * (self.radius * self.radius)\n    }\n  }\n```\n\n* Dart\n\n``` dart\n  import 'dart:math' as math;\n\n  class Circle {\n    const Circle(this.x, this.y, this.radius);\n\n    final double x;\n    final double y;\n    final double radius;\n\n    double area() {\n      return math.pi * (radius * radius);\n    }\n  }\n```\n\n* TypeScript\n\n``` typescript\n  class Circle {\n    x: number;\n    y: number;\n    radius: number;\n\n    constructor(x: number, y: number, radius: number) {\n      this.x = x;\n      this.y = y;\n      this.radius = radius;\n    }\n\n    area(): number {\n      return Math.PI * (this.radius * this.radius);\n    }\n  }\n```\n\n### Modules\n\n* Scala\n\n``` scala\n  package io.digitalstream {\n\n    import self.deeply.nested.Utils.{foo =\u003e bar}\n\n    object Modules {\n      def run(): Unit = {\n        bar()\n      }\n    }\n\n    package self.deeply.nested {\n\n      object Utils {\n        def foo(): Unit = {\n          println(\"called `deeply::nested::foo()`\")\n        }\n      }\n\n    }\n\n  }\n```\n\n* Kotlin\n\n``` kotlin\n  package io.digitalstream\n\n  import io.digitalstream.Utils.foo as bar\n\n  object Modules {\n\n    fun run() {\n      bar()\n    }\n  }\n\n  object Utils {\n    fun foo(): Unit {\n      println(\"called `deeply::nested::foo()`\")\n    }\n  }\n```\n\n* Rust\n\n``` rust\n  use self::deeply::nested::foo as bar;\n\n  pub fn run() {\n    bar();\n  }\n\n  mod deeply {\n    pub mod nested {\n      pub fn foo() {\n        println!(\"called `deeply::nested::foo()`\")\n      }\n    }\n  }\n```\n\n* TypeScript\n\n``` typescript\n  export function run(): void {\n    Deeply.Nested.foo();\n  }\n\n  namespace Deeply {\n    export namespace Nested {\n      export function foo() {\n        console.log(\"called `deeply::nested::foo()`\");\n      }\n    }\n  }\n```\n\n## Language Advanced\n\n### Closures\n\n* Scala\n\n``` scala\n  val num = 5\n  val plusNum = (x: Int) =\u003e x + num\n```\n\n* Kotlin\n\n``` kotlin\n  val num = 5\n  val plusNum = { x: Int -\u003e x + num }\n```\n\n* Rust\n\n``` rust\n  let num = 5;\n  let plus_num = |x: i32| x + num;\n```\n\n* Dart\n\n``` dart\n  final n = 5;\n  final plusNum = (int x) =\u003e x + n;\n```\n\n* TypeScript\n\n``` typescript\n  const num = 5;\n  let plus_num = (x: number) =\u003e x + num;\n```\n\n### Generics\n\n* Scala\n\n``` scala\n  class Point[T](val x: T, val y: T) {\n    def swap(): Point[T] = {\n      new Point(y, x)\n    }\n  }\n```\n\n* Kotlin\n\n``` kotlin\n  class Point\u003cT\u003e(val x: T, val y: T) {\n    fun swap(): Point\u003cT\u003e {\n      return Point(y, x)\n    }\n  }\n```\n\n* Rust\n\n``` rust\n  struct Point\u003cT: Clone\u003e {\n    x: T,\n    y: T,\n  }\n\n  impl\u003cT: Clone\u003e Point\u003cT\u003e {\n    fn swap(\u0026self) -\u003e Point\u003cT\u003e {\n      Point { x: self.y.clone(), y: self.x.clone() }\n    }\n  }\n```\n\n* Dart\n\n``` dart\n  class Point\u003cT\u003e {\n    const Point(this.x, this.y);\n\n    final T x;\n    final T y;\n\n    Point\u003cT\u003e swap() {\n      return Point(y, x);\n    }\n  }\n```\n\n* TypeScript\n\n``` typescript\n  class Point\u003cT\u003e {\n    x: T;\n    y: T;\n\n    constructor(x: T, y: T) {\n      this.x = x;\n      this.y = y;\n    }\n\n    swap(): Point\u003cT\u003e {\n      return new Point(this.y, this.x);\n    }\n  }\n```\n\n### Enums\n\n* Scala\n\n``` scala\n  sealed trait Option[+A]\n  case object None extends Option[Nothing]\n  case class Some[+A](get: A) extends Option[A]\n```\n\n* Kotlin\n\n``` kotlin\n  sealed class Option\u003cT\u003e {\n    class None\u003cT\u003e : Option\u003cT\u003e()\n    class Some\u003cT\u003e(val value: T) : Option\u003cT\u003e()\n  }\n```\n\n* Rust\n\n``` rust\n  enum Option\u003cT\u003e {\n    Some(T),\n    None,\n  }\n```\n\n* Dart\n\n``` dart\n  sealed class Option\u003cT\u003e {}\n\n  class Some\u003cT\u003e implements Option\u003cT\u003e {\n    const Some(this.value);\n\n    final T value;\n  }\n\n  class None\u003cT\u003e implements Option\u003cT\u003e {\n    const None();\n  }\n```\n\n* TypeScript\n\n``` typescript\n  class Some\u003cT\u003e {\n    value: T;\n    constructor(value: T) {\n      this.value = value;\n    }\n  }\n\n  class None {}\n\n  type Option\u003cT\u003e = Some\u003cT\u003e | None;\n```\n\n### Pattern Matching\n\n* Scala\n\n``` scala\n  val option = Option(\"string\")\n  option match {\n    case Some(value) =\u003e println(s\"got value: $value\")\n    case None =\u003e println(\"got none\")\n  }\n```\n\n* Kotlin\n\n``` kotlin\n  val option = Option.Some(\"string\")\n  when (option) {\n    is Option.Some -\u003e println(\"got value: ${option.value}\")\n    is Option.None\u003c*\u003e -\u003e println(\"got none\")\n  }\n```\n\n* Rust\n\n``` rust\n  let option = Some(\"string\");\n  match option {\n    Some(value) =\u003e println!(\"got value: {}\", value),\n    None =\u003e println!(\"got none\"),\n  }\n```\n\n* Dart\n\n``` dart\n  final option = Some(\"string\");\n  final _ = switch (option) {\n    Some (value: final value) =\u003e print(\"got value: ${value}\"),\n    None _ =\u003e print(\"got none\"), \n  };\n```\n\n* TypeScript\n\n``` typescript\n  if (option instanceof Option.Some) {\n    console.log(`got value: ${option.value}`);\n  } else if (option instanceof Option.None) {\n    console.log(\"got none\");\n  }\n```\n\n### Traits\n\n* Scala\n\n``` scala\n  trait Similarity {\n    def isSimilar(x: Any): Boolean\n    def isNotSimilar(x: Any): Boolean = !isSimilar(x)\n  }\n```\n\n* Kotlin\n\n``` kotlin\n  interface Similarity {\n    fun isSimilar(x: Any): Boolean\n    fun isNotSimilar(x: Any): Boolean = !isSimilar(x)\n  }\n```\n\n* Rust\n\n``` rust\n  TODO any\n  trait Similarity {\n    fn isSimilar(\u0026self, x: Any) -\u003e bool;\n    fn isNotSimilar(\u0026self, x: Any) -\u003e bool { !isSimilar(x) }\n  }\n```\n\n* Dart\n\n``` dart\n  abstract class Similarity {\n    bool isSimilar(Object x);\n    bool isNotSimilar(Object x) =\u003e !isSimilar(x);\n  }\n```\n\n* TypeScript\n\n``` typescript\n  TODO\n```\n\n## Library\n\n### Arrays\n\n* Scala\n\n``` scala\n  val xs = Array(1, 2, 3)\n  val ys = Array.fill(20)(0)\n  val x = xs(0)\n  val length = xs.length\n```\n\n* Kotlin\n\n``` kotlin\n  val xs = arrayOf(1, 2, 3)\n  val ys = Array(20, { i -\u003e 0 })\n  val x = xs[0]\n  val length = xs.size\n```\n\n* Rust\n\n``` rust\n  let xs = [1, 2, 3];\n  let ys = [0; 20];\n  let x = xs[0];\n  let length = xs.len();\n```\n\n* Dart\n\n``` dart\n  final xs = [1, 2, 3];\n  final ys = List\u003cint\u003e.generate(20, (i) =\u003e 0);\n  final x = xs[0];\n  final length = xs.length;\n```\n\n* TypeScript\n\n``` typescript\n  const xs = [1, 2, 3];\n  const x = xs[0];\n  const length = xs.length;\n```\n\n### Collections\n\n* Scala\n\n``` scala\n  names\n    .filter(_.startsWith(\"a\"))\n    .map(_.toUpperCase())\n    .foreach(println)\n```\n\n* Kotlin\n\n``` kotlin\n  names\n    .filter { it.startsWith(\"a\") }\n    .map(String::toUpperCase)\n    .forEach(::println)\n```\n\n* Rust\n\n``` rust\n  let result = names.iter()\n    .filter(|\u0026it| it.starts_with(\"a\"))\n    .map(|\u0026it| it.to_uppercase());\n  for item in result {\n    println!(\"{}\", item)\n  }\n```\n\n* Dart\n\n``` dart\n  final list = ['apples', 'bananas', 'oranges'];\n  list\n    .where((it) =\u003e it.startsWith(\"a\"))\n    .map((it) =\u003e it.toUpperCase())\n    .forEach((item) =\u003e print(\"$item\"));\n```\n\n* TypeScript\n\n``` typescript\n  names\n    .filter(it =\u003e it.startsWith(\"a\"))\n    .map(it =\u003e it.toUpperCase())\n    .forEach(it =\u003e console.log(it));\n```\n\n### Futures\n\n* Scala\n\n``` scala\n  Promise.successful(\"string\").future\n    .map(_.length)\n    .onComplete {\n      case Success(res) =\u003e println(s\"promise succeeded $res\")\n      case Failure(ex) =\u003e println(s\"promise failed $ex\")\n    }\n```\n\n* Kotlin\n\n``` kotlin\n  CompletableFuture.completedFuture(\"string\")\n    .thenApply { res -\u003e\n      res.length\n    }\n    .whenComplete { res, ex -\u003e\n      if (ex == null) {\n        println(\"promise succeeded $res\")\n      } else {\n        println(\"promise failed $ex\")\n      }\n    }\n```\n\n* Rust\n\n``` rust\n  finished::\u003cString, u32\u003e(\"string\".to_string())\n    .map(|res| res.len())\n    .then(|res| {\n      match res {\n        Ok(res) =\u003e println!(\"promise succeeded {}\", res),\n        Err(ex) =\u003e println!(\"promise failed {}\", ex),\n      }\n      res\n    })\n    .wait();\n```\n\n* Dart\n\n``` dart\n  try {\n    final res = await Future.value(\"string\");\n    print(\"succeeded $res\");\n  } catch (ex) {\n    print(\"failed $ex\");\n  }\n```\n\n* TypeScript\n\n``` typescript\n  let promise = new Promise\u003cstring\u003e((resolve, reject) =\u003e {\n    resolve('string');\n  });\n  promise\n    .then((res) =\u003e {\n      return res.length;\n    })\n    .then((res) =\u003e {\n        console.log(`promise succeeded ${res}`);\n    })\n    .catch((reason) =\u003e {\n        console.log(`promise failed ${reason}`);\n    });\n```\n\n### Json\n\n* Scala\n\n``` scala\n  case class Point(x: Float, y: Float)\n\n  trait PointProtocol extends DefaultJsonProtocol {\n    implicit val pointFormat = jsonFormat2(Point)\n  }\n\n  val point = Point(1.0f, 2.0f)\n  val serialized = pointFormat.write(point);\n  println(s\"serialized = ${serialized.compactPrint}\")\n  val deserialized = pointFormat.read(serialized)\n  println(s\"deserialized = $deserialized\")\n``` \n\n* Kotlin\n\n``` kotlin\n  data class Point(val x: Float, val y: Float)\n\n  val gson = Gson()\n  val point = Point(1.0f, 2.0f)\n  val serialized = gson.toJson(point)\n  println(\"serialized = $serialized\")\n  val deserialized = gson.fromJson\u003cPoint\u003e(serialized)\n  println(\"deserialized = $deserialized\")\n```\n\n* Rust\n\n``` rust\n  #[derive(Serialize, Deserialize, Debug)]\n  struct Point {\n      x: i32,\n      y: i32,\n  }\n\n  let point = Point { x: 1.0, y: 2.0 };\n  let serialized = serde_json::to_string(\u0026point).unwrap();\n  println!(\"serialized = {}\", serialized);\n  let deserialized: Point = serde_json::from_str(\u0026serialized).unwrap();\n  println!(\"deserialized = {:?}\", deserialized);\n```\n\n* Dart\n\n``` dart\n  import 'dart:convert';\n\n  class Point {\n    const Point(this.x, this.y);\n\n    final double x;\n    final double y;\n    \n    factory Point.fromJson(Map\u003cString, dynamic\u003e json) {\n      return Point(\n        x: json['x'],\n        y: json['y'],\n      );\n    }\n\n    Map\u003cString, dynamic\u003e toJson() =\u003e {\n        'x': x,\n        'y': y,\n      };            \n  }\n\n  final point = Point(1.0, 2.0);\n  final serialized = json.encode(point);\n  print(\"serialized = $serialized\");\n  final deserialized = Point.fromJson(json.decode(serialized));\n  print(\"deserialized = $deserialized\");\n``` \n\n* TypeScript\n\n``` typescript\n  interface Point {\n    x: number;\n    y: number;\n  }\n\n  let point: Point = { x: 1.0, y: 2.0};\n  let serialized = JSON.stringify(point);\n  console.log(`serialized = ${serialized}`);\n  let deserialized = JSON.parse(serialized) as Point;\n  console.log(`deserialized = Point(${deserialized.x}, ${deserialized.y})`);\n```\n\n### Strings\n\n* Scala\n\n``` scala\n  val hello = \"Hello \"\n  val world = new String(\"world!\")\n  val helloWorld = hello + world\n  println(helloWorld)\n```\n\n* Kotlin\n\n``` kotlin\n  val hello = \"Hello \"\n  val world = \"world!\".toString()\n  val helloWorld = hello + world\n  println(helloWorld)\n```\n\n* Rust\n\n``` rust\n  let hello = \"Hello \".to_string();\n  let world = \"world!\".to_string();\n  let hello_world = hello + \u0026world;\n  println!(\"{}\", hello_world);\n```\n\n* Dart\n\n``` dart\n  final hello = \"Hello \";\n  final world = \"world!\".toString();\n  final helloWorld = hello + world;\n  print(helloWorld);\n```\n\n* TypeScript\n\n``` typescript\n  const hello = \"Hello \";\n  const world = \"world!\".toString();\n  const helloWorld = hello + world;\n  console.log(helloWorld);\n```\n\n### Tuples\n\n* Scala\n\n``` scala\n  val tuple = (1, \"hello\")\n  val tuple2: Tuple2[Int, String] = (1, \"hello\")\n  println(s\"tuple ${tuple._1}, ${tuple._2}\")\n```\n\n* Kotlin\n\n``` kotlin\n  val tuple = Pair(1, \"hello\")\n  val tuple2: Pair\u003cInt, String\u003e = Pair(1, \"hello\")\n  println(\"tuple ${tuple.first}, ${tuple.second}\")\n```\n\n* Rust\n\n``` rust\n  let tuple = (1, \"hello\");\n  let tuple2: (i32, \u0026str) = (1, \"hello\");\n  println!(\"tuple {}, {}\", tuple.0, tuple.1)\n```\n\n* Dart\n\n``` dart\n  final tuple = [1, \"hello\"];\n  final List\u003cObject\u003e tuple2 = [1, \"hello\"];\n  print(\"tuple ${tuple[0]}, ${tuple[1]}\");\n```\n\n* TypeScript\n\n``` typescript\n  let tuple = [1, \"hello\"];\n  let tuple2: [number, string] = [1, \"hello\"];\n  console.log(`tuple ${tuple[0]}, ${tuple[1]}`);\n```\n\n## Reference\n\n### Dart\n\n- https://dart.dev/guides/language/language-tour\n\n### Kotlin\n\n- https://kotlinlang.org/docs/reference/basic-types.html\n\n### Rust Book\n\n- https://doc.rust-lang.org/book/\n\n### TypeScript\n\n- https://code.visualstudio.com/docs/languages/typescript\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbinaryfields%2Ftour-de-lang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbinaryfields%2Ftour-de-lang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbinaryfields%2Ftour-de-lang/lists"}