Code Monkey home page Code Monkey logo

kibi's Introduction

Kibi: A text editor in ≤1024 lines of code, written in Rust

Build Status Lines of code Crate Minimum rustc version Platform Packaging status Dependency Status License Contributor Covenant Gitpod Ready-to-Code All Contributors

asciicast

A configurable text editor with UTF-8 support, incremental search, syntax highlighting, line numbers and more, written in less than 1024 lines1 of Rust with minimal dependencies.

Kibi is compatible with Linux, macOS, Windows 102, and WASI.

This project is inspired by kilo, a text editor written in C. See comparison below for a list of additional features.

Contributions are welcome! Be careful to stay below the 1024-line limit...

1.: Counted per platform, excluding tests and Clippy directives, see count_loc.sh
2.: Kibi requires the terminal to support ANSI escape sequences. Windows 10 version 1703 (Creators Update, April 2017) and above are supported.

Table of contents

Installation

Packaging status

With cargo

You can install Kibi with cargo:

cargo install kibi

Syntax highlighting configuration files are available in the syntax.d directory of this repository. They need to be placed in one of the configuration directories mentioned in the Configuration/Syntax Highlighting section.

For instance:

cd ~/repos
git clone https://github.com/ilai-deutel/kibi.git
mkdir -p ~/.local/share/kibi/
ln -sr ./kibi/syntax.d ~/.local/share/kibi/syntax.d

Arch User Repository (Arch Linux)

2 packages are available on the AUR: kibi and kibi-git.

Installation instructions
  1. Installation with an AUR helper, for instance using yay:

    yay -Syu kibi  # or yay -Syu kibi-git
  2. Install manually with makepkg:

    git clone https://aur.archlinux.org/kibi.git  # or git clone https://aur.archlinux.org/kibi-git.git
    cd kibi
    makepkg -si

Android (with Termux)

Kibi is available as a Termux package.

Installation instructions
  1. Install Termux:

    Get it on F-Droid" Get it on Google Play"

  2. Install Kibi within Termux: pkg install kibi

Fedora/CentOS

The package is available in COPR as atim/kibi.

Installation instructions
sudo dnf copr enable atim/kibi -y
sudo dnf install kibi

NetBSD

Kibi is available from the official repos.

Installation instructions

Install using:

pkgin install kibi

or build from source:

cd /usr/pkgsrc/editors/kibi
make install

Flatpak

Kibi is available on Flathub.

Command line instructions The flatpak can be installed using:
flatpak install flathub com.github.ilai_deutel.kibi

You can then run Kibi with:

flatpak run com.github.ilai_deutel.kibi

Usage

kibi              # Start an new text buffer
kibi <file path>  # Open a file
kibi --version    # Print version information and exit

Keyboard shortcuts

Keyboard shortcut Description
Ctrl-F Incremental search; use arrows to navigate
Ctrl-S Save the buffer to the current file, or specify the file path
Ctrl-G Go to <line number>[:<column number>] position
Ctrl-Q Quit
Ctrl-D Duplicate the current row
Ctrl-E Execute an external command and paste its output
Ctrl-R Remove an entire line
Ctrl-C Copies the entire line
Ctrl-X Cuts the entire line
Ctrl-V Will paste the copied line
Ctrl-LeftArrow Moves cursor to previous word
Ctrl-RightArrow Moves cursor to next word

Configuration

Global configuration

Kibi can be configured using a configuration file. It must follow this format:

# The size of a tab. Must be > 0.
tab_stop=4
# The number of confirmations needed before quitting, when changes have been
# made since the file was last changed.
quit_times=2
# The duration for which messages are shown in the status bar, in seconds.
message_duration=3
# Whether to show line numbers.
show_line_numbers=true

The location of these files is described below.

Linux / macOS

kibi follows the XDG Base Directory Specification:

  • A user-level configuration file can be located at $XDG_CONFIG_HOME/kibi/config.ini if environment variable $XDG_CONFIG_HOME is defined, ~/.config/kibi/config.ini otherwise.
  • A system-wide configuration file can be located at $XDG_CONFIG_DIRS/kibi/config.ini if environment variable $XDG_CONFIG_DIRS is defined, /etc/kibi/config.ini or /etc/xdg/kibi/config.ini otherwise.
Windows

A configuration file can be located at %APPDATA%\Kibi\config.ini.

Syntax highlighting

Syntax highlighting can be configured using INI files which follow this format:

### /usr/share/kibi/syntax.d/rust.ini ###
# Kibi syntax highlighting configuration for Rust

name=Rust
extensions=rs
highlight_numbers=true
singleline_string_quotes="
singleline_comment_start=//
multiline_comment_delims=/*, */
; In Rust, the multi-line string delimiter is the same as the single-line string
; delimiter
multiline_string_delim="
; https://doc.rust-lang.org/book/appendix-01-keywords.html
keywords_1=abstract, as, async, await, become, box, break, const, continue, crate, do, dyn, else, enum, extern, false, final, fn, for, if, impl, in, let, loop, macro, match, mod, move, mut, override, priv, pub, ref, return, self, Self, static, struct, super, trait, true, try, type, typeof, unsafe, unsized, use, virtual, where, while, yield
keywords_2=i8, i16, i32, i64, i128, isize, u8, u16, u32, u36, u128, usize, f32, f64, bool, char, str

The location of these files is described below.

Linux / macOS

kibi follows the XDG Base Directory Specification:

  • User-level syntax highlighting configuration files can be located at $XDG_DATA_HOME/kibi/syntax.d/<file_name>.ini if environment variable $XDG_DATA_HOME is defined, ~/.local/share/kibi/syntax.d/<file_name>.ini otherwise.
  • System-wide syntax highlighting configuration files can be located at $XDG_DATA_DIRS/kibi/syntax.d/<file_name>.ini if environment variable $XDG_DATA_DIRS is defined, /usr/local/share/kibi/syntax.d/<file_name>.ini or /usr/share/kibi/syntax.d/<file_name>.ini otherwise.
Windows

Syntax highlighting configuration files can be located at %APPDATA%\Kibi\syntax.d\<file_name>.ini.

Comparison with kilo

This project is inspired by kilo, a text editor written by Salvatore Sanfilippo (antirez) in C, and this tutorial (also in C).

kibi provides additional features:

  • Support for UTF-8 characters
  • Compatibility with Windows
  • Command to jump to a given row/column
  • Handle window resize (UNIX only)
  • Parsing configuration files: global editor configuration, language-specific syntax highlighting configuration (38 languages and counting)
  • Display line numbers on the left of the screen; display file size in the status bar
  • Syntax highlighting: multi-line strings
  • Save as prompt when no file name has been provided
  • Command to duplicate the current row, to quickly move between words
  • Ability to execute an external command from the editor and paste its output
  • Memory safety, thanks to Rust!
  • Many bug fixes

Dependencies

This project must remain tiny, so using advanced dependencies such as ncurses, toml or ansi-escapes would be cheating.

The following dependencies provide wrappers around system calls.

  • On UNIX systems (Linux, macOS):
    • libc
  • On Windows:
    • winapi
    • winapi-util

In addition, unicode-width is used to determine the displayed width of Unicode characters. Unfortunately, there is no way around it: the unicode character width table is 230 lines long.

Why Kibi?

  1. Porting the kilo source code from C to Rust and trying to make it idiomatic was interesting
  2. Implementing new features while under the 1024-line constraint is a good challenge
  3. Most importantly, I wanted to learn Rust and this was a great project to start (thanks Reddit for the idea)

Contributors

This project follows the all-contributors specification (emoji key). Contributions of any kind welcome!


Ilaï Deutel

💻 🤔 🚇 📦 💠

Vishal Anand

🐛

Gurjus Bhasin

🤔

Libin Dang

💻 🐛

Isaac Andrade

🤔

frjol

🐛

Artem Polishchuk

📦

Marco A L Barbosa

💻

pin

📦

Uniminin

💠

Woomy4680-exe

🐛

quadroli

💠

molese

💠

Jorge Reyes

💻

Giancarlo França

⚠️

Andrea Manzini

💻 ⚠️

Maxime Bouillot

💠

Johnathan Sharratt

💻

No-one-important

💻

Robert Grancsa

💻

SoGreatAndPowerful

💠

Mihai-Carol Bazga

💻

Nick Webster

💻

Zhizhen He

📖

CosminGGeorgescu

💻

Tanvir

💠

Prisacaru Bogdan-Paul

⚠️

auzkok

💠

License

This project is licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Kibi by you shall be dual licensed as above, without any additional terms or conditions.

kibi's People

Contributors

allcontributors[bot] avatar arkaeriit avatar auzkok avatar bogdanpaul15 avatar cosminggeorgescu avatar dependabot-preview[bot] avatar dependabot[bot] avatar eusuntcarol avatar gvirtu avatar hezhizhen avatar ilai-deutel avatar ilmanzo avatar imreyesjorge avatar john-sharratt avatar ldang0 avatar loannaflip avatar malbarbo avatar no-one-important avatar quadroli avatar razvanrus2003 avatar robertgrancsa avatar tim77 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kibi's Issues

New release

Hi! I'm looking into packaging kibi for Gentoo Linux, and I noticed v0.2.2 was released quite some time ago (2021) and many commits have been made since then

Could you consider tagging a new release? Thanks!

Here's a mock-up of what I have so far if you are interested:

# Copyright 2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

# Auto-Generated by cargo-ebuild 0.5.4-r1

EAPI=8

CRATES="
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
	[email protected]
"

inherit cargo

DESCRIPTION="A text editor in less than 1024 lines of code with syntax highlighting, search and more."
# Double check the homepage as the cargo_metadata crate
# does not provide this value so instead repository is used
HOMEPAGE="https://github.com/ilai-deutel/kibi"
SRC_URI="${CARGO_CRATE_URIS}"

# License set may be more restrictive as OR is not respected
# use cargo-license for a more accurate license picture
LICENSE="Apache-2.0 Apache-2.0-with-LLVM-exceptions MIT Unicode-DFS-2016 Unlicense"
SLOT="0"
KEYWORDS="~amd64"

DEPEND=""
RDEPEND="${DEPEND}"
BDEPEND=""

# rust does not use *FLAGS from make.conf, silence portage warning
# update with proper path to binaries this crate installs, omit leading /
QA_FLAGS_IGNORED="usr/bin/${PN}"

Support UTF-8 display

UTF-8 characters are correctly loaded / saved, but not correctly displayed.

Expected:

🇬🇧 The quick brown fox jumps over the lazy dog 
🇫🇷 Voix ambiguë d'un cœur qui, au zéphyr, préfère les jattes de kiwis.

Actual:

ð¬ð§ The quick brown fox jumps over the lazy dog 
ð«ð· Voix ambiguë d'un cÃÂur qui, au zéphyr, préfère les jattes de kiwis.

Setup a CI pipeline

  • Build (Linux, OSX; stable, beta, nightly)
  • Style checks
    • rustfmt
    • cargo-clippy
  • Dependency audit with cargo-audit

Allow UTF-8 characters in FIND/SAVE prompt

The editor supports UTF-8 characters, but they are not accepted for prompts (search for a query that contains non-ASCII characters, enter a file name that contains non-ASCII characters).

Windows 10 powershell or cmd Could not obtain cursor position

Since update #9 and #26 were resolved, I wanted to test with the lastest version.

I did cargo install --git https://github.com/ilai-deutel/kibi.git

Doing the command kibi in both cmd or powershell results in the same error.
It freezes on this.

D:\>kibi
�[999C�[999B�[6n

Then doing Ctrl+C

D:\>kibi
�[999C�[999B�[6n�[2J�[HError: Could not obtain cursor position

Fix tests on WASI platform

Currently, tests fail on WASI, likely due to WebAssembly/WASI#306:

$ cargo wasi test
running 9 tests
test config::tests::ini_processing_error_propagation ... Error: failed to run main module `.../target/wasm32-wasi/debug/deps/kibi-0e014d2d22062c7e.wasm`

Caused by:
    0: failed to invoke command default
    1: wasm trap: wasm `unreachable` instruction executed
       wasm backtrace:
           0: 0xaf1d7 - <unknown>!__rust_start_panic
           1: 0x8a2d3 - <unknown>!rust_panic
           2: 0x410bc - <unknown>!std::panicking::rust_panic_with_hook::h5cd357190ec2dc27
           3: 0xace7d - <unknown>!std::panicking::begin_panic::{{closure}}::h2b921c6015217a8c
           4: 0xaea75 - <unknown>!std::sys_common::backtrace::__rust_end_short_backtrace::h7804c064a89e5468
           5: 0xad127 - <unknown>!std::panicking::begin_panic::h74bbbdc216a2be15
           6: 0xaed39 - <unknown>!std::sys::wasi::os::temp_dir::h7c1705b1d80bf88f
           7: 0xaf0c4 - <unknown>!std::env::temp_dir::h8de49376550872b5
           8: 0xa3189 - <unknown>!tempfile::Builder::tempdir::he99c51adad158d09
           9: 0xa0aa1 - <unknown>!tempfile::dir::TempDir::new::h467eed705bdbfad5
          10: 0x64c6b - <unknown>!kibi::config::tests::ini_processing_helper::h04a043013200609f
          11: 0x43ad2 - <unknown>!kibi::config::tests::ini_processing_error_propagation::hd9e29b0360fe1c0e
          12: 0xaa1be - <unknown>!kibi::config::tests::ini_processing_error_propagation::{{closure}}::hd20dc0108869c254
          13: 0xab2e1 - <unknown>!core::ops::function::FnOnce::call_once::h470aa8b99eb85c41
          14: 0xaf0b7 - <unknown>!test::__rust_begin_short_backtrace::hdb236f9e8ab372e2
          15: 0xaf032 - <unknown>!core::ops::function::FnOnce::call_once{{vtable.shim}}::h46e94de7b5f8562e
          16: 0x20873 - <unknown>!test::run_test::run_test_inner::hb0fda869795a04b5
          17: 0x1f050 - <unknown>!test::run_test::h5e16ffceb7355d13
          18: 0x4765 - <unknown>!test::console::run_tests_console::hbd9d6e4ac7994c7e
          19: 0x21c76 - <unknown>!test::test_main::ha1139bbdf0c18c77
          20: 0x7fb9b - <unknown>!test::test_main_static::h88b81b227e6e27db
          21: 0xae6bf - <unknown>!kibi::main::hcb06a8996b2c438e
          22: 0xaa3cc - <unknown>!core::ops::function::FnOnce::call_once::hb9394b846f8ebed8
          23: 0xa9ac3 - <unknown>!std::sys_common::backtrace::__rust_begin_short_backtrace::ha02a7b57bbe40130
          24: 0xa6e84 - <unknown>!std::rt::lang_start::{{closure}}::h3ed9764642bc7713
          25: 0x728f3 - <unknown>!std::rt::lang_start_internal::h114e06638993fc12
          26: 0x92ab7 - <unknown>!std::rt::lang_start::hefbdca51d9ded6ce
          27: 0xae610 - <unknown>!__original_main
          28: 0xae96a - <unknown>!_start
          29: 0xaf0a3 - <unknown>!_start.command_export
       note: using the `WASMTIME_BACKTRACE_DETAILS=1` environment variable to may show more debugging information

Quick remove a line

I f duplicated a line by accident or not wanting an entire line, there should be a feature for removing the unwanted line. #114

Keep shortcut help visible

Is your feature request related to a problem? Please describe.
Hi, after using a feature (like search) the bottom line with the shortcut hints goes away. I would find it useful if the shortcuts stayed visible, otherwise I have to keep closing/re-opening while I'm still learning the shortcuts.

I'm happy to submit a PR to add this if it's wanted.

Tiling and Inbuilt Terminal

This seems like an awesome project, I might even switch from my current editor, Micro!
However these features are essential to my workflow :p

Find within row.chars, not row.render

Ctrl-F should search for a string in row.chars, not row.render.

For instance, a tab character should not be matched when a space is queried. Currently, a tab character is rendered as one or several spaces, so it will be matched.

Kibi on Termux fails to start

Describe the bug
When I start kibi on termux, i returns a "Permission Denied" error (as you can see in the sreenshot )
Note: I have all permissions required to edit the file.

To Reproduce
Use pkg install kibi and try to open a file. Note: same error is given if kibi is installed with cargo install kibi

Expected behavior
Open editor and start editing the file

Screenshots

System information:

  • OS: Termux (nonroot)
  • Rust version: 1.49
  • Kibi version : V0.2.1

Thanks for this really good work, Woomy

CI: 'rustfmt' unavailable for download with latest nightly

See Job #92.8:

$ rustup component add rustfmt
error: component 'rustfmt' for target 'x86_64-unknown-linux-gnu' is unavailable for download for channel nightly
Sometimes not all components are available in any given nightly.
The command "rustup component add rustfmt" failed and exited with 1 during .

win10,config.ini and Syntax highlighting do not take effect

Describe the bug

i install the kibi via command --cargo install kibi.

my os is win10,and i put config files at the location of "C:\Users\Administrator\AppData\Kibi\syntax.d" which is according to the guide(A configuration file can be located at %APPDATA%\Kibi\config.ini.).

but when i open the build.rs ,the Syntax highlighting does not take effect.

To Reproduce

222

Expected behavior

Screenshots

1

System information:

  • OS: win10
  • Rust version (output of rustc --version):rustc 1.68.2 (9eb3afe9e 2023-03-27)
  • Kibi version (output of kibi --version):v0.2.2

Additional context

Consider implementing undo/redo

Maintaining a history of commands and being able to apply/revert them could be a substantial change. Investigate whether it is possible without going over the line constraint.

Make kibi compatible with Windows 10

Hi,
I am trying to build kibi for Windows 10 but it fails with compilation errors.
Can you please help.

Rust Info

  • cargo 1.43.0-nightly (3c53211c3 2020-02-07)
  • rustc 1.43.0-nightly (e620d0f33 2020-02-18)

Windows Info

OS Name: Microsoft Windows 10 Enterprise
OS Version: 10.0.19041 N/A Build 19041
OS Manufacturer: Microsoft Corporation
OS Configuration: Standalone Workstation

Compiler output

$ cargo build --release --locked --all-features

   Compiling kibi v0.1.2 (C:\Users\vanand\kibi\kibi)
error[E0433]: failed to resolve: could not find `sys` in `nix`
 --> src\editor.rs:6:10
  |
6 | use nix::sys::termios::Termios;
  |          ^^^ could not find `sys` in `nix`

error[E0432]: unresolved imports `signal_hook::iterator`, `signal_hook::SIGWINCH`
 --> src\editor.rs:7:19
  |
7 | use signal_hook::{iterator::Signals, SIGWINCH};
  |                   ^^^^^^^^           ^^^^^^^^ no `SIGWINCH` in the root
  |                   |
  |                   could not find `iterator` in `signal_hook`

error[E0432]: unresolved imports `libc::STDIN_FILENO`, `libc::STDOUT_FILENO`, `libc::TIOCGWINSZ`, `libc::VMIN`, `libc::VTIME`
 --> src\terminal.rs:3:12
  |
3 | use libc::{STDIN_FILENO, STDOUT_FILENO, TIOCGWINSZ, VMIN, VTIME};
  |            ^^^^^^^^^^^^  ^^^^^^^^^^^^^  ^^^^^^^^^^  ^^^^  ^^^^^
  |            |             |              |           |     |
  |            |             |              |           |     no `VTIME` in the root
  |            |             |              |           |     help: a similar name exists in the module: `ETIME`
  |            |             |              |           no `VMIN` in the root
  |            |             |              no `TIOCGWINSZ` in the root
  |            |             no `STDOUT_FILENO` in the root
  |            no `STDIN_FILENO` in the root

error[E0432]: unresolved imports `nix::pty`, `nix::sys`
 --> src\terminal.rs:4:11
  |
4 | use nix::{pty::Winsize, sys::termios};
  |           ^^^           ^^^ could not find `sys` in `nix`
  |           |
  |           could not find `pty` in `nix`

error[E0433]: failed to resolve: could not find `ioctl_read_bad` in `nix`
  --> src\terminal.rs:35:10
   |
35 |     nix::ioctl_read_bad!(get_ws, TIOCGWINSZ, Winsize);
   |          ^^^^^^^^^^^^^^ could not find `ioctl_read_bad` in `nix`

error[E0412]: cannot find type `Termios` in this scope
   --> src\editor.rs:109:19
    |
109 |     orig_termios: Termios,
    |                   ^^^^^^^ not found in this scope

error[E0412]: cannot find type `Error` in crate `nix`
 --> src\error.rs:8:14
  |
8 |     Nix(nix::Error),
  |              ^^^^^ not found in `nix`
  |
help: possible candidates are found in other modules, you can import them into scope
  |
3 | use core::fmt::Error;
  |
3 | use crate::error::Error;
  |
3 | use std::error::Error;
  |
3 | use std::fmt::Error;
  |
    and 1 other candidate

error[E0412]: cannot find type `Error` in crate `nix`
  --> src\error.rs:33:16
   |
33 | impl From<nix::Error> for Error {
   |                ^^^^^ not found in `nix`
   |
help: possible candidates are found in other modules, you can import them into scope
   |
3  | use core::fmt::Error;
   |
3  | use crate::error::Error;
   |
3  | use std::error::Error;
   |
3  | use std::fmt::Error;
   |
     and 1 other candidate

error[E0412]: cannot find type `Error` in crate `nix`
  --> src\error.rs:35:23
   |
35 |     fn from(err: nix::Error) -> Self { Self::Nix(err) }
   |                       ^^^^^ not found in `nix`
   |
help: possible candidates are found in other modules, you can import them into scope
   |
3  | use core::fmt::Error;
   |
3  | use crate::error::Error;
   |
3  | use std::error::Error;
   |
3  | use std::fmt::Error;
   |
     and 1 other candidate

error[E0412]: cannot find type `Error` in crate `nix`
 --> src\terminal.rs:8:71
  |
8 | pub(crate) fn set_termios(term: &termios::Termios) -> Result<(), nix::Error> {
  |                                                                       ^^^^^ not found in `nix`
  |
help: possible candidates are found in other modules, you can import them into scope
  |
1 | use core::fmt::Error;
  |
1 | use crate::error::Error;
  |
1 | use std::error::Error;
  |
1 | use std::fmt::Error;
  |
    and 1 other candidate

error[E0425]: cannot find function `get_ws` in this scope
  --> src\terminal.rs:43:14
   |
43 |     unsafe { get_ws(STDOUT_FILENO, maybe_ws.as_mut_ptr()).ok().map(|_| maybe_ws.assume_init()) }
   |              ^^^^^^ not found in this scope

error: aborting due to 11 previous errors

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.